1. 程式人生 > >Android中的介面UI

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 這裡有詳細的介紹。