Android中的界面UI

一.常用控件

常用属性有android:id,android:layout_width,android:layout_height,android:gravity(控件中的内容,比如说文字的对齐方式),android:textSize,android:textColor,android:layout_gravity(当前控件相对父布局的对齐方式),android:layout_weight(控件在父布局中所占的权重),android:background(为布局或控件指定背景),android:layout_margin(外边距),android:padding(内边距)

1.TextView

用于在界面上显示文本。

2.Button

用于和用户交互。系统对Button中的英文字母都是大写,除非使用属性 android:textAllCaps="false" 可以使得其中的英文字母按照原来的大小写显示。

3.EditText

用于和用户交互,允许用户输入和编辑内容。其中 android:hint 属性较为常用,是用来指定一段提示性的文本。android:maxLines 用来指定EditText的最大行数。

4.ImageView

用于在界面上展示图片,其中图片通常放在drawable开头的文件夹下。通过 android:src 属性可以给ImageView指定一张图片。它有一个很重要的属性是 scaleType ,该属性指定图片显示的方式,其中以 fit 开头的共有4种,它们会对图片进行缩放。以 center 开头的有3种,它们会使图片的中心点与ImageView的中心点重叠,即图片都居中显示。还有一种是 matrix ,它是从ImageView的左上角开始绘制,超出部分做剪切处理。在java代码中可以通过 setImageResource() 给ImageView指定图片。

5.ProgressBar

用于显示一个进度条。通过 style 可以指定不同样式。通过 android:max 可以指定进度条的最大值。通过Android中的可见属性即 android:visibility 来指定控件的可见性,其中有3种选择:visible,invisible和gone。visible表示控件可见,invisible表示控件不可见,但仍然占据原来的位置,gone表示控件不可见,且不占据位置。也可以在java代码中用 setVisibility() 方法设置控件可见性。

6.AlertDialog

在当前界面弹出一个对话框,置于所有界面之上,屏蔽其它控件的交互能力,用于提示重要内容或者警告。实现方式如下所示:

AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this)
    .setTitle("Title")
    .setMessage("Message")
    .setCancelable(false)
    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
        }
    })
    .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
        }
    });
dialog.show();

通过AlertDialog.Builder创建AlertDialog实例,设置了标题、内容、是否可以通过其它方式取消对话框、确定按钮和取消按钮的点击事件,最后通过show()显示对话框。

7.ListView

https://www.cnblogs.com/896240130Master/p/6135165.html 这里有详细的介绍。现在RecyclerView基本替代了ListView。

8.RecyclerView

1.首先在app/build.gradle中导入支持库:com.android.support:recyclerview-v7:版本号

2.然后在Activity或Fragment的视图中使用代码:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView                                 
xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

3.在Activity或Fragment中声明RecyclerView的成员变量,然后在Activity的onCreate()通过findViewById(R.id.recycler_view)或者Fragment的onCreateView()先通过View view = inflater.inflate(R.layout.fragment_list,container,false)获取包含RecyclerView的view视图,再通过view.findViewById(R.id.recycler_view)获取实例。

4.在Activity类的onCreate()或Fragment的onCreateView()中设置RecyclerView的LayoutManager。

5.创建RecyclerView的单项视图。(假设其中有两个TextView)

6.实现ViewHolder和Adapter。

定义一个继承自RecyclerView.Adapter<VH>的类,其中VH是该继承类的内部类,其继承了RecyclerView的ViewHolder类,用于保存单项布局中的控件。该继承类要实现RecyclerView.Adapter中的抽象类 ViewHolder onCreateViewHolder、onBindViewHolder和getItemCount。还要实现它的构造器,是用于将数据源传进来。

public class XxxAdapter extends RecyclerView.Adapter<XxxAdapter.ViewHolder>{
    // 数据源
    private List<Xxx> mXxxList; 
    static class ViewHolder extends RecyclerView.ViewHolder{
        // 声明RecyclerView单项中布局控件,由于假设是两个TextView,所以声明如下:
        private TextView t1,t2; 
        // 创建ViewHolder构造器,传入的参数itemView表示RecyclerView子项的最外层布局
        public ViewHolder(View itemView){
            super(itemView);
            // 获取控件的实例
            t1 = (TextView) itemView.findViewById(R.id.t1);
            t2 = (TextView) itemView.findViewById(R.id.t2);
        }
    }
    
    // 创建XxxAdapter构造器,传入的参数表示将数据源传进来
    public XxxAdapter(List<Xxx> XxxList){
        mXxxList = XxxList;
    }
    
    // 实现抽象方法

    // 该方法是将RecyclerView的单项布局加载进来,然后创建ViewHolder实例。
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_item, parent, false);
        return new ViewHolder(view);
    }
    
    // 用于对子项的数据进行赋值,在子项滚动到屏幕内执行
    @Override
    public void onBindViewHolder(@NonNull CrimeHolder holder, int position) {
        Xxx xxx = mXxxList.get(position);
        holder.t1.setText(xxx.get某属性());
        holder.t2.setText(xxx.get某属性());
    }
    
    // 返回子项有多少项
    @Override
    public int getItemCount() {
        return mXxxList.size();
    }
}

7.在Activity的onCreate()或Fragment的onCreateView()中创建adapter实例mAdapter = new XxxAdapter(传入Xxx的List实例),然后RecyclerView设置Adapter即可。

8.RecyclerView的点击事件

为ViewHolder类添加成员变量mView用来表示子项最外层布局,然后在ViewHolder的构造器中获得其实例,如下所示:

static class ViewHolder extends RecyclerView.ViewHolder{
        // 声明mView用来表示子项最外层布局
        private View mView;
        // 声明RecyclerView单项中布局控件,由于假设是两个TextView,所以声明如下:
        private TextView t1,t2; 
        // 创建ViewHolder构造器,传入的参数itemView表示RecyclerView子项的最外层布局
        public ViewHolder(View itemView){
            super(itemView);
            // 获取View            
            mView = itemView;
            // 获取控件的实例
            t1 = (TextView) itemView.findViewById(R.id.t1);
            t2 = (TextView) itemView.findViewById(R.id.t2);
        }
}

在XxxAdapter的onCreateViewHolder中设置监听器,如下所示:

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.list_item, parent, false);
    final ViewHolder holder = new ViewHolder(view);
    // 这是设置点击整个视图的操作
    holder.mView.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){
            // 通过holder获取AdapterPosition要求holder定义为final
            int position = holder.getAdapterPosition();
            Xxx xxx = mXxxList.get(position);
            // Toast显示如下,其中onClick中的参数v表示mView
            // Toast.makeText(v.getContext(),"",Toast.LENGTH_SHORT).show();
            // 跳转到Activity如下
            // Intent intent = new Intent(v.getContext(), CrimeActivity.class);
            //  v.getContext().startActivity(intent);
        }
    });
    // 如果要设置其它的部分,也是类似的操作
    ..............
    
    return holder;
}

二.常用布局

布局是可以存放控件和布局的容器。

1.LinearLayout:线性布局

线性布局使控件在线性上排列。通过属性 android:orientation 来指定排列方向是 vertical(纵向)和 horizontal(横向)。

2.RelativeLayout:相对布局

相对布局通过相对定位方式来排列控件。其中的属性比较简单,通过字面意思即可理解。

3.FrameLayout:帧布局

该布局中所有的控件都默认摆放在布局的左上角,后编写的xml中的控件在上面。也可以通过 android:layout_gravity 来更改对应控件的位置。

4.ConstraintLayout:约束布局

https://blog.csdn.net/guolin_blog/article/details/53122387 这里有详细的介绍。

三.自定义控件

所有的控件都是直接或间接继承自View,所有布局都直接或间接继承ViewGroup。

方式一:引入布局

将要使用的公共部分单独放置在一个布局文件中比如放置在a.xml布局文件中。

然后再要使用的部分使用 <include layout="@layout/a" /> 即可引入布局。

方式二:创建自定义控件

引入布局能解决重复编写布局代码的问题,但如果其中有控件需要响应事件,还需要在需要使用该控件的所有活动中编写对应的响应事件。所以创建自定义控件能够方便许多。

https://blog.csdn.net/fictionss/article/details/78285167 这里有详细的介绍。

猜你喜欢

转载自blog.csdn.net/myCSDN1997/article/details/83721159
今日推荐