<本文章僅作學習的筆記的目的,可能會有參考衝突與錯誤,請見諒。>
AlertDialog可以在當前頁面裏彈出一個對話框,它可以屏蔽其他UI控件的交互能力,以起到警示的作用,所以在實際設計時dialog會作爲重要信息提示作用而存在。
dialog有以下幾種形式:簡單對話框,列表對話框,單選對話框,多選對話框,自定義對話框等。
1.簡單對話框
Button dig=(Button)findViewById(R.id.dig1);
dig.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder dix=new AlertDialog.Builder(Activity14.this);
//創建Alert builder對象
dix.setIcon(R.mipmap.ic_launcher); //設置圖標
dix.setTitle("對話框"); //設置標題
dix.setMessage("這是一個對話框"); //設置內容
dix.setPositiveButton("進入界面", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//在此添加邏輯
}
});
//確定方面事件響應
dix.setNegativeButton("殘忍的離開", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}); //取消方面事件響應
dix.show();
//顯示出對話框
}
});
}
步驟具體爲:a:創建 AlertDialog.Builder實例
b:設置實例的一些屬性
c:設置positive與negetive的監聽
d:show(),顯示
當顯示對話框後整個界面會被屏蔽,UI控件將無法使用。
2.列表對話框
Button listdialog =(Button)findViewById(R.id.listdialog);
listdialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String[] arr={"c語言","c++","java","python","HTML","c#"}; //常量定義數組
AlertDialog.Builder dix=new AlertDialog.Builder(Activity14.this);
//創建Alert builder對象
dix.setIcon(R.mipmap.ic_launcher); //設置圖標
dix.setTitle("選擇編程語言"); //設置標題
dix.setItems(arr, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(Activity14.this,"選擇了"+arr[which],Toast.LENGTH_SHORT).show();
}
}); //傳入arr,並且設置監聽器
dix.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}); //確定方面事件響應
dix.show();
}
});
實現步驟:1.final一個數組作爲列表項
2.獲取實例(同簡單對話框),配置標題,圖標等
3.配置ITEM,傳入數組,設置監聽器,在監聽器裏設置事件
4.顯示對話框
3.單選對話框
Button singlechoose=(Button)findViewById(R.id.singlechoose);
singlechoose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String[] arr={"c語言","c++","java","python","HTML","c#"}; //常量定義數組
AlertDialog.Builder dix=new AlertDialog.Builder(Activity14.this);
//創建Alert builder對象
dix.setIcon(R.mipmap.ic_launcher); //設置圖標
dix.setTitle("選擇編程語言"); //設置標題
dix.setSingleChoiceItems(arr, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
selectedId=which;
Toast.makeText(Activity14.this,"選擇了"+arr[which],Toast.LENGTH_SHORT).show();
}
});
dix.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(Activity14.this,"最終選擇了"+arr[selectedId],Toast.LENGTH_SHORT).show();
}
}); //確定方面事件響應
dix.show();
}
});
實現步驟:1.爲了記錄用戶選擇,我們需要在最外層添加 private int selectedId=0;
2.獲取實例(同簡單對話框),配置標題,圖標等
3.配置singlechoiceitems,傳入數組,設置默認選擇爲數組第0項,設置監聽器,在監聽器裏設置事件
4.我們用int變量記錄下最終的選擇,傳遞給確定按鈕
5.顯示對話框
4.多選對話框
Button chooses=(Button)findViewById(R.id.chooses);
chooses.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String[] arr={"c語言","c++","java","python","HTML","c#"}; //常量定義數組
chooselist.clear();
AlertDialog.Builder dix=new AlertDialog.Builder(Activity14.this);
//創建Alert builder對象
dix.setIcon(R.mipmap.ic_launcher); //設置圖標
dix.setTitle("選擇編程語言"); //設置標題
dix.setMultiChoiceItems(arr, new boolean[]{false, false, false,false, false, false}, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
if(isChecked){
chooselist.add(which);
}
else{
chooselist.remove(which);
}
Toast.makeText(Activity14.this,"用戶的選擇"+chooselist.toString(),Toast.LENGTH_SHORT).show();
}
}); //設置多選,傳入數組,默認選擇值,是否選中的邏輯 (如果選中,在數組裏添加選項,如果沒選中就移除選項)
dix.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//最後的toast提示,使用了tostring方法。
Toast.makeText(Activity14.this,"最終選擇了"+chooselist.toString(),Toast.LENGTH_SHORT).show();
}
}); //確定方面事件響應
dix.show();
}
});
實現步驟:1.爲了記錄用戶選擇,我們需要在代碼開始添加 ArrayList chooselist=new ArrayList()用來儲存用戶選項;
2.獲取實例(同簡單對話框),配置標題,圖標等
3.配置setMultiChoiceItems,傳入數組,設置默認選擇爲全部false,設置監聽器,在監聽器裏設置事件,監聽器裏的ischecked用來做判斷
如果選中,則在數組裏動態添加,如果沒選中,則移除。
4.使用tostring方法提示選擇。
5.顯示對話框
5.自定義對話框
Java代碼
public void bteClick(View v)
{
LayoutInflater layoutInflater=LayoutInflater.from(this); //設置反射器
View my=layoutInflater.inflate(R.layout.layout_myself_dialog,null);
//創建反射器視圖my,(採用了反射器的inflate方法)
AlertDialog.Builder builder=new AlertDialog.Builder(this);
//創建對話框實例
builder.setView(my);
//設置好視圖
my.findViewById(R.id.btx).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dia.dismiss();
}
});
my.findViewById(R.id.btx2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dia.dismiss();
}
});
//獲取按鈕對象,設置監聽
dia=builder.create(); //顯示出來
dia.show();
}
實現步驟:1.首先在點擊彈出dialog的button的xml屬性上添加
android:onClick=”bteClick”屬性
2.爲onclick屬性添加邏輯
設置反射器,創建反射器視圖,創建對話框實例然後設置視圖,爲視圖上的按鈕添加響應(這裏不用使用button獲取實例,而是直接把視圖當作按鈕看待,設置dismiss方法使對話框消失)
3.最後將對話框顯示出來
自定義對話框xml佈局
<?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="wrap_content"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#ffffff"
android:gravity="center"
android:orientation="horizontal"
android:weightSum="1">
<TextView
android:text="音樂鬧鐘"
android:textSize="18sp"
android:textColor="#000"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.95" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:padding="10dp"
>
</LinearLayout>
<TimePicker
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/timePicker"
android:layerType="software"
android:layout_gravity="center_horizontal"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffffff"
android:gravity="right"
android:orientation="horizontal"
android:weightSum="1">
<Button
android:id="@+id/btx2"
android:text=" 取消"
android:textColor="#558544"
android:textSize="15sp"
android:background="#ffffff"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_weight="0.99" />
<Button
android:id="@+id/btx"
android:text="確定"
android:textColor="#558544"
android:textSize="15sp"
android:background="#ffffff"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />
</LinearLayout>
</LinearLayout>
上面是模仿網易雲音樂的音樂鬧鐘界面,我們可以添加獲取時間的方法來做成鬧鐘的應用。
以上爲基本對話框,另外還有時間,日期選擇功能的對話框和進度對話框,下面是用線程來模擬登錄的例子,其中用到了對話框
package com.example.a22345.life;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
/**
* Created by 22345 on 2016/7/25.
*/
public class Activity13 extends Activity {
ProgressDialog pd;
//進度框實例
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity13);
//本篇爲登錄內容
final EditText editText=(EditText)findViewById(R.id.passwordx);
final AutoCompleteTextView autoCompleteTextView=(AutoCompleteTextView)findViewById(R.id.emailx);
Button button=(Button)findViewById(R.id.sign_in);
//以上3步爲獲取xml佈局上的實例
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String email=editText.getText().toString();
//獲取輸入的帳號內容,並轉換爲字符串
String pswd=autoCompleteTextView.getText().toString();
//獲取輸入的密碼內容,並轉換爲字符串
if(email.equals("1")&&pswd.equals("1"))
{ //判讀是否可以通過
Dialog();
//上面是顯示dialog
//兩者同時運行,但是線程不一樣
//下面是新建子線程
new Thread(){
public void run() { //人爲製造的for循環耗時操作效果(Sleep)
for (int i = 0; i < 4; i++) {
try {
Thread.sleep(1000); //強制停頓1s
} catch (InterruptedException e) {
e.printStackTrace();
}
}
handler.sendEmptyMessage(0); //子線程給主線程發送消息
}
}.start();
//啓動線程
}
else if(email.equals("")&&email.equals(""))
{
Toast.makeText(Activity13.this,"寶寶沒有發現你沒有輸入帳號或者密碼!",Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(Activity13.this,"帳號或者密碼錯誤啦!",Toast.LENGTH_SHORT).show();
} //否則就提出錯誤提醒
}
});
//以上爲設置button監聽器
}
Handler handler=new Handler() //存在於UI主線程裏的handler
{
@Override
public void handleMessage(Message msg){
pd.dismiss(); //控制主線程裏的pd消失
Intent intent=new Intent(Activity13.this,Activity14.class);
startActivity(intent); //新的活動被打開
finish(); //舊的活動結束
}
};
public void Dialog()
{
pd=new ProgressDialog(this);
pd.setIcon(R.mipmap.ic_launcher); //圖標
pd.setTitle("正在登錄"); //題目
pd.setMessage("請稍後……"); //內容
pd.setCancelable(true); //可取消
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER); //圓形
pd.show(); //顯示
}
} //設置dialog方法,用來顯示對話框
分析:1.UI主線程正在運行,輸入帳號密碼後,通過gettext獲取輸入內容,用equal方法判斷,並提供未輸入或者輸入錯誤的提示
2.當輸入正確後,啓動dialog進度框,並同時啓動子線程,此時兩個線程分別走不同的線路,子線程所執行的操作就是sleep()延時效果,
通過for循環延時4s,最後由handler發出命令,回傳給handler裏的方法,執行方法達到進度框消失,新活動啓動,舊活動銷燬的效果
進度框會在4s後消失,並打開新的活動
2016.7.25 19:38 Surine