中級實訓Android學習記錄——Toast、AlertDialog、ProgressBar
阿新 • • 發佈:2020-11-28
## 學習記錄 2020/11/22
### Toast
- Toast
- Toast是一個訊息提示元件
- 我們可以設定其顯示的位置
- 自定義其顯示的內容
- 對Toast的簡單封裝可以達到不同的目的
- Toast的預設用法
```java
Toast.makeText(getApplicationContext(), "Toast", Toast.LENGTH_LONG).show()
```
> 其中makeText相當於Toast類中的一個建構函式,他會根據你輸入的引數來構造一個新的Toast返回給你。
>
> 第一個引數是一個context,可以選擇直接呼叫getApplicationContext函式來輸入,也可以輸入當前的Activity的名字來輸入,如:ToastActivity.this
>
> 第二個引數是一個String,用來表示Toast的輸出內容
>
> 第三個引數是Toast的顯示時間,LENGTH_LONG表示顯示2s
- Toast改變位置用法
```java
Toast toastCenter = Toast.makeText(getApplicationContext(), "居中Toast", Toast.LENGTH_LONG);
toastCenter.setGravity(Gravity.CENTER, 0, 0);
toastCenter.show();
```
> 呼叫makeText生成一個Toast,並呼叫setGravity將其位置設定為居中即可
- Toast的自定義顯示內容的用法,如增加一個圖片
```java
// 首先需要一個Toast自定義顯示的佈局layout_toast.xml
// 自定義為一個LinearLayout,裡面包括了一個ImageView(id=iv_toast)和一個TextView(id=tv_toast)
Toast toastCustom = new Toast(getApplicationContext());
LayoutInflater inflater = LayoutInflater.from(ToastActivity.this);
View view = inflater.inflate(R.layout.layout_toast, null);
ImageView imageView = (ImageView) view.findViewById(R.id.iv_toast);
TextView textView = (textView) view.findViewById(R.id.tv_toast);
imageVIew.setImageResource(R.drawable.icon_simle); // 用drawable/icon_simle.png圖片作為layout_toast佈局檔案中的imageView的圖片
textView.setText("自定義Toast");
toastCustom.setView(view);
toastCustom.show();
```
> 需要使用一個佈局檔案時,通過LayoutInflater來構造一個基於現在的activity的inflater,通過inflater來幫我們找到我們需要的佈局檔案。
>
> ```java
> LayoutInflater inflater = LayoutInflater.from(ToastActivity.this);
> View view = inflater.inflate(R.layout.layout_toast, null);
> ```
>
> 最後通過view以及方法findViewById來找到當前的佈局檔案中的構成元件
>
> ```
> ImageView imageView = (ImageView) view.findViewById(R.id.iv_toast);
> TextView textView = (textView) view.findViewById(R.id.tv_toast);
> ```
>
> 然後通過元件各自的方法來實現我們需要顯示的內容
>
> ```java
> imageVIew.setImageResource(R.drawable.icon_simle); // 用drawable/icon_simle.png圖片作為layout_toast佈局檔案中的imageView的圖片
> textView.setText("自定義Toast");
> ```
>
> 最後把我們需要顯示的自定義toast通過setView方法自定義我們的toast
>
> ```java
> toastCustom.setView(view);
> ```
>
>
- 多次點選顯示Toast的按鈕,Toast會排隊,等待上一個Toast顯示完之後再開始顯示,不符合需求,所以我們需要對Toast進行簡單封裝
```java
public class ToastUtil {
public static Toast mToast;
public static void showMsg(Context context, String msg) {
if (mToast == null) {
mToast = Toast.makeText(context, msg, Toast.LENGTH_LONG);
}
else {
mToast.setText(msg);
}
mToast.show();
}
}
```
> 運用以上簡單的封裝,我們可以達到多次點選生成Toast的按鈕,只會按照最後一次點選來顯示Toast的目的。
>
> 而這個封裝與之前的按鈕的區別是:之前的按鈕每按一次都會創造一個新的Toast,而這次只會在第一次創造新的Toast,他呼叫的是同一個Toast的show方法。
### AlertDialog
- AlertDialog
- 預設樣式
- 單選樣式
- 多選樣式
- 自定義
- 預設用法
```java
AlertDialog.Builder builder = new AlertDialog.Builder(DialogActivity.this);
builder.setTitle("請回答").setMessage("你覺得課程如何")
.setIcon(R.drawable.icon_smile)
.setPositiveButton("棒", new DialogInterface.OnClickListener() {
@override
public void onClick(DialogInterface dialog, int which) {
ToastUtil.showMsg(DialogActivity.this, "你很誠實");
}
}).setNeutralButton("還行", new DialogInterface.OnClickListener() {
@override
public void onClick(DialogInterface dialog, int which) {
ToastUtil.showMsg(DialogActivity.this, "你再瞅瞅");
}
}).setPositiveButton("不好", new DialogInterface.OnClickListener() {
@override
public void onClick(DialogInterface dialog, int which) {
ToastUtil.showMsg(DialogActivity.this, "瞎說");
}
}).show();
```
> 通過AlertDialog的生產者模式Builder來生成AlertDialog
>
> 由於builder的大部分方法返回的都是builder本身,所以我們可以通過一系列的.來呼叫形成呼叫串
>
> 記得最後要呼叫show來顯示AlertDialog
- 單選樣式的AlertDialog
```java
//沒有radioButton的單選AlertDialog
AlertDialog.Builder builder1 = new AlertDialog.Builder(DialogActivity.this);
String[] array = new String[]{"男", "女"};
builder1.setTitle("選擇性別").setItems(array, new DialogInterface.OnClickListener() {
@override
public void onClick(DialogInterface dialog, int which) {
ToastUtil.showMsg(DialogActivity.this, array[which]);
}
}).show();
```
```java
//有radioButton的單選AlertDialog
AlertDialog.Builder builder2 = new AlertDialog.Builder(DialogActivity.this);
String[] array = new String[]{"男", "女"};
builder2.setTitle("選擇性別").setSingleChoiceItems(array, 0, new DialogInterface.OnClickListener() {
@override
public void onClick(DialogInterface dialog, int which) {
ToastUtil.showMsg(DialogActivity.this, array[which]);
}
}).show();
```
> 有radioButton的單選AlertDialog中setSingleChoiceItems中
>
> 第一個引數是一個String的陣列,表示顯示的列表
>
> 第二個引數是選定的陣列的下表,在例子中,0則表示選中男,1則表示選中女
>
> 第三個是一個ClickListener
>
> 此時我們可以通過點選非AlertDialog的區域來取消AlertDialog的顯示,如果我們希望使用者一定要選擇一個按鈕才能取消顯示,我們需要
>
> - 讓builder產生的AlertDialog不支援自己取消:setCancelable(false)
>
> - 在onClick函式中呼叫dismiss方法
>
> ```java
> new DialogInterface.OnClickListener() {
> @override
> public void onClick(DialogInterface dialog, int which) {
> ToastUtil.showMsg(DialogActivity.this, array[which]);
> dialog.dismiss();
> }
> }
> ```
>
>
- 多選樣式的AlertDialog
```java
AlertDialog.Builder builder3 = new AlertDialog.Builder(DialogActivity.this);
String[] array = new String[]{"唱歌", "跳舞", "寫程式碼"};
boolean[] isSelected = new Boolean[]{false, falst, true};
builder3.setTitle("選擇興趣").setMultipleChoiceItems(array, isSelected, new DialogInterface.OnClickListener() {
@override
public void onClick(DialogInterface dialog, int which) {
ToastUtil.showMsg(DialogActivity.this, array[which]+":"+isSelected[which]);
}
}).show();
```
> 多選樣式即從setSingleChoiceItems變成setMultipleChoiceItems,
>
> 第二個引數從選定的陣列下標(int)改成是否選定的列表(boolean[])
- 自定義樣式的AlertDialog
```java
// 自定義一個佈局layout_dialog.xml
// 例子中包含一個EditText(id=et_username)表示輸入使用者名稱,一個EditText(id=et_password)表示輸入密碼,一個登陸按鈕(id=btn_login)
AlertDialog.Builder builder4 = new AlertDialog.Builder(DialogActivity.this);
LayoutInflater inflater = LayoutInflater.fron(DialogActivity.this);
View view = inflater.inflate(R.layout.layout_dialog);
EditText eUserName = (EditText) view.findViewById(R.id.et_username);
EditText ePassWord = (EditText) view.findViewById(R.id.et_password);
Button btnLogin = (Button) view.findViewById(R.id.btn_login);
btnLogin.setOnClickListener(new View.OnClickListener() {
@override
public void onClick(View v) {
//
}
})
builder4.setTitle("請登入").setView(view).show();
```
> 其中我們直接用setView設定自定義樣式
### ProgressBar & ProgressDialog
- ProgressBar
- 預設樣式
- 預設
> 可以直接在xml宣告 ,可以自定義style,
>
> style="???.Horizontal"時為水平的ProgressBar,
>
> 可以宣告progress="10"說明此時的進度條進度
>
> 宣告secondaryProgress說明進度條的二級進度(視訊快取之類的)
>
> 宣告max說明進度條最大進度是多少
```java
// 可以在Activity中直接更改進度條的進度
mpb = (ProgressBar) findViewById(R.id.pb);
mBtnStart = (Button) findViewById(R.id.btn_start);
mBtnStart.setOnClickListener(new View.onClickListener {
@override
public void onClick() {
handler.sendEmptyMessage(0);
}
})
mpb.setProgress(30);
Handler handler = new Handler() {
@override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (mpb.getProgress < 100) {
handler.postDelayed(runnable, 500); //延遲500ms傳送一個資訊給runnable
} else {
ToastUtil.showMsg(ProgressActivity.this, "載入完成");
}
}
}
Runnable runnable = new Runnable() {
@override
public void run() {
mpb.setProgress(mpb.getProgress() + 5);
handler.sendEmptyMessage(0);
}
}
```
> 此處,我們宣告一個handler接受訊息,一個runnable傳送訊息,這個過程其實是通過點選按鈕,我們模擬一個ProgressBar載入的過程,每過500ms傳送一次資訊給runnable讓他給progress加5進度直到進度為100.
- 自定義ProgressBar
```java
// 通過自定義一個xml檔案來生成旋轉動畫,具體表現為
// 然後使用ProgressBar時直接更改其style為自定義的動畫即可
```
- ProgressDialog
> 使用方法基本與AlertDialog相同