Android开发--Lesson02--常见的控件

一.简单空间

TextView

TextView用来显示文本信息,可以在XML文件中添加并且添加其相对的样式:
它的样式主要有以下内容:

<TextView
    android:id="@+id/textViewExample"  <!-- 设置TextView的唯一标识符,用于在代码中引用 -->
    android:layout_width="wrap_content"  <!-- 设置宽度为内容宽度,即根据文本长度自动调整 -->
    android:layout_height="wrap_content"  <!-- 设置高度为内容高度,即根据文本高度自动调整 -->
    
    android:text="这是一个示例文本"  <!-- 设置TextView显示的文本内容 -->
    android:textSize="18sp"  <!-- 设置文本字体大小为18sp(推荐使用sp单位以支持用户字体偏好设置) -->
    android:textColor="#0000FF"  <!-- 设置文本颜色为蓝色(十六进制颜色值) -->
    android:fontFamily="sans-serif"  <!-- 设置字体族为无衬线字体(如Arial或Helvetica) -->
    android:textStyle="bold"  <!-- 设置文本样式为粗体 -->

    android:gravity="center"  <!-- 设置文本在其容器内的对齐方式为居中 -->
    android:padding="10dp"  <!-- 设置TextView内部四周的填充距离为10dp -->
    
    android:background="#FFFF00"  <!-- 设置TextView的背景颜色为黄色 -->
    
    android:drawableLeft="@drawable/icon_example"  <!-- 在文本左边添加一个图标资源 -->
    android:drawablePadding="5dp"  <!-- 设置文本与左边图标的间距为5dp -->
    
    android:ellipsize="end"  <!-- 当文本超出可用空间时,在末尾添加省略号 -->
    android:maxLines="2"  <!-- 设置文本的最大行数为2行 -->
    
    android:clickable="true"  <!-- 使TextView可点击 -->
    android:focusable="true"  <!-- 使TextView可以获得焦点 -->
/>

 

示例图:

 Button

Button 控件是 Android 应用开发中最常用的 UI 组件之一,主要用于触发用户交互操作。

基本特性

  • 触发事件:Button 是用户与应用进行交互的主要方式之一,通常用于启动操作或导航到其他界面。
  • 样式可定制:可以通过 XML 属性或代码自定义按钮的外观,包括文本、颜色、背景等。

事件处理举例:

<Button
    android:id="@+id/my_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="点击我"
    android:onClick="onButtonClick" />

 

Java代码:

Button myButton = findViewById(R.id.my_button);
myButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 处理点击事件
    }
});

 

第二种方式:不在XML文件中放置onClick事件,而是直接在Java代码中直接实现类的方式绑定事件

//使用Java代码绑定事件
        Button btn = findViewById(R.id.bt);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                btn.setText("被点击了");
            }
        });

 

第三种方式实现View.OnClickListener接口,同时重写其方法

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
        Button bt = findViewById(R.id.bt);
        bt.setOnClickListener(this);//自己就是监听器的实现类,故而将自己丢入监听器中
    }

    @Override
    public void onClick(View v) {
       TextView tv = v.findViewById(R.id.tv);
       tv.setText("按钮被点击");
    }
}

 

EditText

EditText 是 Android 中用于接收用户输入文本的 UI 组件。它继承自 TextView,因此具备 TextView 的所有特性,并且增加了一些专门用于处理用户输入的功能。

EditText 是 Android 应用开发中非常重要的组件之一,用于接收用户的文本输入。通过合理配置其属性和事件监听器,可以实现丰富的用户交互体验。

基础属性

  • android:hint:设置提示文本,在用户未输入任何内容时显示。示例:android:hint="请输入内容"
  • android:text:设置初始文本内容。示例:android:text="默认文本"
  • android:textSize 和 android:textColor:设置文本大小和颜色。示例:android:textSize="16sp" 和 android:textColor="#0000FF"
  • android:inputType:指定输入类型,以控制键盘布局和输入限制。示例:android:inputType="textPassword"(密码输入框)、android:inputType="number"(数字输入框)。

简单示例:

XML布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">
    <EditText
        android:id="@+id/et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入内容"
        android:inputType="textPersonName" />
    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <Button
        android:id="@+id/bt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="click me"/>
</LinearLayout>

 

Java代码:

public class MainActivity extends AppCompatActivity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
        Button bt = findViewById(R.id.bt);
        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EditText et = findViewById(R.id.et);//获取EditText
                TextView tv = findViewById(R.id.tv);//获取ViewText
                tv.setText(et.getText().toString());//点击按钮后写入内容到ViewText中
            }
        });
    }
}

ImageView 

在Android开发中,ImageView 是一个非常常用的UI组件,主要用于展示图像内容。它能够加载并显示各种来源的图片,如资源文件、网络图片或内存中的位图等。

作用
显示图片:最基本的功能是用于显示图片,支持多种格式(如PNG、JPG等)。
调整图片大小和比例:通过属性设置,可以控制图片的缩放模式、裁剪方式等,以适应不同的布局需求。

标签格式如下:

<!-- 在布局文件中 -->
<ImageView
    android:id="@+id/my_image_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/my_image"
    android:scaleType="centerCrop"/>

 

同时可以通过Java代码动态加载图片:

// 在Activity中
ImageView imageView = findViewById(R.id.my_image_view);
// 如果需要动态设置图片资源,可以使用setImageResource方法
imageView.setImageResource(R.drawable.another_image);

 

RadioButton

RadioButton 是用于实现单选功能的UI组件。它通常与 RadioGroup 一起使用,以确保在同一组中的多个 RadioButton 中只能选择一个。

作用
单选功能:RadioButton 最主要的作用是让用户从一组选项中选择一项。通过与 RadioGroup 结合使用,可以限制用户仅能选择一个选项。
状态显示:可以直观地显示出哪个选项被选中(通常是通过按钮内的点来表示)。

特点
  • 必须结合 RadioGroup 使用:为了实现单选功能,RadioButton 需要放在 RadioGroup 中。这保证了同一时间只能有一个 RadioButton 被选中。
  • 事件监听:可以通过设置 OnCheckedChangeListener 来监听选项的变化,从而执行相应的操作。
  • 自定义样式:支持对 RadioButton 进行样式上的定制,比如改变选中和未选中时的图标等。

示例案例:

XML文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">
    <RadioGroup
        android:id="@+id/rgp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
        <RadioButton
            android:id="@+id/rb1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="男"/>
        <RadioButton
            android:id="@+id/rb2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="女"/>
        <RadioButton
            android:id="@+id/rb3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="沃尔玛购物袋"/>
    </RadioGroup>
    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="你选择的是:"/>
</LinearLayout>

 

Java代码:

public class MainActivity extends AppCompatActivity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
        //找到单选组
        RadioGroup rgp = findViewById(R.id.rgp);
        //文本框
        TextView tv =findViewById(R.id.tv);
        //利用setOnCheckedChangeListener,这是专门的单选监听器
        rgp.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                if (checkedId==R.id.rb1){
                    tv.setText("您选择的是:男");
                }
                if (checkedId==R.id.rb2){
                    tv.setText("您选择的是:女");
                }
                if (checkedId==R.id.rb3){
                    tv.setText("您选择的是:沃尔玛购物袋");
                }
            }
        });
    }
}

 

样式:

 CheckBox

CheckBox 是一种允许用户从一组选项中选择多个选项的UI组件。与 RadioButton 不同,CheckBox 允许用户独立地选中或取消选中每一个选项,而不需要与其他选项互斥。

作用
多选功能:CheckBox 主要用于提供多选功能,让用户能够自由选择一个或多个选项。
状态显示:可以直观地显示出哪些选项被选中(通常通过打勾表示)。
特点

  • 独立性:每个 CheckBox 都是独立工作的,用户可以选择任意数量的复选框。
  • 事件监听:可以通过设置 OnCheckedChangeListener 来监听用户的选中或取消选中操作,从而执行相应的逻辑处理。
  • 自定义样式:支持对 CheckBox 进行样式上的定制,例如改变选中和未选中时的图标等

示例案例:

XML展示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">
    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="您选择的是:"/>
    <CheckBox
        android:id="@+id/cb1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="basketball"/>
    <CheckBox
        android:id="@+id/cb2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="pingpong"/>
    <CheckBox
        android:id="@+id/cb3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="music"/>
    <CheckBox
        android:id="@+id/cb4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="game"/>
</LinearLayout>

 

Java代码:

public class MainActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener{
    //拿取到TextView
    private TextView tv;
    private String msg="你选择的是:";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
        //获得checkBox按钮
        CheckBox cb1 = findViewById(R.id.cb1);
        CheckBox cb2 = findViewById(R.id.cb2);
        CheckBox cb3 = findViewById(R.id.cb3);
        CheckBox cb4 = findViewById(R.id.cb4);
        tv = findViewById(R.id.tv);
        //添加监听事件
        cb1.setOnCheckedChangeListener(this);
        cb2.setOnCheckedChangeListener(this);
        cb3.setOnCheckedChangeListener(this);
        cb4.setOnCheckedChangeListener(this);
    }
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked){
            //先判断字符是否在按钮信息中,如果没在需要添加,在就不需要管
            if (!msg.contains(buttonView.getText().toString())){
                msg+=buttonView.getText().toString()+" ";
                tv.setText(msg);
            }
        }else {
            //反情况,需要替换掉
            if (msg.contains(buttonView.getText().toString())){
                msg=msg.replace(buttonView.getText().toString()," ");
                tv.setText(msg);
            }
        }
    }
}

 

结果展示:

Toast

 Toast 是一种用于向用户显示简短消息的机制。它通常用于提示用户某些操作的结果或状态变化,而不会打断用户的当前操作流程。Toast 消息会短暂地显示在屏幕的底部(默认位置),然后自动消失

作用

  • 临时通知:Toast 主要用于显示临时性的通知信息,例如确认操作成功、警告信息等。
  • 不打断用户体验:与对话框不同,Toast 不会抢夺用户的焦点,也不会暂停用户正在进行的操作。

特点

  • 短暂显示:Toast 显示一段时间后会自动消失,默认持续时间可以设置为短时间(Toast.LENGTH_SHORT)或长时间(Toast.LENGTH_LONG)。
  • 无交互性:用户无法与 Toast 进行交互,如点击关闭等。
  • 自定义样式:虽然 Toast 的基本样式较为固定,但可以通过一些方法进行有限的自定义,比如修改背景颜色或文字颜色。

示例案例:

XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">
<Button
    android:id="@+id/bt"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Click Me,please now!"
    />
</LinearLayout>

 

Java代码:

public class MainActivity extends AppCompatActivity{
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
       //拿到按钮
        Button btn  = findViewById(R.id.bt);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this,"我被点击了",Toast.LENGTH_LONG).show();
            }
        });
    }

}

 

截图:

二.AlertDialog对话框 

对话框大多都是由Java代码直接构成,而不需要页面的提前占位,故而不需要XML文件的编写

AlertDialog 是一种用于显示对话框的UI组件。它能够弹出一个模态窗口(即需要用户交互才能继续操作),用于提示信息、获取用户输入或确认用户的操作等。AlertDialog 提供了丰富的定制选项,可以用来创建多种类型的对话框

作用
  • 提供反馈:向用户提供简短的信息反馈,例如操作成功或失败的消息。
  • 确认操作:请求用户确认某个重要操作,例如删除数据前的确认提示。
  • 获取输入:从用户那里收集必要的信息,比如文本输入、选择选项等。
  • 展示选项:提供一系列选项供用户选择,通常以列表形式呈现。
特点
  • 模态对话框:当 AlertDialog 显示时,用户必须与之交互才能返回到应用的其他部分。
  • 可定制性强:可以轻松地添加标题、消息、按钮(正面、负面和中性按钮)、列表项或自定义视图。
  • 事件处理:可以通过设置监听器来响应用户的交互,如点击按钮或选择列表项。

普通对话框

示例案例:

Java代码:

public class MainActivity extends AppCompatActivity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
        //普通对话框
        AlertDialog alertDialog;
        AlertDialog.Builder builder = new AlertDialog.Builder(this).setTitle("普通对话框")//标题
                .setIcon(R.drawable.ic_launcher_background)//图像
                .setMessage("是否退出应用")//主体内容
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {//确定事件
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        MainActivity.this.finish();
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {//取消事件
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });
        alertDialog = builder.create();
        alertDialog.show();
    }
}

 

结果:

 单选对话框

 在Android开发中,单选对话框(Radio Button Dialog)是一种允许用户从一组选项中选择一个选项的界面元素。它通常用于需要用户做出唯一选择的情形

作用
提供一种直观的方式来让用户进行单一选择。
确保用户只能选择提供的选项之一,这有助于数据的一致性和准确性。

示例案例

Java代码:

public class MainActivity extends AppCompatActivity{
    private int wh = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
        TextView tv = findViewById(R.id.tv);
        Button bt = findViewById(R.id.bt);

        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 创建一个AlertDialog对象
                AlertDialog alertDialog;
                // 创建一个AlertDialog.Builder对象,并设置标题和图标
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this).setTitle("设置字体大小")
                        .setIcon(R.drawable.ic_launcher_foreground)
                        // 设置单选列表项,并设置点击事件
                        .setSingleChoiceItems(new String[]{"small", "mid", "big", "bigger"}, wh, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                // 将选中的项赋值给wh
                                wh = which;
                            }
                        })
                        // 设置确定按钮,并设置点击事件
                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                // 定义字体大小数组
                                int[] fontSize = {10, 20, 30, 40, 50};
                                // 设置字体大小
                                tv.setTextSize(fontSize[wh]);
                                // 关闭对话框
                                dialog.dismiss();
                            }
                        })
                        // 设置取消按钮,并设置点击事件
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                // 关闭对话框
                                dialog.dismiss();
                            }
                        });
                // 创建AlertDialog对象
                alertDialog =builder.create();
                // 显示对话框
                alertDialog.show();
            }
        });
    }
}

 

结果视图:

 多选对话框

选对话框(Checkbox Dialog)允许用户从一组选项中选择多个选项。与单选对话框不同,它不限制用户的选项数量,适用于需要用户做出多项选择的场景
作用
  • 提供一种方式让用户能够选择一个或多个选项。
  • 特别适合于那些需要收集用户偏好或配置信息的应用场景。

示例案例

Java代码:

public class MainActivity extends AppCompatActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
        TextView tv = findViewById(R.id.tv);
        Button bt = findViewById(R.id.bt);
        boolean[] ba =  new boolean[]{false, false, true, true};
        String[] st = new String[]{"basketball", "pingpang", "music", "water"};
        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 创建一个AlertDialog对象
                AlertDialog alertDialog;
                // 创建一个AlertDialog.Builder对象
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                // 设置AlertDialog的标题
                builder.setTitle("请选择兴趣爱好")
                        // 设置AlertDialog的图标
                        .setIcon(R.drawable.ic_launcher_background)
                        // 设置AlertDialog的多选列表项
                        .setMultiChoiceItems(st, ba, new DialogInterface.OnMultiChoiceClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                                // 将选中的项保存到ba数组中
                                ba[which]=isChecked;
                            }
                        })
                        // 设置AlertDialog的确定按钮
                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                // 创建一个StringBuffer对象,用于保存选中的项
                                StringBuffer buffer = new StringBuffer();
                                buffer.append("您选择的是:");
                                // 遍历ba数组,将选中的项添加到buffer中
                                for (int i = 0; i < ba.length; i++) {
                                    if (ba[i]){
                                        buffer.append(" "+st[i]);
                                    }
                                }
                                // 将选中的项显示在TextView中
                                tv.setText(buffer.toString());
                                // 关闭AlertDialog
                                dialog.dismiss();
                            }
                        })
                        // 设置AlertDialog的取消按钮
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                // 弹出提示框,提示用户放弃了修改
                                Toast.makeText(MainActivity.this,"您放弃了修改",Toast.LENGTH_LONG).show();
                                // 关闭AlertDialog
                                dialog.dismiss();
                            }
                        });
                // 创建AlertDialog对象
                alertDialog = builder.create();
                // 显示AlertDialog
                alertDialog.show();
            }
        });
    }
}

 

结果:

 三.ListView

ListView 是一种非常常用的UI组件,用于在垂直滚动列表中显示项目集合。每个项目可以通过自定义布局进行展示,这使得 ListView 成为了展示大量数据的理想选择。

作用
展示数据:能够以列表形式展示大量的数据项,如联系人列表、消息列表等。
优化性能:通过使用视图回收机制(View Recycling),有效地管理内存和提升性能,尤其是在处理大数据集时。
用户交互:支持点击、长按等多种交互事件,允许开发者为用户提供丰富的操作选项。

使用ListView控件需要有一个分解的思想:原来的控件都是卸载一个XML文件,当然就为一个页面显示,但是现在使用ListView就不一样了,它需要动态的加载新的数据到显示屏上,那么就需要控制新加载上来的数据样式,最好的做法就是单独写一个XML文件样式用于控制这个动态加载的数据的样式,主XML文件负责引入这个样式就好了,就好比另写一个模板一样

示例:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/lv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scrollbars="none"/>
</LinearLayout>

 

list_item.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="horizontal">
    <ImageView
        android:id="@+id/iv"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:src="@drawable/ic_launcher_background"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:orientation="vertical">
    <TextView
        android:id="@+id/tv1"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:text="名称"/>
    <TextView
        android:id="@+id/tv2"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:text="解释" />
    </LinearLayout>
</LinearLayout>

 

Java代码

在ListView控件中,需要使用到一个叫适配器的东西,顾名思义,它就是用来将视图层和后端Java代码进行适配的

BaseAdapter 是一个抽象类,用于自定义适配器(Adapter),它允许你更灵活地控制 ListView(或其它使用适配器的组件如 GridView, Spinner 等)的数据绑定和视图生成。BaseAdapter 提供了比 ArrayAdapter 或 SimpleAdapter 更高的自由度,因为它要求开发者实现几个关键方法来定义如何展示数据。
主要需要实现的方法
int getCount():返回数据集中的元素总数。
Object getItem(int position):根据指定的位置返回数据集中对应的项。
long getItemId(int position):获取指定位置项的行ID。
View getView(int position, View convertView, ViewGroup parent):为每一项生成视图。这里可以重用 convertView 来提高性能,并且可以使用 ViewHolder 模式优化列表滚动性能。
public class MainActivity extends AppCompatActivity{

    // 定义图标数组
    private int[] icons ={R.drawable.apple,R.drawable.cake,R.drawable.clothes,R.drawable.jvav,R.drawable.kiwi,R.drawable.table};
    // 定义名称数组
    private String[] names={"苹果","蛋糕","衣服","jvav","猕猴桃","桌子"};
    // 定义价格数组
    private String[] prices={"8元/个","115元/个","120元/件","张博士专有","3元/个","210元/张"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 启用EdgeToEdge
        EdgeToEdge.enable(this);
        // 设置布局
        setContentView(R.layout.activity_main);
        // 设置窗口边距
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
        // 获取ListView
        ListView lv = findViewById(R.id.lv);
        // 创建适配器
        MyAdapter adapter = new MyAdapter();
        // 设置适配器
        lv.setAdapter(adapter);
    }
    // 自定义适配器
    class MyAdapter extends BaseAdapter{

        @Override
        public int getCount() {
            // 返回名称数组的长度
            return names.length;
        }

        @Override
        public Object getItem(int position) {
            // 返回名称数组中指定位置的元素
            return names[position];
        }

        @Override
        public long getItemId(int position) {
            // 返回指定位置的索引
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // 获取布局
            View view = View.inflate(MainActivity.this, R.layout.list_item, null);
            // 获取ImageView
            ImageView iv = view.findViewById(R.id.iv);
            // 获取TextView
            TextView tv1 = view.findViewById(R.id.tv1);
            TextView tv2 = view.findViewById(R.id.tv2);
            // 设置TextView的文本
            tv1.setText(names[position]);
            tv2.setText(prices[position]);
            // 设置ImageView的背景
            iv.setBackgroundResource(icons[position]);
            return view;
        }
    }
}

 

结果:

 这段代码是从 BaseAdaptergetView 方法中摘录的,用于在 ListView 中高效地生成和重用视图项

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
            if (convertView == null){
                // 获取布局
                convertView= View.inflate(MainActivity.this, R.layout.list_item, null);
                holder = new ViewHolder();
                // 获取ImageView
                holder.iv = convertView.findViewById(R.id.iv);
                // 获取TextView
                holder.tv1 = convertView.findViewById(R.id.tv1);
                holder.tv2 = convertView.findViewById(R.id.tv2);
                convertView.setTag(holder);
            }else {
                holder = (ViewHolder) convertView.getTag();
            }
            // 设置TextView的文本
            holder.tv1.setText(names[position]);
            holder.tv2.setText(prices[position]);
            // 设置ImageView的背景
            holder.iv.setBackgroundResource(icons[position]);
            return convertView;
        }

class ViewHolder{
        TextView tv1,tv2;
        ImageView iv;
    }

 

RecyclerView

RecyclerView 是 Android 提供的一个用于显示大量数据集的高级控件,旨在替代传统的 ListView 和 GridView。它提供了更灵活、更高效的方式来展示和管理列表项,并支持多种布局方式

主要特点

  • 视图复用:通过 ViewHolder 模式实现高效的视图复用,减少 findViewById 调用次数,提高性能。
  • 布局管理器:支持多种布局方式,包括线性布局(垂直或水平)、网格布局和瀑布流布局。
  • 动画效果:内置了丰富的动画效果,可以轻松添加插入、删除和移动项目的动画。
  • 模块化设计:将数据适配、布局管理和项目装饰等功能分离,使得代码更加清晰和易于维护。

用途

  • 展示大量数据:适用于需要展示大量数据的应用场景,如联系人列表、消息列表等。
  • 复杂布局:支持复杂的布局方式,如网格布局和瀑布流布局,适合展示图片库、商品列表等。
  • 动态更新:支持数据的动态更新,并且可以自定义动画效果来增强用户体验。

active_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scrollbars="none">

    </androidx.recyclerview.widget.RecyclerView>
</LinearLayout>

 

recycler_item.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="wrap_content"
    android:orientation="horizontal">
    <ImageView
        android:id="@+id/iv"
        android:layout_width="60dp"
        android:layout_height="60dp"
        />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:orientation="vertical">
    <TextView
        android:id="@+id/tv1"
        android:layout_width="match_parent"
        android:layout_height="35dp"
        android:textSize="25dp"
        android:text="名称"/>
    <TextView
        android:id="@+id/tv2"
        android:layout_width="match_parent"
        android:layout_height="25dp"
        android:text="解释" />
    </LinearLayout>
</LinearLayout>

 

Java代码:

public class MainActivity extends AppCompatActivity{

    // 定义图标数组
    private int[] icons ={R.drawable.apple,R.drawable.cake,R.drawable.clothes,R.drawable.jvav,R.drawable.kiwi,R.drawable.table,R.drawable.apple,R.drawable.cake,R.drawable.clothes,R.drawable.jvav,R.drawable.kiwi,R.drawable.table};
    // 定义名称数组
    private String[] names={"苹果","蛋糕","衣服","jvav","猕猴桃","桌子","苹果","蛋糕","衣服","jvav","猕猴桃","桌子"};
    // 定义价格数组
    private String[] prices={"8元/个","115元/个","120元/件","张博士专有","3元/个","210元/张","8元/个","115元/个","120元/件","张博士专有","3元/个","210元/张"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 启用EdgeToEdge
        EdgeToEdge.enable(this);
        // 设置布局
        setContentView(R.layout.activity_main);
        // 设置窗口边距
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
        // 获取ListView
        RecyclerView rv = findViewById(R.id.rv);
        rv.setLayoutManager(new LinearLayoutManager(this));
        // 创建适配器
        MyAdapter adapter = new MyAdapter();
        // 设置适配器
       rv.setAdapter(adapter);
    }

    // 自定义适配器
    class MyAdapter extends RecyclerView.Adapter<MainActivity.ViewHolder> {

        @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            // 从parent中获取LayoutInflater,并使用R.layout.list_item作为布局文件,创建ViewHolder对象
            return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item,parent,false));
        }

        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            // 设置第一个TextView的内容为names数组中对应位置的元素
            holder.tv1.setText(names[position]);
            // 设置第二个TextView的内容为prices数组中对应位置的元素
            holder.tv2.setText(prices[position]);
            // 设置ImageView的背景为icons数组中对应位置的元素
            holder.iv.setBackgroundResource(icons[position]);
        }

        @Override
// 重写父类的方法
        public int getItemCount() {
    // 返回names数组的长度
            return names.length;
        }
    }
    class ViewHolder extends RecyclerView.ViewHolder{
        // 定义TextView和ImageView
        TextView tv1,tv2;
        ImageView iv;

        // 构造方法,传入itemView
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            // 通过findViewById方法获取TextView和ImageView
            tv1 = itemView.findViewById(R.id.tv1);
            tv2 = itemView.findViewById(R.id.tv2);
            iv = itemView.findViewById(R.id.iv);
        }
    }
}

 

结果:

 

 

------ END------

 

posted @ 2025-03-16 13:04  回忆也交给时间  阅读(25)  评论(0)    收藏  举报