线性布局的每一列只能放置一个组件,且组件超出了屏幕内容不会换行
可设定的属性:
orientation:布局内元素的排列方式,horizontal横排(默认),vertical竖排
gravity:布局内元素的位置,可以使用 | 连接,有top,bottom,left,right属性
layout_width和layout_height:布局的宽度和高度,有match_parent=fill_parent最大,wrap_content布局内元素的最大
id:唯一标识
background:背景颜色,可以使用@来引用,也可以直接使用十六进制
2.表格布局TableLayout表格布局继承了线性布局
先看代码和效果
具体说下里面的属性
在TableLayout的大标签下面,每一个TableRow代表一行,gravity表示为内部这几个row的位置
stretchColumns表示需要在哪些位置伸展为空的内容,这里写的0、3,即为数组的1和4的位置为空,即红框这一部分
测试之后发现其实使用gravity=center的属性可以替代拉伸
EditText里可以用inputType属性来更改输入的文本类型
3.帧布局管理器frameLayout帧布局就是指将屏幕分为一个个空白的区域,每一个区域为一帧,默认从左上角开始,且后面的组件会覆盖掉之前的组件
foreground设置前景图像的属性,foregroundGravity前景图像的位置
其中layout_gravity表示的是容器本身位于父容器的位置,可用 | 连接
效果如下
4.相对布局RelativeLayout基本属性:
gravity设置容器内组件的对齐方式,
ignoreGravity设置该属性为true的组件不受gravity属性的影响
根据父容器定位:
layout_alignParentLeft的属性为true表示左对齐父容器,还有Right,Top,Bottom,
android:layout_centerHorizontal为true表示在父容器中水平居中,还有Vertical垂直居中,以及InParent居中
根据兄弟容器定位:
layout_toLeftOf设定id属性即放在这个id对象的左边,同类型的还有layout_toRightOf,layout_above,layout_below,效果如下
layout_alignLeft即和该参考组件的左边界对其,同类型还有layout_alignBottom,layout_alignLeft,layout_alignRight,效果如下
margin设置偏移量,指和父容器的偏移量,有layout_marginLeft/Right/Top/Bottom,也可以设置layout_margin来同时控制四个偏移量
padding设置填充,主要设置组件内元素的填充亮,比如TextView中文字的具体位置,paddingLeft/Right/Top/Bottom以及android:padding同时设置四个位置
二、基本组件 1.文本框与编辑框TextView EditViewEditView是TextView的子类,所以拥有它的所有方法
需要注意的是输入类型和是否单行输入
2.按钮Button最主要的就是onClick方法,可以同各国两种方式实现,一种是在onCreate中设置setonClickListener(new View.onClickListener()来实现,另一种是在xml里写onclick属性,在Activity类中直接写该方法,下面实现了一下登陆验证的 *** 作
xml如下
java代码如下
package com.thundersoft.test; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.Nullable; import com.thundersoft.myapplication.R; public class ButtonActivity extends Activity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.button); EditText user = findViewById(R.id.user); EditText pwd = findViewById(R.id.pwd); EditText pwdc = findViewById(R.id.pwdc); TextView info = findViewById(R.id.info); String pwds = pwd.getText().toString(); String pwdcs = pwdc.getText().toString(); Button reg = findViewById(R.id.reg); Button re = findViewById(R.id.re); re.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { info.setText(""); user.setText(""); pwd.setText(""); pwdc.setText(""); } }); reg.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // pwds.equals(pwdcs)==false竟然判断不出来 if (!pwds.equals(pwdcs)){ info.setText("密码不一致"); } else { Toast t = Toast.makeText(ButtonActivity.this, "注册成功", Toast.LENGTH_SHORT); t.show(); } } }); } }3.单选按钮RaidoButton
RaidoButton需要在RadioGroup中使用
java代码如下
package com.thundersoft.test; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.Toast; import androidx.annotation.Nullable; import com.thundersoft.myapplication.R; public class RadioActivity extends Activity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.radiobutton); RadioGroup group = findViewById(R.id.group); group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { RadioButton button = findViewById(checkedId); Toast toast = Toast.makeText(RadioActivity.this, button.getText() + "被点击", Toast.LENGTH_SHORT); toast.show(); } }); Button submit = findViewById(R.id.submit); submit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { for (int i = 0; i < group.getChildCount(); i++) { RadioButton childAt = (RadioButton) group.getChildAt(i); if (childAt.isChecked()){ Toast toast = Toast.makeText(RadioActivity.this, childAt.getText() + "确定", Toast.LENGTH_SHORT); toast.show(); } } } }); } }
java中,通过找到组的id,通过组的getChildCount方法,通过循环,对radio的下标进行选定
4.复选框CheckBox因为checkbox的监听因素,需要创建一个单独的监听器对象,传入多个监听器中
private CompoundButton.OnCheckedChangeListener listener = new CompoundButton.OnCheckedChangeListener(){ @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked){ Toast toast = Toast.makeText(RadioActivity.this, "选中了"+buttonView.getText().toString(), Toast.LENGTH_SHORT); toast.show(); } } };
CheckBox c1 = findViewById(R.id.c1); CheckBox c2 = findViewById(R.id.c2); CheckBox c3 = findViewById(R.id.c3); c1.setOnCheckedChangeListener(listener); c2.setOnCheckedChangeListener(listener); c3.setOnCheckedChangeListener(listener);
这样可以简化代码
点击获取如下
Button button = findViewById(R.id.submit1); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String answer = ""; if(c1.isChecked()) answer += c1.getText().toString() + " "; if(c2.isChecked()) answer += c2.getText().toString() + " "; if(c3.isChecked()) answer += c3.getText().toString() + " "; Toast toast = Toast.makeText(RadioActivity.this, "选中"+answer, Toast.LENGTH_SHORT); toast.show(); } });5.图像视图ImageView
图象视图有几个重要的属性
android:adjustViewBounds用于设置ImageView是否调整自己的边界来保持所显示图片的宽高比,也就是以图片为主
android:maxHeight/Width需要设置上一个属性为true才能指定最大值
android:scaleType属性有以下显示
matrix以matrix的方式缩放
fitXY以ImageView的尺寸为主
fitStar/fitCenter/fitEnd保持图片纵横比,知道图片能完全显示
center/centerCrop/centerInside放在正中间/保持纵横比并完全覆盖/保持纵横比并完全显示
tint染色
6.列表选择框spinner在xml中新建spinner标签
可以指定strings中的内容放入spinner中
- 学生
- 老师
- 保安
- 食堂阿姨
- 领导
java代码如下
package com.thundersoft.test; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.Spinner; import android.widget.Toast; import androidx.annotation.Nullable; import com.thundersoft.myapplication.R; public class SpinnerActivity extends Activity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.spinner); Spinner spinner = findViewById(R.id.spinner); spinner.getSelectedItem(); spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView> parent, View view, int position, long id) { String s = parent.getItemAtPosition(position).toString(); Toast.makeText(SpinnerActivity.this,s,Toast.LENGTH_SHORT).show(); } @Override public void onNothingSelected(AdapterView> parent) { } }); } }
java通过选择监听器来监听选择的元素
parent.getItemAtPosition(position).toString();
很多情况下不能从strings中获得内容,我们需要把获取到的内容放在java中存储
通过适配器来实现功能,使用方法如下
package com.thundersoft.test; import android.app.Activity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.LinearLayout; import android.widget.Spinner; import androidx.annotation.Nullable; import com.thundersoft.myapplication.R; public class Spinner2Activity extends Activity { String[] strings = new String[]{"学生","老师","领导"}; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout linearLayout = new LinearLayout(Spinner2Activity.this); setContentView(linearLayout); Spinner spinner = new Spinner(Spinner2Activity.this); ArrayAdapter7.列表视图ListViewobjectArrayAdapter = new ArrayAdapter (this, android.R.layout.simple_spinner_item,strings); objectArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(objectArrayAdapter); linearLayout.addView(spinner); } }
最简单的实现方式就是使用ListView标签,接着设置entity属性为@strings里的内容,如下图所示
divider是分割条,可以使用颜色和图片
dividerHeight分割条的高度
entries之间见过,就是使用strings中的array来指定list
footerDividersEnabled/header是底部和头部的绘制,需要通过java代码控制
但是这样的并不常用,很多情况下需要从其他地方获取ListView,而且这些内容必须在java代码中管理
下面是使用适配器加xml布局文件生成的listview
package com.thundersoft.test; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.Toast; import androidx.annotation.Nullable; import com.thundersoft.myapplication.R; public class ListviewActivity extends Activity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { // 布局 super.onCreate(savedInstanceState); LinearLayout linearLayout = new LinearLayout(ListviewActivity.this); setContentView(linearLayout); // listview ListView listView = new ListView(ListviewActivity.this); // 配置分割线 View line = View.inflate(ListviewActivity.this, R.layout.linearlayout, null); // 设置头部线 listView.addHeaderView(line); // 创建适配器 ArrayAdapterad = ArrayAdapter.createFromResource(this, R.array.listview, android.R.layout.simple_list_item_checked); listView.setAdapter(ad); listView.addFooterView(line); // 放进去 linearLayout.addView(listView); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView> parent, View view, int position, long id) { String s = parent.getItemAtPosition(position).toString(); Toast.makeText(ListviewActivity.this,s,Toast.LENGTH_SHORT).show(); } }); } }
View.inflate(ListviewActivity.this, R.layout.linearlayout, null);表示的是从其他位置获取的内容
我们也可以自定义列表中的内容,这时候就需要继承ListActivity了,代码如下
package com.thundersoft.test; import android.app.ListActivity; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import android.widget.ListView; import androidx.annotation.Nullable; public class Listview2Activity extends ListActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); String[] strings = new String[]{"测试1", "测试2", "测试3"}; ArrayAdapterad = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, strings); this.setListAdapter(ad); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); String s = l.getItemAtPosition(position).toString(); System.out.println(s); } }
该方法相对简单,直接通过this.setListAdapter(ad);配置适配器即可
另外要着重说明一下适配器之一的SimpleAdapter,它的代码如下
package com.thundersoft.test; import android.app.ListActivity; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.SimpleAdapter; import androidx.annotation.Nullable; import com.thundersoft.myapplication.R; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.ListIterator; import java.util.Map; public class Listview3Activity extends ListActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); int[] ints = {R.drawable.code, R.drawable.pic, R.drawable.fav}; String[] strings = new String[]{"代码专区", "图片预览", "我的喜爱"}; List
SimpleAdapter的源码如下
public SimpleAdapter(Context context, List extends Map> data, @LayoutRes int resource, String[] from, @IdRes int[] to) context表示指定关联该Adapter运行的上下文,这里是this
data指定一个基于Map的列表List,代表每一行
resource表示要放的布局文件,这里的item是一个LinearLayout中包含一个Image和Text的布局
from表示唯一指定表示名字,这里的title和image和map中的k键对应
to表示为放在布局文件上的哪个位置,item_title和item_image是id
这里需要新建一个item的xml文件
8.日期时间选取器DatePicker TimePicker
xml如下
java代码如下
package com.thundersoft.test; import android.app.Activity; import android.os.Bundle; import android.widget.DatePicker; import android.widget.TimePicker; import androidx.annotation.Nullable; import com.thundersoft.myapplication.R; import java.util.Calendar; public class PickerActivity extends Activity { int year; int month; int day; int hour; int minute; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.picker); DatePicker datePicker = findViewById(R.id.date); TimePicker timePicker = findViewById(R.id.time); timePicker.setIs24HourView(true); Calendar instance = Calendar.getInstance(); year = instance.get(Calendar.YEAR); month = instance.get(Calendar.MONTH); day = instance.get(Calendar.DAY_OF_MONTH); hour = instance.get(Calendar.HOUR_OF_DAY); minute = instance.get(Calendar.MINUTE); datePicker.init(year, month, day, new DatePicker.OnDateChangedListener() { @Override public void onDateChanged(DatePicker view, int year, int month, int day) { PickerActivity.this.year=year; PickerActivity.this.month=month; PickerActivity.this.day=day; System.out.println(year+month+day+hour+minute); } }); timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() { @Override public void onTimeChanged(TimePicker view, int hour, int minute) { PickerActivity.this.hour = hour; PickerActivity.this.month = minute; System.out.println(hour+minute); } }); } }
需要注意的是日历对象的使用
9.计时器Chronometerjava代码如下
package com.thundersoft.test; import android.app.Activity; import android.os.Bundle; import android.os.SystemClock; import android.view.View; import android.widget.Button; import android.widget.Chronometer; import androidx.annotation.Nullable; import com.thundersoft.myapplication.R; public class ChronometerActivity extends Activity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.chronometer); Chronometer chronometer = findViewById(R.id.chro); // 设置起始时间 chronometer.setbase(SystemClock.elapsedRealtime()); // 设置格式 chronometer.setFormat("已用时间:%s"); Button start = findViewById(R.id.startbutton); Button end = findViewById(R.id.endbutton); Button for0 = findViewById(R.id.for0); start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { chronometer.start(); } }); end.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { chronometer.stop(); } }); for0.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { chronometer.setbase(SystemClock.elapsedRealtime()); } }); } }
1.先设置初始时间
2.再设置格式
3.开始计时器
4.结束计时器
4.设置监听器(可省略)setOnChronometerTickListener
三、实践 1.要求实现一个登录页面,提供记住密码和用户名功能,登陆后显示列表视图必须包含登录用户名,且点击列表会显示点击那一项
2.代码实现login.xml
item.xml
LoginActivity.java
package com.thundersoft.session1; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.Toast; import android.content.SharedPreferences.Editor; import androidx.annotation.Nullable; import javax.security.auth.login.LoginException; public class LoginActivity extends Activity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.login); //先定义 SharedPreferences sp = null; EditText user = findViewById(R.id.user); EditText pwd = findViewById(R.id.pwd); Button login = findViewById(R.id.login); Button re = findViewById(R.id.re); CheckBox remember = findViewById(R.id.remember); sp = this.getSharedPreferences("userinfo", Context.MODE_PRIVATE); if (sp.getBoolean("checkboxBoolean", false)) { user.setText(sp.getString("user", null)); pwd.setText(sp.getString("pwd", null)); remember.setChecked(true); } SharedPreferences finalSp = sp; login.setOnClickListener(new View.OnClickListener() { // 执行登录 @Override public void onClick(View v) { System.out.println(user.getText().toString()); // 判断是否输入了名字和密码 if(user.getText().toString().trim().equals("")){ Toast.makeText(LoginActivity.this, "请您输入用户名!", Toast.LENGTH_SHORT).show(); return; } if(pwd.getText().toString().trim().equals("")){ Toast.makeText(LoginActivity.this, "请您输入密码!", Toast.LENGTH_SHORT).show(); return; } // 记住我判断 Editor editor = finalSp.edit(); if (remember.isChecked()) { editor.putString("user", user.getText().toString()); editor.putString("pwd", pwd.getText().toString()); editor.putBoolean("checkboxBoolean", true); } else { editor.putString("user", null); editor.putString("pwd", null); editor.putBoolean("checkboxBoolean", false); } editor.commit(); //Intent跳转 Intent intent=new Intent(LoginActivity.this,MainActivity.class); intent.putExtra("name", user.getText().toString()); startActivity(intent); finish(); } }); } }
MainActivity.java
package com.thundersoft.session1; import android.app.ListActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; import androidx.annotation.Nullable; import com.thundersoft.session1.R; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.ListIterator; import java.util.Map; public class MainActivity extends ListActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 拿到数据 Intent intent = getIntent(); String name = intent.getStringExtra("name"); // 数据存放 int[] num = new int[]{1,2,3,4,5}; String[] names = new String[]{name,name,name,name,name}; List3.实现效果
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)