編輯:關於Android編程
日常生活中我們隨處可見對話框,上面有很多提示信息,更加方便提示用戶進行不同的操作。
一、對話框的兩個特點和一些常見的對話框
1.當彈出對話框是會結束UI線程(即主線程);
2.當前的Activity會失去焦點;
3.消息對話框、確認對話框、列表對話框、單選和多選對話框、自定義對話框
二、對話框的組成(一般有四部分組成)
1.圖標
2.標題
3.內容
4.按鈕
三、那麼如何創建一個對話框呢?(四步組成)
1.第一步創建AlertDialog.Builder對象(建造者模式)
2.第二步設置圖標、標題、內容和按鈕等區域
3.第三步調用create()方法來創建(一般自動調用)
4.第四步調用show()方法來顯示
四、點擊跳轉界面和長按彈出對話框的業務邏輯
1.接著上面的學的ListView來實現常見的操作,在日常生活中,我們經常聊qq,在聊天列表中,但我們點擊某一行時,會進入聊天界面,當我們長按某一行時,會彈出置頂和刪除小提示。
2.MainActivity.java代碼如下
package com.oldtogether.adapterdemo2; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.View; import android.view.View.OnLongClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; public class MainActivity4 extends ActionBarActivity implements OnItemClickListener, OnItemLongClickListener { // 創建數組,采用for循環進行遍歷 private int[] imageIds = new int[] { R.drawable.daxiang, R.drawable.maozi, R.drawable.nangua, R.drawable.nanguobq, R.drawable.tiaopi, R.drawable.xiaolian, R.drawable.xin, R.drawable.weixin, R.drawable.hongx, R.drawable.xm }; private String[] titles = new String[] { "賣萌大象", "聖誕帽子", "憤怒南瓜", "難過表情", "調皮表情", "我倩的笑臉表情", "oldtogether愛心", "微信", "粉色少女心", "一代撸" }; private String[] versions = new String[] { "版本:1.10", "版本:2.10", "版本:1.11", "版本:2.12", "版本:3.10", "版本:2.20", "版本:5.20", "版本:1.23", "版本:2.21", "版本:2.40", }; private String[] sizes = new String[] { "大小:32.01M", "大小:32.02M", "大小:23.01M", "大小:11.01M", "大小:41.01M", "大小:11.01M", "大小:33.01M", "大小:33.01M", "大小:33.01M", "大小:33.01M", }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listview); // 1、過的ListView對象 ListView lv = (ListView) findViewById(R.id.lv_play); // 2、數據源 List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); for (int i = 0; i < titles.length; i++) { Map<String, Object> map = new HashMap<String, Object>(); map.put("logo", imageIds[i]); map.put("title", titles[i]); map.put("version", versions[i]); map.put("size", sizes[i]); list.add(map); } // 3、設置適配器 MyAdapter3 adapter3 = new MyAdapter3(this); adapter3.setList(list);// 傳入數據 // 4、關聯適配器 lv.setAdapter(adapter3); // 5、為ListView設置事件監聽器(一下兩個常用事件),讓主MainActivity2實現接口,並重寫方法 lv.setOnItemClickListener(this); lv.setOnItemLongClickListener(this); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { /* 創建了一個意圖對象,調用setClass方法表明“在那個Activity中調用那個Activity”次意圖*/ Intent intent = new Intent(); intent.setClass(getApplicationContext(), DetailActivity.class); //獲得點擊行的數據 HashMap <String,Object> itemMap= (HashMap<String,Object>) parent.getItemAtPosition(position); intent.putExtra("index", ""+position);//獲得編號 intent.putExtra("title", ""+itemMap.get("title"));//獲得標題 startActivity(intent); } @Override public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { AlertDialog.Builder builder=new AlertDialog.Builder(this); builder.setIcon(R.drawable.ic_launcher); builder.setTitle("消息提示"); builder.setMessage("這是一個簡單的標題"); builder.setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //點擊對話框中的確定按鈕會出現一個Toast提示框 Toast.makeText(MainActivity4.this, "點擊了確定", Toast.LENGTH_LONG).show(); } }); builder.create().show(); return true; /* * 返回值代表了事件的消化 1、true:表示消化掉事件,事件不會繼續傳遞 2、false:表示不消化事件,事件繼續傳遞 * 結論:如果希望長按事件後,不在出現點擊事件,則應將返回值設置為true */ } }
3.代碼簡潔之“連點”
1).通過創建者模式獲得Builder對象,然後通過連點方式調用其方法可使代碼簡化;
2).連點使用的原則是,所調用的方法返回值是當前對象本身;
3).下面是通過連點在長按方法中實現此相同功能的代碼。
@Override public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { new AlertDialog.Builder(this) .setIcon(R.drawable.ic_launcher) .setTitle("消息提示") .setMessage("這是一個簡單的標題") .setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity4.this, "點擊了確定", Toast.LENGTH_LONG).show(); } }) .show(); return true; }
4.運行結果
五、上面是消息對話框的實現,再次緊接著學習確認對話框
1.隨處可見的確認對話框,用途:經常用於一些征求用戶決定的操作,比如退出數據、刪除數據、確認支付等。
2.直接貼代碼
package com.oldtogether.adapterdemo2; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.View; import android.view.View.OnLongClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; public class MainActivity4 extends ActionBarActivity implements OnItemClickListener, OnItemLongClickListener { // 創建數組,采用for循環進行遍歷 private int[] imageIds = new int[] { R.drawable.daxiang, R.drawable.maozi, R.drawable.nangua, R.drawable.nanguobq, R.drawable.tiaopi, R.drawable.xiaolian, R.drawable.xin, R.drawable.weixin, R.drawable.hongx, R.drawable.xm }; private String[] titles = new String[] { "賣萌大象", "聖誕帽子", "憤怒南瓜", "難過表情", "調皮表情", "我倩的笑臉表情", "oldtogether愛心", "微信", "粉色少女心", "一代撸" }; private String[] versions = new String[] { "版本:1.10", "版本:2.10", "版本:1.11", "版本:2.12", "版本:3.10", "版本:2.20", "版本:5.20", "版本:1.23", "版本:2.21", "版本:2.40", }; private String[] sizes = new String[] { "大小:32.01M", "大小:32.02M", "大小:23.01M", "大小:11.01M", "大小:41.01M", "大小:11.01M", "大小:33.01M", "大小:33.01M", "大小:33.01M", "大小:33.01M", }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listview); // 1、過的ListView對象 ListView lv = (ListView) findViewById(R.id.lv_play); // 2、數據源 List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); for (int i = 0; i < titles.length; i++) { Map<String, Object> map = new HashMap<String, Object>(); map.put("logo", imageIds[i]); map.put("title", titles[i]); map.put("version", versions[i]); map.put("size", sizes[i]); list.add(map); } // 3、設置適配器 MyAdapter3 adapter3 = new MyAdapter3(this); adapter3.setList(list);// 傳入數據 // 4、關聯適配器 lv.setAdapter(adapter3); // 5、為ListView設置事件監聽器(一下兩個常用事件),讓主MainActivity2實現接口,並重寫方法 lv.setOnItemClickListener(this); lv.setOnItemLongClickListener(this); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { /* 創建了一個意圖對象,調用setClass方法表明“在那個Activity中調用那個Activity”次意圖*/ Intent intent = new Intent(); intent.setClass(getApplicationContext(), DetailActivity.class); //獲得點擊行的數據 HashMap <String,Object> itemMap= (HashMap<String,Object>) parent.getItemAtPosition(position); intent.putExtra("index", ""+position);//獲得編號 intent.putExtra("title", ""+itemMap.get("title"));//獲得標題 startActivity(intent); } @Override public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { //長按之確定對話框 new AlertDialog.Builder(this) .setIcon(R.drawable.ic_launcher) .setTitle("你確定要退出嗎?") .setNegativeButton("取消", null)//null,說明不進行自定義的任何操作,只是單純的關閉當前對話框,又停在原界面 .setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish();//關閉當前Activity } }) .show(); return true; } }
3.運行結果
4.補充:當點擊取消是會停留在當前Activity;當點擊確定會退出當前Activity,返回到模擬器主界面。
六、列表對話框
1.用途:以列表的形式展示數據、列表項可點擊、需要一個數組資源作為數據源。
2.核心方法:setItems();在准備一個數組資源;
3.代碼如下:
package com.oldtogether.adapterdemo2; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.View; import android.view.View.OnLongClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; public class MainActivity4 extends ActionBarActivity implements OnItemClickListener, OnItemLongClickListener { // 創建數組,采用for循環進行遍歷 private int[] imageIds = new int[] { R.drawable.daxiang, R.drawable.maozi, R.drawable.nangua, R.drawable.nanguobq, R.drawable.tiaopi, R.drawable.xiaolian, R.drawable.xin, R.drawable.weixin, R.drawable.hongx, R.drawable.xm }; private String[] titles = new String[] { "賣萌大象", "聖誕帽子", "憤怒南瓜", "難過表情", "調皮表情", "我倩的笑臉表情", "oldtogether愛心", "微信", "粉色少女心", "一代撸" }; private String[] versions = new String[] { "版本:1.10", "版本:2.10", "版本:1.11", "版本:2.12", "版本:3.10", "版本:2.20", "版本:5.20", "版本:1.23", "版本:2.21", "版本:2.40", }; private String[] sizes = new String[] { "大小:32.01M", "大小:32.02M", "大小:23.01M", "大小:11.01M", "大小:41.01M", "大小:11.01M", "大小:33.01M", "大小:33.01M", "大小:33.01M", "大小:33.01M", }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listview); // 1、過的ListView對象 ListView lv = (ListView) findViewById(R.id.lv_play); // 2、數據源 List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); for (int i = 0; i < titles.length; i++) { Map<String, Object> map = new HashMap<String, Object>(); map.put("logo", imageIds[i]); map.put("title", titles[i]); map.put("version", versions[i]); map.put("size", sizes[i]); list.add(map); } // 3、設置適配器 MyAdapter3 adapter3 = new MyAdapter3(this); adapter3.setList(list);// 傳入數據 // 4、關聯適配器 lv.setAdapter(adapter3); // 5、為ListView設置事件監聽器(一下兩個常用事件),讓主MainActivity2實現接口,並重寫方法 lv.setOnItemClickListener(this); lv.setOnItemLongClickListener(this); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { /* 創建了一個意圖對象,調用setClass方法表明“在那個Activity中調用那個Activity”次意圖*/ Intent intent = new Intent(); intent.setClass(getApplicationContext(), DetailActivity.class); //獲得點擊行的數據 HashMap <String,Object> itemMap= (HashMap<String,Object>) parent.getItemAtPosition(position); intent.putExtra("index", ""+position);//獲得編號 intent.putExtra("title", ""+itemMap.get("title"));//獲得標題 startActivity(intent); } @Override public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { //列表對話框 final String [] sites={"打印店","男生公寓","女生公寓","清真食堂","大眾食堂","圖書館","洗浴中心"};//設置為final(常量)的原因是可以穿透作用域 new AlertDialog.Builder(this) .setTitle("蘭州城市學院培黎校區") .setItems(sites, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //參數 which代表了消息對話框中的第幾項 Toast.makeText(MainActivity4.this, "您選擇了"+sites[which], Toast.LENGTH_LONG).show(); } }) .setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //關閉的對話框的第二種方式,重寫一個沒有任何邏輯的空方法 } }) .show(); return true; } }
4.運行結果
七、單選對話框
1.單選對話框,用途:需要用戶進行單行選擇是進行使用;核心方法:setSingleChoiceItems();
2.實現步驟
1).准備一個數組資源(一般設置為常量數組,為了方便穿透作用域);
2).調用setSingleChioceItems()設置單選列表項。
3.代碼實現(直接在onItemLongClick寫Dialog相關代碼,其他代碼一樣)
//在主類中的全局變量1、暫存用戶所選的評分級別;(另外如果將此變量初始值設為0,直接點擊確定會出現1星評分,有bug)2、方便穿透作用域; int selectedId = -1; @Override public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { //長按之單選對話框 final String [] stars={"1星","2星","2星","3星","4星","5星"};//設置為final(常量)的原因是可以穿透作用域 new AlertDialog.Builder(this) .setTitle("大胸弟,來個5星的評分吧!") .setSingleChoiceItems(stars, -1, new DialogInterface.OnClickListener() { /* * 第一個參數:所要顯示的資源數組; * 第二個參數:在單選對話框列表中默認情況先所選擇的行標(這裡設置為-1的原因是數組默認情況先下標從0開始,如果將此參設置為0,跳出單選對話框時默認情況下會為1星評分,有bug); * 第三個參數:點擊某行事件,自定義業務邏輯代碼(這裡只用簡單的Toast來實現); * 補充:dialog.dismiss()讓對話框消失。 */ @Override public void onClick(DialogInterface dialog, int which) { selectedId = which;//在用戶單選時起到一個暫存的作用,方便確定是被引用 Toast.makeText(MainActivity4.this, "您當前選擇了:"+stars[which], Toast.LENGTH_LONG).show(); } }) .setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity4.this, "您最終的決定是:"+stars[selectedId], Toast.LENGTH_LONG).show(); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //空操作的方法 } }) .show(); return true; }
4.運行結果
八、多選對話框
1.多選對話框。用途:提供用戶進行多項選擇;核心方法setMultiChoiceItems();(multi:英語中多的意思)
2.實現步驟
1).准備一個數組資源;
2).調用setMultiChoiceItems()方法設置多選項列表;
3.代碼的實現(同理直接貼onItemLongClick()方法代碼)
ArrayList<Integer> choice = new ArrayList<>();//創建一個ArrayList用來保存在Dialog中所選擇的選項,同理設置為全局變量為了穿透作用域 @Override public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { //長按之多選框對話框 final String [] interests={"看書","打籃球","大lol","聽音樂","看電影","跑步"};//設置為final(常量)的原因是可以穿透作用域 new AlertDialog.Builder(this) .setIcon(R.drawable.ic_launcher) .setTitle("你的愛好是什麼?") /* * setMultiChoiceItems()方法中的三個參數 * 第一個參數:資源數組; * 第二個參數:默認情況下的初始值,這裡因為是多選,所以設置為boolean類型的數組; * 第三個參數:多選框的點擊事件; * */ .setMultiChoiceItems(interests, new boolean []{false,false,false,false,false,false}, new DialogInterface.OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { /* * 第一個參數:dialog對象; * 第二個參數:多選對話框中用戶所選中的項; * 第三個參數:是否選中,true為選中,false為沒有選中 * */ //選中則添加,後悔是時還可以remove掉 if(isChecked){ choice.add(which); }else{ choice.remove(which); } Toast.makeText(MainActivity4.this, "您當前的選擇是:"+choice.toString(), Toast.LENGTH_LONG).show(); } }) .setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(MainActivity4.this, "您最終的決定是:"+choice.toString(), Toast.LENGTH_LONG).show(); } }) .setNegativeButton("取消", null) .show(); return true; } }
4.運行結果
九、心得總結
1.提到對話框可以直接腦補出對話款的組成,和創建對話框的步驟;
2.在單選對話框中設置默認初始值時,“-1”的巧用,關鍵點是數組下標從0開始,容易出現bug;
3.關閉對話框的兩種方法(在點擊負面按鈕時)。第一種:在次方法中的第二個參數添加一個重操作即沒有任何邏輯代碼點擊事件即可;第二種:直接將第二個參數設置為null;
4.兩次經典的穿透作用域(附帶魔法和物理傷害)。第一次在定義數據資源的時候,將數組資源用final修飾,讓其為常量,方便在其他方法中調用,即穿透作用域;第二次在創建單選和多選對話框時,setSingleChioceItems()和setMultiChoiceItems()方法中有時候用戶可能會修改第一次的選擇,而將次選擇暫存在一個最外層類的成員變量中(這裡的int selectedId和泛型ArrayList對象),方便在點擊確定按鈕即調用onClick方法是被利用,同樣再次穿透了作用域;
5.總之,日常生活中常見各種對話框,合理利用對話框會更好的實現界面與用戶之間的交流。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。
Android Studio安裝更新終極解決方式之前寫過一篇Android SDK無法更新的博文,其實該方式對Android Studio同樣有效,大伙可以下載網盤中分享
1.下面示例是一個簡單的定位,來自官網,對這些源碼加了一些注釋,這樣看起來可能會更容易理解一點。2.直接上源碼androidManifest.xml
Android裡面的單選框和html中的其實是一樣的效果。這裡用到兩個控件:CheckBox和RadioGroup。直接上代碼:radio.xml布局文件:
如果你在開發過程中經常使用 RadioGroup,那你是否遇到過下面這種情況每當你點擊EditText彈出輸入法時,RadioGroup總是向上移動到輸入法的上面。你可能