1.TextView—显示文本信息
2.Button—按钮
继承自TextView,可以显示文本,也可以显示图像,主要作用是添加单击事件
(1)为控件添加onClick属性,在Activity中定义方法
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="我是通过onClick属性添加的点击事件"
android:onClick="click"/>
public void click(View view){
System.out.println("添加onClick属性");
}
(2)通过匿名内部类添加单击事件
public class MainActivity extends AppCompatActivity {
Button btn_two;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_two=findViewById(R.id.btn_two);
btn_two.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
System.out.println("匿名内部类");
}
});
}
}
(3)实现接口的方式
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button btn_three;
@Override
public void onClick(View view) {
System.out.println("实现接口");
}
}
3.EditText—编辑框
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="用户名:"
android:textSize="20sp"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入用户名"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="密 码:"
android:textSize="20sp"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:password="true"
android:hint="请输入密码"/>
</LinearLayout>
4.ImageView—显示图片
(1)创建布局文件:imageview.xml
注意:布局文件名,只能包含小写字母、0-9数字和下划线
(2)创建文件夹drawable-hdpi,将图片复制到该文件夹下。
(3)布局文件的内容如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon"/>
</RelativeLayout>
5.RadioButton—单选按钮
(1) 创建布局文件 radiobutton.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="请选择您的性别:"/>
<RadioGroup
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="男"/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="女"/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="保密"/>
</RadioGroup>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="此处显示您的性别"/>
</LinearLayout>
(2) 写Java代码
public class MainActivity extends AppCompatActivity {
RadioGroup rg;
RadioButton rb1,rb2,rb3;
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.radiobutton);
init();
// 为单选按钮组添加单击事件
rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
// 参数1:代表的是单选按钮组 参数2:代表的是单选按钮
switch (i){
case R.id.rb_1:tv.setText("您的性别是男");break;
case R.id.rb_2:tv.setText("您的性别是女");break;
case R.id.rb_3:tv.setText("您的性别保密");break;
}
}
});
}
// 初始化所有的控件
void init(){
rg=findViewById(R.id.rg);
rb1=findViewById(R.id.rb_1);//ctrl+D
rb2=findViewById(R.id.rb_2);
rb3=findViewById(R.id.rb_3);
tv=findViewById(R.id.tv);
}
}
6.CheckBox—复选框
(1)创建布局文件checkbox.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="请选择您的兴趣爱好:"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="篮球"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="听王老师的课"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跟着王老师敲代码"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="您的兴趣爱好是:"/>
</LinearLayout>
(2) 创建页面Activity-----CheckBoxActivity
(3)修改程序的入口
7.Toast—消息提醒
public class ToastActivity extends AppCompatActivity {
//2.定义组件
RadioGroup rg;
RadioButton rb1,rb2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//1.将页面与布局文件关联
setContentView(R.layout.toast);
//3.初始化组件
init();
//4.添加事件
rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
if (i == R.id.rb1){
Toast.makeText(ToastActivity.this,"您的性别是男",Toast.LENGTH_LONG).show();
}else{
Toast.makeText(ToastActivity.this,"您的性别是女",Toast.LENGTH_SHORT).show();
}
}
});
}
void init(){
rg = findViewById(R.id.rg);
rb1 = findViewById(R.id.rb1);
rb2 = findViewById(R.id.rb2);
}
}
8.AlertDialog—对话框
(1)普通对话框
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//1.重写onBackPressed()----单击回退键调用的方法
@Override
public void onBackPressed() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
//2.创建对话框的标题区域----标题图标 标题名称
builder.setTitle("普通对话框");
builder.setIcon(R.mipmap.ic_launcher);
//3.创建对话框的内容区域
builder.setMessage("您确定退出吗");
//4.创建对话框的按钮区域
builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast.makeText(MainActivity.this,"您单击了确认",Toast.LENGTH_SHORT).show();
dialogInterface.dismiss();
MainActivity.this.finish();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast.makeText(MainActivity.this,"您单击了取消",Toast.LENGTH_SHORT).show();
dialogInterface.dismiss();
}
});
//5.创建对话框对象
AlertDialog dialog = builder.create();
//6.显示对话框
dialog.show();
}
}
(2)单选对话框
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
TextView tv;
Button btn;
int textSize = 1;//当前字体号
int[] textSizeArr = {10,20,30,40,50};//字体号数组
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
//添加事件
btn.setOnClickListener(this);
}
void init(){
tv = findViewById(R.id.tv);
btn = findViewById(R.id.btn);
}
@Override
public void onClick(View view) {
//创建静态内部类对象
AlertDialog.Builder builder = new AlertDialog.Builder(this);
//创建标题区域
builder.setTitle("单选对话框");
builder.setIcon(R.mipmap.ic_launcher);
//创建内容区域----单选对话框
builder.setSingleChoiceItems(new String[]{"小号","默认","中等","大号","超大号"}, textSize, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
textSize = i;
Toast.makeText(MainActivity.this,"您单击了按钮"+i,Toast.LENGTH_SHORT).show();
}
});
//创建按钮区域
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
tv.setTextSize(textSizeArr[textSize]);
}
});
builder.setNegativeButton("取消", null);
//创建对话框
AlertDialog dialog = builder.create();
//显示对话框
dialog.show();
}
}
(3)多选对话框
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button btn;
String[] str = {"Java","安卓","微服务"};
boolean[] str1 = {false,false,false};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn).setOnClickListener(this);
}
@Override
public void onClick(View view) {
//创建静态内部类对象
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("多选对话框")
.setIcon(R.mipmap.ic_launcher)
.setMultiChoiceItems(str, str1, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i, boolean b) {
str1[i] = b;
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
StringBuffer buffer = new StringBuffer();
for (int j = 0; j < str1.length; j++) {
if (str1[j]){
buffer.append(str[j]).append(" ");
}
}
if (buffer.length() > 0){
Toast.makeText(MainActivity.this,"您选择了"+buffer,Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(MainActivity.this,"一个人连爱好都没有和咸鱼有什么区别"+buffer,Toast.LENGTH_SHORT).show();
}
}
})
.setNegativeButton("取消",null);
AlertDialog dialog = builder.create();
dialog.show();
}
}
9.ListView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="45dp"
android:text="购物商城"
android:textSize="18sp"
android:textColor="#FFFFFF"
android:background="#FF8F03"
android:gravity="center"/>
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<!-- 控件置于垂直方向的中心位置-->
<ImageView
android:id="@+id/iv"
android:layout_width="120dp"
android:layout_height="90dp"
android:layout_centerVertical="true" />
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@+id/iv"
android:layout_centerVertical="true">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="桌子"
android:textSize="20sp"
android:textColor="#000000" />
<!-- 放在title下面-->
<TextView
android:id="@+id/tv_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="价格:"
android:textSize="20sp"
android:layout_marginTop="10dp"
android:layout_below="@+id/title"
android:textColor="#FF8F03" />
<!-- 放在title下面,放在price右边-->
<TextView
android:id="@+id/price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1000"
android:textSize="20sp"
android:layout_below="@+id/title"
android:layout_toRightOf="@+id/tv_price"
android:textColor="#FF8F03"
android:layout_marginTop="10dp"/>
</RelativeLayout>
</RelativeLayout>
public class MainActivity extends AppCompatActivity {
int[] icons = {R.drawable.apple, R.drawable.cake, R.drawable.kiwifruit, R.drawable.scarf, R.drawable.table, R.drawable.wireclothes};
String[] titles = {"苹果", "蛋糕", "猕猴桃", "围巾", "桌子", "线衣"};
String[] prices = {"10元/kg", "300元", "10元/kg", "290元", "3000元", "500元"};
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.lv);
//为控件设置Adapter适配器
MyAdapter myAdapter = new MyAdapter();
listView.setAdapter(myAdapter);
}
class MyAdapter extends BaseAdapter {
@Override
public int getCount() {//获取 item 条目总数
return titles.length;
}
@Override
public Object getItem(int i) {//返回 item 数据对象
return titles[i];
}
@Override
public long getItemId(int i) {//返回 item 的 id
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {//得到 item 视图
//加载 list_item.xml 布局文件------将布局文件转换为一个控件
View view1 = View.inflate(MainActivity.this,R.layout.list_item,null);
TextView title = view1.findViewById(R.id.title);
TextView price = view1.findViewById(R.id.price);
ImageView iv = view1.findViewById(R.id.iv);
title.setText(titles[i]);
price.setText(prices[i]);
iv.setBackgroundResource(icons[i]);
}
}
}
(1)问题
当LIstView控件上加载的item过多并快速滑动该控件时,界面会出现卡顿,原因:
- 滑动屏幕时,不断创建Item对象。ListView控件在当前屏幕上显示多少个Item,就会在适配器MyBaseAdapter中的getView()方法中创建多少Item对象。当滑动ListView控件时, 滑出屏幕的Item对象会被销毁,新加载到屏幕上的Item会创建新的对象,因此快速滑动ListView控件时会不断地对Item对象进行销毁和创建。
- 不断执行findViewById()方法初始化控件。每创建一个Item对象都需要加载一次Item布局,加载布局时会不断地执行findViewById()方法初始化控件。这些操作比较耗费设备(模拟器、手机等设备)的内存并且浪费时间,如果每个Item都需要加载网络图片,加载网络图片是比较耗时的操作,造成程序内存溢出
(2)优化
1、创建ViewHolder类,将控件放入类中
class ViewHolder {
TextView title, price;
ImageView iv;
}
2、使用view对象减少item对象的创建
public View getView(int i, View view, ViewGroup viewGroup) {//得到 item 视图
/*
//加载 list_item.xml 布局文件------将布局文件转换为一个控件
View view1 = View.inflate(MainActivity.this,R.layout.list_item,null);
TextView title = view1.findViewById(R.id.title);
TextView price = view1.findViewById(R.id.price);
ImageView iv = view1.findViewById(R.id.iv);
title.setText(titles[i]);
price.setText(prices[i]);
iv.setBackgroundResource(icons[i]);
*/
ViewHolder holder = null;
if (view == null) {
view = View.inflate(MainActivity.this, R.layout.list_item, null);
holder = new ViewHolder();
holder.title = view.findViewById(R.id.title);
holder.price = view.findViewById(R.id.price);
holder.iv = view.findViewById(R.id.iv);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
//为控件设置内容
holder.title.setText(titles[i]);
holder.price.setText(prices[i]);
holder.iv.setBackgroundResource(icons[i]);
return view;
}
判断view是否为null,为null会创建ViewHolder类的对象holder,并将获取的界面控件赋值给ViewHolder类中的属性,最后通过setTag()方法将对象holder添加到view对象中,否则,不会重新创建ViewHolder类的对象,会通过gerTag()方法获取缓存在view对象中的ViewHolder类的对象。