全部笔记All notes

Android界面控件详解

阅读 6m 22s6m 22s read

概述

Android 提供了丰富的界面控件(UI Controls)用于构建用户界面。本文档介绍常用控件的使用方法、属性配置和事件处理。

控件分类

类型控件使用场景
显示控件TextView, ImageView显示文本和图片
输入控件EditText, Button用户交互输入
选择控件CheckBox, RadioButton多选和单选
列表控件ListView, RecyclerView显示数据列表
容器控件LinearLayout, RelativeLayout布局容器

💡 学习目标: 掌握常用控件的使用方法和事件处理机制。


简单控件

TextView(文本显示控件)

TextView 是 Android 中最基础的显示控件,用于在界面上显示文本信息。

常用属性

属性名功能描述示例值
android:text设置文本内容"Hello World"
android:textSize设置文字大小"16sp"
android:textColor设置文字颜色"#FF0000"
android:textStyle设置文字样式"bold"
android:gravity设置文本对齐方式"center"
android:maxLines设置最大行数"2"
android:ellipsize设置省略号位置"end"
android:drawableTop在文本上方显示图片"@drawable/icon"
android:lineSpacingExtra设置行间距"4dp"

使用示例

<TextView
    android:id="@+id/tv_title"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="欢迎使用应用"
    android:textSize="18sp"
    android:textColor="#333333"
    android:textStyle="bold"
    android:gravity="center"
    android:padding="16dp"
    android:background="#F5F5F5" />

🔧 单位说明:

  • sp: 用于文字大小,可随系统字体缩放
  • dp: 用于尺寸和距离,不受屏幕密度影响

Button(按钮控件)

Button 是用户交互的核心控件,用于响应用户点击操作。

点击事件处理方式

方式一:在布局文件中设置 onClick 属性

<!-- activity_main.xml -->
<Button
    android:id="@+id/btn_click"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="点击我"
    android:onClick="onButtonClick" />
// MainActivity.java
public class MainActivity extends AppCompatActivity {
    
    public void onButtonClick(View view) {
        Toast.makeText(this, "按钮被点击了", Toast.LENGTH_SHORT).show();
    }
}

方式二:在代码中设置点击监听器

public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Button button = findViewById(R.id.btn_click);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "按钮被点击了", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

方式三:使用 Lambda 表达式(Android 8.0+)

Button button = findViewById(R.id.btn_click);
button.setOnClickListener(v -> {
    Toast.makeText(this, "按钮被点击了", Toast.LENGTH_SHORT).show();
});

按钮样式定制

<Button
    android:id="@+id/btn_custom"
    android:layout_width="match_parent"
    android:layout_height="48dp"
    android:text="自定义按钮"
    android:textColor="#FFFFFF"
    android:background="@drawable/button_bg"
    android:textSize="16sp"
    android:elevation="4dp" />

自定义按钮背景 (res/drawable/button_bg.xml):

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <solid android:color="#1976D2"/>
            <corners android:radius="8dp"/>
        </shape>
    </item>
    <item android:state_enabled="false">
        <shape android:shape="rectangle">
            <solid android:color="#CCCCCC"/>
            <corners android:radius="8dp"/>
        </shape>
    </item>
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#2196F3"/>
            <corners android:radius="8dp"/>
        </shape>
    </item>
</selector>

输入控件

EditText(文本输入控件)

EditText 用于接收用户的文本输入。

常用属性

属性名功能描述示例值
android:hint设置提示文本"请输入用户名"
android:inputType设置输入类型"textPassword"
android:maxLength设置最大字符数"20"
android:singleLine设置单行输入"true"
android:imeOptions设置软键盘动作"actionDone"

输入类型

输入类型说明用途
text普通文本姓名、地址
textPassword密码密码输入
number数字年龄、数量
phone电话号码手机号码
textEmailAddress邮箱地址邮箱输入

使用示例

<EditText
    android:id="@+id/et_username"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="请输入用户名"
    android:inputType="text"
    android:maxLength="20"
    android:padding="12dp"
    android:background="@drawable/edittext_bg" />

<EditText
    android:id="@+id/et_password"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="请输入密码"
    android:inputType="textPassword"
    android:maxLength="16"
    android:padding="12dp"
    android:background="@drawable/edittext_bg" />

获取输入内容

EditText etUsername = findViewById(R.id.et_username);
EditText etPassword = findViewById(R.id.et_password);

String username = etUsername.getText().toString().trim();
String password = etPassword.getText().toString().trim();

if (TextUtils.isEmpty(username)) {
    etUsername.setError("用户名不能为空");
    return;
}

if (password.length() < 6) {
    etPassword.setError("密码长度不能少于6位");
    return;
}

选择控件

CheckBox(复选框)

CheckBox 用于多选场景。

<CheckBox
    android:id="@+id/cb_java"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Java" />

<CheckBox
    android:id="@+id/cb_kotlin"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Kotlin" />
CheckBox cbJava = findViewById(R.id.cb_java);
CheckBox cbKotlin = findViewById(R.id.cb_kotlin);

cbJava.setOnCheckedChangeListener((buttonView, isChecked) -> {
    if (isChecked) {
        Toast.makeText(this, "选择了 Java", Toast.LENGTH_SHORT).show();
    }
});

RadioButton(单选按钮)

RadioButton 用于单选场景,通常与 RadioGroup 配合使用。

<RadioGroup
    android:id="@+id/rg_gender"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <RadioButton
        android:id="@+id/rb_male"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="男" />

    <RadioButton
        android:id="@+id/rb_female"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="女" />
</RadioGroup>
RadioGroup rgGender = findViewById(R.id.rg_gender);
rgGender.setOnCheckedChangeListener((group, checkedId) -> {
    switch (checkedId) {
        case R.id.rb_male:
            Toast.makeText(this, "选择了男", Toast.LENGTH_SHORT).show();
            break;
        case R.id.rb_female:
            Toast.makeText(this, "选择了女", Toast.LENGTH_SHORT).show();
            break;
    }
});

事件处理

常见事件类型

事件类型触发条件使用场景
onClick点击控件按钮点击
onLongClick长按控件上下文菜单
onTouch触摸控件手势操作
onFocusChange焦点改变输入框切换
onCheckedChanged选中状态改变复选框、单选框

事件监听器设置

// 点击事件
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 处理点击事件
    }
});

// 长按事件
button.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        // 处理长按事件
        return true; // 返回true表示消费事件
    }
});

// 触摸事件
button.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // 处理触摸事件
        return false;
    }
});

最佳实践

1. 性能优化

使用 ViewHolder 模式:

static class ViewHolder {
    TextView textView;
    Button button;
    
    ViewHolder(View itemView) {
        textView = itemView.findViewById(R.id.tv_text);
        button = itemView.findViewById(R.id.btn_action);
    }
}

避免频繁查找控件:

// 好的做法
TextView textView = findViewById(R.id.tv_text);
for (int i = 0; i < 100; i++) {
    textView.setText("Item " + i);
}

// 不好的做法
for (int i = 0; i < 100; i++) {
    TextView textView = findViewById(R.id.tv_text); // 每次都查找
    textView.setText("Item " + i);
}

2. 内存管理

及时释放资源:

@Override
protected void onDestroy() {
    super.onDestroy();
    // 清理监听器
    if (button != null) {
        button.setOnClickListener(null);
    }
}

3. 用户体验

提供反馈:

button.setOnClickListener(v -> {
    // 显示加载状态
    button.setEnabled(false);
    button.setText("处理中...");
    
    // 执行操作
    performOperation(() -> {
        // 恢复按钮状态
        button.setEnabled(true);
        button.setText("完成");
    });
});

常见问题

问题1:控件找不到或为空

❓ 问题: findViewById() 返回 null

解决方案:

  1. 检查 ID 是否正确:

    TextView textView = findViewById(R.id.tv_text); // 确保ID正确
  2. 确保在 setContentView() 之后调用:

    setContentView(R.layout.activity_main);
    TextView textView = findViewById(R.id.tv_text); // 正确位置
  3. 检查布局文件是否正确:

    <TextView
        android:id="@+id/tv_text"  <!-- 确保ID存在 -->
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

问题2:点击事件不响应

❓ 问题: 设置了点击事件但不响应

解决方案:

  1. 检查控件是否可点击:

    <TextView
        android:id="@+id/tv_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:clickable="true"
        android:focusable="true" />
  2. 确保没有被其他控件覆盖:

    <!-- 确保没有其他控件覆盖在上面 -->
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:elevation="2dp" />

问题3:内存泄漏

❓ 问题: Activity 销毁后仍被引用

解决方案:

public class MainActivity extends AppCompatActivity {
    private static class MyClickListener implements View.OnClickListener {
        private WeakReference<MainActivity> activityRef;
        
        MyClickListener(MainActivity activity) {
            activityRef = new WeakReference<>(activity);
        }
        
        @Override
        public void onClick(View v) {
            MainActivity activity = activityRef.get();
            if (activity != null) {
                // 处理点击事件
            }
        }
    }
}

相关文章

基础篇

进阶篇

实践篇

移动开发技术

开发工具


总结

Android 界面控件是构建用户界面的基础,掌握其使用方法对于开发高质量的应用至关重要。

🎯 核心要点

  • 控件分类: 了解不同类型控件的用途和特性
  • 属性配置: 掌握常用属性的设置方法
  • 事件处理: 理解事件机制和监听器模式
  • 性能优化: 注意内存管理和性能问题

🛠️ 开发建议

  • 合理选择控件类型
  • 统一界面风格和交互方式
  • 注意不同屏幕尺寸的适配
  • 提供良好的用户反馈