總網頁瀏覽量

2013年4月14日 星期日

Dialog(AlertDialog,ProgressDialog,自訂dialog,自訂Toast,View)

本文是AlertDialgo的實作
基本上當作SOP處理
記得實作AlertDialog基本架構


AlertDialog是一個類別,裡面包住Builder類別
AlertDialog是Dialog子類別。

本例子
全都用Button來觸動showDialog method


首先在Activity宣告AlertDialog的物件。
private AlertDialog alert;


一、true與false對話框:

private void showDialog1(){

AlertDialog.Builder builder = new AlertDialog.Builder(this);
//宣告AlertDialog裡的Builder物件
////this 是指Activity也就是對話框顯示所在的Activity,this為context型態

builder.setTitle("這是對話框標題");
builder.setMessage("這是對話框內容。是否刪除資料?");
builder.setCancelable(false);
//設定鎖住返回鍵,false表示禁止按下返回鍵,只能按"確定"與"取消"

//alertDidalog的"確認"按鈕,傳遞參數,按鈕的內容以及註冊傾聽者。實作傾聽者匿名內部類別。
builder.setPositiveButton("是", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,"資料已刪除",Toast.LENGTH_SHORT).show();
//由於Toast包在內部類別裡面所以this前面要加上MainActivity
//記得要加上show()
}
});

//alertDidalog的"取消"按鈕,其餘同上
builder.setNegativeButton("否", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "取消刪除", Toast.LENGTH_SHORT).show();
}
});

//最後務必記得要create() 跟show()
alert=builder.create();//create傳回Builder型態
alert.show();//.show() 傳回Dialog型態

}



二、列表式(list)對話框:按下button顯示多個項目,點其中一個項目,告知使用者所選的項目。
核心method :setItems(CharSequence[],DialogInterface.OnClickListener);

String items={"香蕉","芭樂","手榴彈","書"};


private void showDialog2(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setTitle("選擇一個喜歡的項目吧");
builder.setCancelable(true);

builder.setItems(items,new DialogInterface.OnClickListener() {
//傳入字串陣列items
@Override
public void onClick(DialogInterface dialog, int which) {
//which表示使用者所點選的項目
Toast.makeText(MainActivity.this, "你選擇了"+items[which], Toast.LENGTH_SHORT).show();
}
});
alert=builder.create();
alert.show();

}



三、自訂對話框:利用xml自訂對話框,與Dialog物件結合。Dialog是AlertDialog父類別。


private Dialog dialog;


private void showDialog3(){
dialog = new Dialog(this);
//對話框物件,this是context物件,表示對話框所在activity
dialog.setContentView(R.layout.newreg);//配接對話框
dialog.setTitle("註冊新帳號");

Button ok , cancel;
// ok=(Button)findViewById(R.id.ok);
//必須指定是哪個Activity、Dialog在findViewById,否則會出現NullPointerException,找不到對應物件。
ok = (Button)dialog.findViewById(R.id.ok);
//使用dialog下的findviewbyid
cancel = (Button)dialog.findViewById(R.id.cancel);
username = (EditText)dialog.findViewById(R.id.username);
passwd = (EditText)dialog.findViewById(R.id.passwd);

ok.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View v) {
String uname = username.getText().toString();
String password=passwd.getText().toString();

Toast.makeText(MainActivity.this, uname+":"+password, Toast.LENGTH_SHORT).show();
dialog.dismiss();//解散(關閉)對話框
}});

cancel.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "cancel", Toast.LENGTH_SHORT)
.show();
dialog.dismiss();
}});
dialog.show();//別忘了要show()
}




四、ProgressDialog:
實作下載檔案時常會出現的對話框
宣告ProgressDialog物件
利用執行緒計算count、Handler處理長條bar的運作

private ProgressDialog progress;
private MyHandler handler = new MyHandler();

//private Handler handler;
//打錯,造成NullPointerException
//記得要new MyHandler();否則也會造成NullPointerException





private void showDialog4(){

progress = new ProgressDialog(this);
progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
//progress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
//Spinner表示畫圓圈,Horizontal表示長條bar
progress.setCancelable(false);
progress.setMessage("Loading.....");
progress.setMax(123);//長條bar最大長度


new MyThread().start();

progress.show();

}

private class MyThread extends Thread{
@Override
public void run() {
for(int i=0;i<=123;i++){
//改成i+=2  長條bar只會跑到122就停止

handler.sendEmptyMessage(i);
//忘了打這行造成,progressDialog只開啟視窗卻沒有跑

//progress.setProgress(i);
//其實可以直接在thread處理也有同樣效果,但忘了為何在Handler處理會比較好

try {
Thread.sleep(60);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}

progress.dismiss();
}
}


private class MyHandler extends Handler{

@Override
public void handleMessage(Message msg)
{
progress.setProgress(msg.what);//傳入參數設定長條bar的值
if(msg.what==progress.getMax()){
progress.dismiss();

}
}

}


五、自訂View並將View鑲嵌進Toast,變成自訂Toast

利用context提供的method getLayoutInflater建立自訂view
LayoutIflater inflater= getLayoutInflater()



private void showMyToast(int status , String info){

LayoutInflater inflater = getLayoutInflater();
//Activity的method
//將自己設計的layout轉成View

View layout = inflater.inflate(R.layout.mytoast, (ViewGroup)findViewById(R.id.root));
//R.id.root是xml中layout的id
//將xml檔mytoast裡面的ViewGroup(Layout及其元件)轉成View
//setContentView(layoutID)會直接將layout貼上畫面


ImageView img = (ImageView)layout.findViewById(R.id.img);
TextView msg= (TextView)layout.findViewById(R.id.msg);

//注意Img跟msg是屬於變數layout裡面的
//所以是layout之中findview,不是MainActivity findview


switch(status){

case 1:

img.setImageResource(R.drawable.warning);
break;

case 2:
img.setImageResource(R.drawable.warning);
break;

default:
img.setImageResource(R.drawable.warning);
break;


}

msg.setText(info);
//TextView mag秀出文字

Toast toast = new Toast(this);

toast.setView(layout);//將自訂view放入toast
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 100);
//(,xoffset,yoffset)
//設置toast的位置

toast.setDuration(Toast.LENGTH_SHORT);
toast.show();

}


六、另一種自訂View

另一種自訂View是將java鑲嵌到layout檔案
在java檔案中寫class繼承view
在layout寫
<com.example.signature.MainPanel  

 />

沒有留言:

張貼留言