Android系統(tǒng)對話框使用詳解(最詳細)
在實際應(yīng)用開發(fā)中,用到系統(tǒng)對話框中的情況幾乎是沒有的。按開發(fā)流程來說,UI工程師都會給出每一個彈窗的樣式,故而在實際開發(fā)中都是自定義彈窗的。
即使用到的地方不多,但是我們也是需要了解并且能熟練的運用它,下面為大家奉上各種系統(tǒng)對話框的實現(xiàn)。
目錄
一、系統(tǒng)對話框的幾種類型與實現(xiàn)
在項目的實際開發(fā)中,用到的系統(tǒng)對話框幾乎是沒有的。原因大概包含以下幾點:
樣式過于單一,不能滿足大部分實際項目中的需求。
對話框的樣式會根據(jù)手機系統(tǒng)版本的不同而變化。不能達到統(tǒng)一的樣式。
能實現(xiàn)的功能過于簡單。
在這里先附上下面代碼中出現(xiàn)文本的string.xml文件。
<string name="dialog_normal_content">我是普通dialog</string> <string name="dialog_normal_more_button_content">我是普通多按鈕dialog</string> <string name="dialog_btn_confirm_text">確定</string> <string name="dialog_btn_cancel_text">取消</string> <string name="dialog_btn_neutral_text">忽略</string> <string name="dialog_btn_confirm_hint_text">您點擊了確定按鈕</string> <string name="dialog_btn_cancel_hint_text">您點擊了取消按鈕</string> <string name="dialog_btn_neutral_hint_text">您點擊了忽略按鈕</string>
1、普通對話框
在實際項目開發(fā)中,此類型對話框中用到的地方要比其他類型的對話框多一些。但是考慮UI統(tǒng)一問題,也會很少用。
運行截圖:
代碼:
private void showNormalDialog(){ //創(chuàng)建dialog構(gòu)造器 AlertDialog.Builder normalDialog = new AlertDialog.Builder(this); //設(shè)置title normalDialog.setTitle(getString(R.string.dialog_normal_text)); //設(shè)置icon normalDialog.setIcon(R.mipmap.ic_launcher_round); //設(shè)置內(nèi)容 normalDialog.setMessage(getString(R.string.dialog_normal_content)); //設(shè)置按鈕 normalDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text) , new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(DialogActivity.this,getString(R.string.dialog_btn_confirm_hint_text) ,Toast.LENGTH_SHORT).show(); dialog.dismiss(); } }); //創(chuàng)建并顯示 normalDialog.create().show(); }
系統(tǒng)對話框都是支持鏈式調(diào)用的,舉例:
new AlertDialog.Builder(this) .setTitle(getString(R.string.dialog_normal_text)) .setIcon(R.mipmap.ic_launcher_round) .setMessage(getString(R.string.dialog_normal_content)) .setPositiveButton(getString(R.string.dialog_btn_confirm_text) , new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(DialogActivity.this,getString(R.string.dialog_btn_confirm_hint_text) ,Toast.LENGTH_SHORT).show(); dialog.dismiss(); } }) .create() .show();
下面的代碼都是可以用鏈式調(diào)用的,這里就不展示了。
2、普通對話框(多按鈕)
在系統(tǒng)對話框中最多出現(xiàn)三個按鈕,即PositiveButton(確定)、NegativeButton(取消)、NeutralButton(忽略)。
運行截圖:
代碼:
private void showNormalMoreButtonDialog(){ AlertDialog.Builder normalMoreButtonDialog = new AlertDialog.Builder(this); normalMoreButtonDialog.setTitle(getString(R.string.dialog_normal_more_button_text)); normalMoreButtonDialog.setIcon(R.mipmap.ic_launcher_round); normalMoreButtonDialog.setMessage(getString(R.string.dialog_normal_more_button_content)); //設(shè)置按鈕 normalMoreButtonDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text) , new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(DialogActivity.this ,getString(R.string.dialog_btn_confirm_hint_text),Toast.LENGTH_SHORT).show(); dialog.dismiss(); } }); normalMoreButtonDialog.setNegativeButton(getString(R.string.dialog_btn_cancel_text) , new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(DialogActivity.this, getString(R.string.dialog_btn_cancel_hint_text),Toast.LENGTH_SHORT).show(); dialog.dismiss(); } }); normalMoreButtonDialog.setNeutralButton(getString(R.string.dialog_btn_neutral_text) , new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(DialogActivity.this, getString(R.string.dialog_btn_neutral_hint_text),Toast.LENGTH_SHORT).show(); dialog.dismiss(); } }); normalMoreButtonDialog.create().show(); }
也可以用下面的實現(xiàn)方式,和上面的代碼效果是一樣的。
private void showNormalMoreButtonDialog(){ DialogInterface.OnClickListener setListener = null; AlertDialog.Builder normalMoreButtonDialog = new AlertDialog.Builder(this); normalMoreButtonDialog.setTitle(getString(R.string.dialog_normal_more_button_text)); normalMoreButtonDialog.setIcon(R.mipmap.ic_launcher_round); normalMoreButtonDialog.setMessage(getString(R.string.dialog_normal_more_button_content)); setListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which){ case DialogInterface.BUTTON_POSITIVE: Toast.makeText(DialogActivity.this, getString(R.string.dialog_btn_confirm_hint_text),Toast.LENGTH_SHORT).show(); dialog.dismiss(); break; case DialogInterface.BUTTON_NEUTRAL: Toast.makeText(DialogActivity.this ,getString(R.string.dialog_btn_neutral_hint_text),Toast.LENGTH_SHORT).show(); dialog.dismiss(); break; case DialogInterface.BUTTON_NEGATIVE: Toast.makeText(DialogActivity.this ,getString(R.string.dialog_btn_cancel_hint_text),Toast.LENGTH_SHORT).show(); dialog.dismiss(); break; } } }; normalMoreButtonDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text),setListener); normalMoreButtonDialog.setNegativeButton(getString(R.string.dialog_btn_cancel_text),setListener); normalMoreButtonDialog.setNeutralButton(getString(R.string.dialog_btn_neutral_text),setListener); normalMoreButtonDialog.create().show(); }
3、普通列表對話框
此種類型的對話框能實現(xiàn)簡單的列表。
運行截圖:
代碼:
/** * 普通列表dialog */ private void showListDialog(){ final String listItems[] = new String[]{"listItems1","listItems2","listItems3", "listItems4","listItems5","listItems6"}; AlertDialog.Builder listDialog = new AlertDialog.Builder(this); listDialog.setTitle(getString(R.string.dialog_list_text)); listDialog.setIcon(R.mipmap.ic_launcher_round); /* 設(shè)置item 不能用setMessage() 用setItems items : listItems[] -> 列表項數(shù)組 listener -> 回調(diào)接口 */ listDialog.setItems(listItems,new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(DialogActivity.this,listItems[which],Toast.LENGTH_SHORT).show(); } }); //設(shè)置按鈕 listDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text) , new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); listDialog.create().show(); }
4、單選對話框
運行截圖:
代碼:
private void showRadioDialog(){ final String radioItems[] = new String[]{"radioItem1","radioItem1","radioItem1","radioItem1"}; AlertDialog.Builder radioDialog = new AlertDialog.Builder(this); radioDialog.setTitle(getString(R.string.dialog_radio_text)); radioDialog.setIcon(R.mipmap.ic_launcher_round); /* 設(shè)置item 不能用setMessage() 用setSingleChoiceItems items : radioItems[] -> 單選選項數(shù)組 checkItem : 0 -> 默認選中的item listener -> 回調(diào)接口 */ radioDialog.setSingleChoiceItems(radioItems, 0, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(DialogActivity.this,radioItems[which],Toast.LENGTH_SHORT).show(); } }); //設(shè)置按鈕 radioDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text) , new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); radioDialog.create().show(); }
5、多選對話框
運行截圖:
代碼:
private void showCheckBoxDialog(){ final String checkBoxItems[] = new String[]{"checkBoxItems1","checkBoxItems2", "checkBoxItems3","checkBoxItems4"}; final boolean isCheck[] = new boolean[]{false,true,true,false}; AlertDialog.Builder checkBoxDialog = new AlertDialog.Builder(this); checkBoxDialog.setTitle(getString(R.string.dialog_check_box_text)); checkBoxDialog.setIcon(R.mipmap.ic_launcher_round); /* 設(shè)置item 不能用setMessage() 用setMultiChoiceItems items : radioItems[] -> 多選選項數(shù)組 checkItems : isCheck[] -> 是否選中數(shù)組 listener -> 回調(diào)接口 */ checkBoxDialog.setMultiChoiceItems(checkBoxItems, isCheck , new DialogInterface.OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { if (isChecked){ Toast.makeText(DialogActivity.this, checkBoxItems[which] + " 選中",Toast.LENGTH_SHORT).show(); }else { Toast.makeText(DialogActivity.this, checkBoxItems[which] + " 未選中",Toast.LENGTH_SHORT).show(); } } }); //設(shè)置按鈕 checkBoxDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text) , new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); checkBoxDialog.create().show(); }
6、帶輸入框的彈窗
運行截圖:
代碼:
private void showEditDialog(){ final EditText edit = new EditText(this); AlertDialog.Builder editDialog = new AlertDialog.Builder(this); editDialog.setTitle(getString(R.string.dialog_edit_text)); editDialog.setIcon(R.mipmap.ic_launcher_round); //設(shè)置dialog布局 editDialog.setView(edit); //設(shè)置按鈕 editDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text) , new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(DialogActivity.this, edit.getText().toString().trim(),Toast.LENGTH_SHORT).show(); dialog.dismiss(); } }); editDialog.create().show(); }
7、自定義布局的對話框
此類型的對話框在實際項目開發(fā)中用到的地方比提示對話框用到的地方要多一些,不過在項目幾乎上都是自定義的對話框...
運行截圖:
布局文件:custom_dialog_layout.xml
<TextView android:id="@+id/dialog_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="15sp" android:textColor="@color/colorPrimary" android:gravity="center" android:padding="12dp"/> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/ic_launcher"/> <Button android:id="@+id/dialog_btn_confirm" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/colorAccent" android:textSize="15sp" android:text="@string/dialog_btn_confirm_text" android:layout_centerHorizontal="true"/> <Button android:id="@+id/dialog_btn_cancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/colorAccent" android:textSize="15sp" android:text="@string/dialog_btn_cancel_text" android:layout_centerHorizontal="true" android:layout_alignParentRight="true"/> </RelativeLayout> </LinearLayout>
代碼:
private void showLayoutDialog() { //加載布局并初始化組件 View dialogView = LayoutInflater.from(this).inflate(R.layout.custom_dialog_layout,null); TextView dialogText = (TextView) dialogView.findViewById(R.id.dialog_text); Button dialogBtnConfirm = (Button) dialogView.findViewById(R.id.dialog_btn_confirm); Button dialogBtnCancel = (Button) dialogView.findViewById(R.id.dialog_btn_cancel); final AlertDialog.Builder layoutDialog = new AlertDialog.Builder(this); layoutDialog.setTitle(getString(R.string.dialog_custom_layout_text)); layoutDialog.setIcon(R.mipmap.ic_launcher_round); layoutDialog.setView(dialogView); //設(shè)置組件 dialogText.setText("我是自定義layout的彈窗??!"); dialogBtnConfirm .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(DialogActivity.this,"我是自定義layout的彈窗!!",Toast.LENGTH_SHORT).show(); } }); dialogBtnConfirm .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { layoutDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { dialog.dismiss(); } }); } }); layoutDialog.create().show(); }
以上就是Android系統(tǒng)彈窗的幾種實現(xiàn)方式,幾乎涵蓋了能解決各種簡單需求。其中自定義布局的方式奠定了自定義彈窗的基本實現(xiàn)。
二、總結(jié)
可以看出上面的幾種實現(xiàn)方式都是通過AlertDialog類實現(xiàn)的。有興趣的可以看Android源碼中的AlertDialog類實現(xiàn)。
以上所述是小編給大家介紹的Android系統(tǒng)對話框使用詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Android判斷當(dāng)前棧頂Activity的包名代碼示例
這篇文章主要介紹了Android判斷當(dāng)前棧頂Activity的包名代碼示例,分享了相關(guān)代碼,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-02-02Android中使用Canvas繪制南丁格爾玫瑰圖(Nightingale rose diagram)
這篇文章主要介紹了Android中使用Canvas繪制南丁格爾玫瑰圖(Nightingale rose diagram),本文直接給出實現(xiàn)代碼和運行效果圖,需要的朋友可以參考下2015-03-03