第三章-Android界面控件

1.TextView—显示文本信息

image.png

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,将图片复制到该文件夹下。
image.png
(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
image.png
(3)修改程序的入口
image.png

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过多并快速滑动该控件时,界面会出现卡顿,原因:

  1. 滑动屏幕时,不断创建Item对象。ListView控件在当前屏幕上显示多少个Item,就会在适配器MyBaseAdapter中的getView()方法中创建多少Item对象。当滑动ListView控件时, 滑出屏幕的Item对象会被销毁,新加载到屏幕上的Item会创建新的对象,因此快速滑动ListView控件时会不断地对Item对象进行销毁和创建
  2. 不断执行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类的对象。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肉丝不切片

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值