安卓学习 之 UI控件(三)

本文详细介绍了安卓开发中的UI控件,包括TextView、Button、EditText、ImageView、ProgressBar、AlertDialog和ProgressDialog的使用。同时,讲解了线性布局、相对布局、帧布局和百分比布局的基本概念。此外,还探讨了自定义控件的创建过程,以及ListView的简单用法和高级用法,包括自定义适配器和优化技巧。最后,讨论了在安卓开发中如何合理使用长度单位,如dp和sp。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、常用控件

1.TextView(文本)

  • match_parent:控件与父类相同(基本不用fil_parent)wrap_content:刚好包裹里面内容。
  • android:gravity调节文字对齐方式,可选参数包括top、bottom、left、right、center等。可用|来同时指定多个值。文字采用sp为单位,文字颜色使用#XXXXXX来表示。
  • android:textSize 属性可以指定文字的大小,通过 android:textColor 属性可以指定文字的颜色。

2.Button(按钮)

Button可以通过注册监听器调用,也可以通过实现接口的方式实现调用。

  • button.setOnClickListener(new OnClickListener(){})
  • 或者让活动类实现 OnClickListener 接口,重写onclick方法 onClick(View v),可以通过参数v的id判断是哪一个按钮。

3.EditText(编辑框)

  • android.hint:指定一段提示性文字
  • android:maxLines指定EditText的最大行数
  • editText_01.getText().toString()来获取输入内容。

4.ImageView(图片控件)

  • android:src为ImageView指定一张照片。
  • setImageResource()动态设置ImageView里面的图片。

5.ProgressBar(进度条)

  • Android:visibility设置控件可见属性,visible可见invisible不可见,gone消失。设置控件可见性setVisiblity(View.visible);获取控件可见性progress_bar01.getVisiblity()
  • 设置Prograssbar的进度条进度。 progressBar.getProgress()获得进度,progressBar.setProgress(progress)设置进度。

6.AlterDialog(对话框)

  • 一般 AlertDialog 都是用于提示一些非常重要的内容或者警告信息。
  • 先new一个AlterDialog.Builder对象,setTitle、setMessage、SetCancelable、setPositiveButton、setNegativeButton完成。
  • 最后一定要dialog.show();

7.ProgressDialog

  • ProgressDialog 会在对话框中显示一个进度条,一般是用于表示当前操作比较耗时,让用户耐心地等待。
  • 与AlterDialog类似,设置progressdialog.setCaceled(true),可通过返回键back回去,否则回不去.

二、四种基本的布局

1.线性布局(Linearlayout)

  • android:orientation="vertical"竖直方向。horizontal水平方向。
  • android:gravity 用于指定文字在控件中的对齐方式,而android:layout_gravity用于指定控件在布局中的对齐方式。
  • .dp是Android中用于指定控件大小、间距等属性 , android:layout_width=“0dp” android:layout_weight="1"若两个控件都为1则平分屏幕。

2.相对布局 (RelativeLayout)

  • 相对父布局定位:
//控件位于父控件的右下方
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"

//两个属性来确定置。

  • 相对于控件定位
//控件位于button_03控件的右下方
android:layout_below="@id/button_03"
android:layout_toRightOf="@id/button_03"

3.帧布局 (FrameLayout)

应用场景较少,将元素放在左上方

4.百分比布局(PercentFrameLayout)

三、自定义控件

控件的继承结构

image

需求,添加一个类似苹果的菜单栏,左边是返回按钮,中间是内容,右边是编辑

  1. 自定义布局

在res/layout 新建一个布局文件 title.xml,
然后在需要引入这个布局的xml文件中加上<include layout="@layout/title"/> 就可以了。

  1. 自定义控件

每次引入Title.xml 点击事件都要写,不如改成动态加载形成自定义控件。

  • 上一步引入布局后;
  • 新建TitleLayout继承自LinearLayout,对标题栏动态加载
public class TitleLayout extends LinearLayout {
    public TitleLayout(Context context, AttributeSet attrs) { 
        super(context, attrs);     
        LayoutInflater.from(context).inflate(R.layout.title, this);
    }
}
  • 3.重新引入布局,引入TitleLayout,而非title.xml;
<com.example.uicustomviews.TitleLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content">
</com.example.uicustomviews.TitleLayout>
  • 4.在布局的构造函数中中添加点击事件,形成自定义控件。
public class TitleLayout extends LinearLayout {
    public TitleLayout(Context context, AttributeSet attrs) { 
        super(context, attrs); LayoutInflater.from(context).inflate(R.layout.title, this);
        Button titleBack = (Button) findViewById(R.id.title_back); 
        Button titleEdit = (Button) findViewById(R.id.title_edit); titleBack.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) { 
                ((Activity) getContext()).finish();
            }
        });
        titleEdiOnCt.setlickListener(new OnClickListener();
    }
}

四、ListView

简单用法
  • 在一个布局中中加入ListView
<ListView
android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="match_parent" >
</ListView>
  • 提供显示数据
private String[] data = { "Apple", "Banana", "Orange", "Watermelon", "Pear", "Grape", "Pineapple", "Strawberry", "Cherry", "Mango" };
  • 构建适配器,目的是传递数据进入ListView,适配器是ArrayAdapter,可以通过泛型传递数据。
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
MainActivity.this, android.R.layout.simple_list_item_1, data); 

这里我们使用了android.R.layout.simple_list_item_1 作为 ListView 子项布局的 id,这是一个 Android 内置的布局文件,里面只有一个TextView,可用于简单地显示一段文本。

3.setAdapter将适配器传递进去,完成Listview与数据的关联。

listView.setAdapter(adapter);
高级用法(定制ListView的界面)
  1. 定义实体类Fruit,传入ImageId和name;
public class Fruit { 
    private String name; 
    private int imageId;
    
}

2.建立Fruit_item.xml,完善布局;

定义了一个 ImageView 用于显示水果的图片, 又定义了一个TextView 用于显示水果的名称

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" >

    <ImageView android:id="@+id/fruit_image" android:layout_width="wrap_content" android:layout_height="wrap_content" />
    <TextView android:id="@+id/fruit_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginLeft="10dip" />
</LinearLayout>

3.建立自定义适配器,继承ArrayAdapter,泛型为Fruit类,FruitAdapter将上下文、ListView子布局的id和数据传递进来。

public class FruitAdapter extends ArrayAdapter<Fruit> { 
    private int resourceId;
    public FruitAdapter(Context context, int textViewResourceId, List<Fruit> objects) {
        super(context, textViewResourceId, objects);
        resourceId = textViewResourceId;
    }
}

4.重写getView方法,其功能是每个子项滚动到屏幕内的时候会被调用。

  • 获取当前项的Fruit实例;L
  • ayoutInflater.from(getContext()).inflate为这个子项加载传入的布局;
  • setImageResource和setText设置图片和文字。返回布局最后。
public View getView(int position, View convertView, ViewGroup parent) { 
    Fruit fruit = getItem(position); // 获取当前项的Fruit实例
    View view = LayoutInflater.from(getContext()).inflate(resourceId, null); ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image); TextView fruitName = (TextView) view.findViewById(R.id.fruit_name); fruitImage.setImageResource(fruit.getImageId()); fruitName.setText(fruit.getName());
    return view;
}

5.使用initFruits初始化所有水果数据,将水果名称和水果图片ID添加进来;建立Adapter,将其作为适配器传入Listview,只要修改fruit_intem.xml,就可以修改出复杂界面了。

FruitAdapter adapter = new FruitAdapter(MainActivity.this, R.layout.fruit_item, fruitList);

private void initFruits() {
    //初始化所有水果的数据;
}
  1. 给每个viewItem添加一个点击事件
listView.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Fruit fruit = fruitList.get(position); 
        Toast.makeText(MainActivity.this, fruit.getName(),
Toast.LENGTH_SHORT).show();
    }
}
  1. ListView的优化

getView()方法中还有一个 convertView 参数,这个可以理解成上次加载成功的view。

public class FruitAdapter extends ArrayAdapter<Fruit> {
    @Override
    public View getView(int position, View convertView, ViewGroup parent) { 
        Fruit fruit = getItem(position);
        View view;
        ViewHolder viewHolder;
        if (convertView == null) {
            view = LayoutInflater.from(getContext()).inflate(resourceId, null); 
            viewHolder = new ViewHolder();
            viewHolder.fruitImage = (ImageView) view.findViewById (R.id.fruit_image);
            viewHolder.fruitName = (TextView) view.findViewById (R.id.fruit_name);
            view.setTag(viewHolder); // 将ViewHolder存储在View中
        } else {
            view = convertView;
            viewHolder = (ViewHolder) view.getTag(); // 重新获取ViewHolder
        }
        viewHolder.fruitImage.setImageResource(fruit.getImageId()); viewHolder.fruitName.setText(fruit.getName());
        return view;
    }

class ViewHolder { 
    ImageView fruitImage; 
    TextView fruitName;
    }
}

我们新增了一个内部类 ViewHolder,用于对控件的实例进行缓存。当 convertView 为空的时候,创建一个 ViewHolder 对象,并将控件的实例都存放在 ViewHolder 里,然后调用 View 的 setTag()方法,将 ViewHolder 对象存储在 View 中。当 convertView 不为空的时候则调用
View 的 getTag()方法,把 ViewHolder 重新取出。这样所有控件的实例都缓存在了 ViewHolder
里,就没有必要每次都通过 findViewById()方法来获取控件实例了。

五、长度单位怎么使用

px 是像素的意思,即屏幕中可以显示的最小元素单元,在像素不同的设备显示的大小会有出入。pt字体单位同理。

dp 是密度无关像素,比如手机宽是 2 英寸长是 3 英寸,如果它的分辨率是 320*480 像素,那么他的密度比是160dpi。pt字体单位同理。

总结一下,在编写 Android 程序的时候,尽量将控件或布局的大小指定成 match_parent 或 wrap_content,如果必须要指定一个固定值,则使用 dp 来作为单位,指定文字大小的时候使用 sp 作为单位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值