ui

本文详细介绍了Android开发中的各种UI控件,包括TextView、Button、EditText等,以及常用的布局方式如LinearLayout、RelativeLayout和FrameLayout。同时,文章还探讨了自定义控件的方法,ListView和RecyclerView的使用技巧,包括适配器的创建和子项布局的设计。

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

一、常用控件
①、TextView
用来显示文本信息:
android:gravity,指定文字对齐方式
android:textSize,指定文字大小
android:textColor,指定文字颜色
②、Button
android:text,指定按钮上的文字,默认所有英文字母大写显示,可以通过android:textAllCaps来修改
③、EditText
android:hint,指定一段提示性文字,当没有输入时显示
android:maxLines,指定最大行数,当输入内容超过此行数时,文本会向上滚动
getText(),获得内容
④、ImageView
android:src指定图片位置
setImageResource(R.drawable.img),改变图片内容
⑤、ProcessBar
android:visibility,控制控件的可见属性,所有控件都有此属性,其值有3种:visible、invisible、gone。visible是默认属性,invisible表示不可见,但仍然占据原来的位置,gone表示不可见,且不占用屏幕空间
style="?android:attr/progressBarStyleHorizontal",将进度条设置为水平型,此时可以通过android:max设置进度条最大值,然后通过setProgress()改变进度条最大值
setVisibility(),设置可见性,其参数可以为View.VISIBLE、View.INVISIBLE、View.GONE
⑥、AlertDialog
在当前界面弹出一个对话框,此对话框置于所有控件之上,可以屏蔽掉其他控件交互能力

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button bt=(Button)findViewById(R.id.bt);
        bt.setOnClickListener(
                view->{
                    AlertDialog.Builder dialog=new AlertDialog.Builder(this);//创建AlertDialog实例
                    dialog.setTitle("the dialog");//设置标题
                    dialog.setMessage("the information");//设置内容
                    dialog.setCancelable(false);//设置返回键是否可以关闭
                    dialog.setPositiveButton("OK",(DialogInterface di,int i)->{});//点击确定按钮事件
                    dialog.setNegativeButton("Cancel",((dialogInterface, i) -> {}));//点击取消按钮事件
                    dialog.show();//显示对话框
                }
        );
    }

二、基本布局
1、LinearLayout
将包含的控件在线性方向上排列
android:orientation,指定排列方向,可以选择vertical和horizontal
android:layout_gravity,控件的属性,指定该控件的对齐方式,要配合排列方向使用
android:layout_weight,控件的属性,通过比例指定该控件的大小,系统会按该控件大小与所有控件大小之和的比例为其设置大小。当指定此属性时,控件在排列方向上的长度就不受android:layout_width或android:layout_height控制,可以将其设置为0dp
2、RelativeLayout
通过相对定位的方式让控件出现在布局上
①、相对父布局
android:layout_alignParentLeft、android:layout_alignParentTop、android:layout_alignParentRight、android:layout_alignParentBottom、android:layout_centerInParent
②、相对控件
androif:layout_above、android:layout_below、android:layout_toLeftOf、android:layout_toRightOf,要将参照控件定义在前面
android:layout_alignLeft、android:layout_RightLeft,表示和参照控件边缘对齐
3、FrameLayout
所有控件都默认摆在左上角
4、百分比布局
以上3个布局中,只有LinearLayout可以按比例指定控件大小,所以系统提供了PercentRelativeLayout和PercentFrameLayout这2个布局。为了使用这2个布局,需要在build.gradle中添加依赖。
app:layout_widthPercent、app:heightPercent,需要先定义app命名空间

三、自定义控件
1、引入布局
通过就可以引入该id的布局
2、创建控件

public class MyLayout extends LinearLayout {//继承LinearLayout
    public MyLayout(Context context, @Nullable AttributeSet attrs) {//在布局中引入MyLayout就会调用这个这个构造方法
        super(context, attrs);
        //先构建一个KayoutInflater对象,然后通过inflate动态加载一个布局文件,其第1个参数布局文件,第2个参数为父布局
        LayoutInflater.from(context).inflate(R.layout.thelayout,this);
        //为按钮添加事件,所有使用此布局的按钮均已添加了该事件
        Button bt=(Button)findViewById(R.id.button);
        bt.setOnClickListener(
                view -> {
                    ((Activity)getContext()).finish();//先获得上下文,即使用此布局的活动,然后结束它
                }
        );
    }
}

四、ListView
1、使用系统的适配器和布局文件

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listviewlayout);


        String[] data={"1","2","3"};//定义一些数据
        //构建一个适配器,第1个参数为上下文,第2个参数为项目布局文件,第3个参数为数据
        ArrayAdapter<String> adapter =new ArrayAdapter<String >(this,android.R.layout.simple_list_item_1,data);
        ListView listView=(ListView)findViewById(R.id.list_view);
        listView.setAdapter(adapter);//为ListView设置适配器

    }

2、自定义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">

    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

②、子项布局

<?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">

    <TextView
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

③、适配器

public class ListAdapter extends ArrayAdapter<String> {

    int resId;

    public ListAdapter(@NonNull Context context, int resource, String[] data) {
        super(context, resource,data);
        resId=resource;
    }

    //子项进入屏幕时调用
    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        String str=getItem(position);
        //加载子项布局
        View view= LayoutInflater.from(getContext()).inflate(resId,parent,false);
        //显示内容
        TextView textView=view.findViewById(R.id.list_text);
        textView.setText(str);

        return view;
    }
}

④、使用ListView

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listviewlayout);


        String[] data={"1","2","3"};//定义一些数据
        //使用自定义适配器,并将上下文、子项布局、数据传入
        ListAdapter adapter =new ListAdapter(this,R.layout.list_item,data);

        ListView listView=(ListView)findViewById(R.id.list_view) ;
        listView.setAdapter(adapter);

    }

3、添加监听器

        listView.setOnItemClickListener(
                (AdapterView<?> parent, View view,int position,long id)->{
                    String str=data[position];//获得该子项内容
                    Toast.makeText(this,str,Toast.LENGTH_SHORT).show();
                }
        );

五、RecyclerView
1、依赖

    implementation "androidx.recyclerview:recyclerview:1.0.0"
    implementation "androidx.recyclerview:recyclerview-selection:1.0.0"

2、布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">


    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

3、子项布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/recycler_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

4、适配器


public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private String[] data;

    //通过内部类获取textView实例
    static class ViewHolder extends RecyclerView.ViewHolder{
        TextView textView;
        public ViewHolder(View view){
            super(view);
            textView=(TextView)view.findViewById(R.id.recycler_text);
        }
    }

    //通过构造方法传入数据
    MyAdapter(String[] data){
        this.data=data;
    }


    //创建ViewHolder实例
    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view=LayoutInflater.from(parent.getContext()).inflate(R.layout.recycle_item,parent,false);
        ViewHolder viewHolder=new ViewHolder(view);
        return viewHolder;
    }

    //在子项进入屏幕时执行此方法
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        String str=data[position];
        ((ViewHolder)holder).textView.setText(str);//设置子项内容

    }

    //子项数目
    @Override
    public int getItemCount() {
        return data.length;
    }


}

5、使用RecyclerView

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.recycler);


        String[] data={"1","2","3"};//定义一些数据

        MyAdapter adapter=new MyAdapter(data);
        //创建布局管理器
        LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this);
        RecyclerView recyclerView=(RecyclerView)findViewById(R.id.recycler_view);

        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(linearLayoutManager);


    }

6、其他布局方式
①、横向布局

linearLayoutManager.setOrientation(linearLayoutManager.HORIZONTAL);

默认是纵向布局,可以更改
②、网格布局
使用GridLayoutManager

        //使用网格布局管理器,并设置为2列
        GridLayoutManager gridLayoutManager=new GridLayoutManager(this,2);
        recyclerView.setLayoutManager(gridLayoutManager);

③、瀑布流布局
使用StaggeredGridLayoutManager

        //使用瀑布流布局,并设置为2列,当排列方向为水平时,就是2行
        StaggeredGridLayoutManager staggeredGridLayoutManager=new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(staggeredGridLayoutManager);

7、点击事件
不同于ListView,RecyclerView需要手动给具体的子项注册点击事件
修改MyAdapter的onCreateViewHolder()

    //创建ViewHolder实例
    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view=LayoutInflater.from(parent.getContext()).inflate(R.layout.recycle_item,parent,false);
        ViewHolder viewHolder=new ViewHolder(view);
        view.setOnClickListener(
                v-> {
                    int position=viewHolder.getAdapterPosition();
                    Toast.makeText(parent.getContext(),data[position],Toast.LENGTH_SHORT).show();
                }
        );

        return viewHolder;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值