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
的中心點重疊,即圖片都居中顯示。還有一種是 matrix ,它是從ImageView的左上角開始繪製,超出部分做剪下處理。在java程式碼中可以通過 setImageResource() 給ImageView指定圖片。
5.ProgressBar
用於顯示一個進度條。通過 style
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 這裡有詳細的介紹。