【Android】各式各樣的彈出框與對菜單鍵、返回鍵的監聽

來源:互聯網
上載者:User

標籤:android   對話方塊   彈出框   menu   監聽   

Android內建各式各樣的彈出框,彈出框也是安卓基本的組件之一。同時安卓程式可以對菜單鍵、返回鍵的監聽,但在安卓4.0之後就禁止對Home鍵的屏蔽與監聽,強制保留為系統守護按鍵,如果非要對Home鍵的屏蔽與監聽,就會出現java.lang.IllegalArgumentException: Window type can not be changed after the window is added.的錯誤。

下面寫一個小程式,來說明Android各式各樣的彈出框,同時,安卓是如何對菜單鍵、返回鍵的監聽。

如:


按下Menu鍵則在彈出訊息,

之後這個程式提供各式各樣的彈出框。

每一個彈出框添加不同的監聽器,用來監聽使用者對各個按鈕的點擊。

最後按下返回鍵,結束這個程式。

這個程式比較簡單,就一個Activity。

1、首先是在res\values\strings.xml設定app名字與各個按鈕的顯示內容如下:

<?xml version="1.0" encoding="utf-8"?><resources>    <string name="app_name">彈出框</string>    <string name="action_settings">Settings</string>    <string name="button1">帶多按鈕的彈出框</string>    <string name="button2">帶列表的彈出框</string>    <string name="button3">帶單選列表的彈出框</string>    <string name="button4">帶多選列表的彈出框</string></resources>
2、之後,與《【Android】利用Notification操作裝置的通知欄》(點擊開啟連結),在res\layout\activity_main.xml設定一個自上而下的線性布局。擺放四個按鈕,分別給四個按鈕,設定不同的id,一會兒在MainActivity.java進行監聽。各式各樣的彈出框是通過java產生的。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <Button        android:id="@+id/button1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/button1"        android:textSize="24sp" />    <Button        android:id="@+id/button2"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/button2"        android:textSize="24sp" />    <Button        android:id="@+id/button3"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/button3"        android:textSize="24sp" />    <Button        android:id="@+id/button4"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/button4"        android:textSize="24sp" /></LinearLayout>

3、最後是對MainActivity.java檔案的編寫。整個程式分為兩部分,一個是擷取各個按鈕之後,對不同按鈕的點擊事件,添加各式各樣的點擊事件,裡面產生不同的彈出框。帶多按鈕的彈出框通過AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();建立,帶列表的對話方塊,則通過AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);去建立。它們都可以通過setIcon與setTitle設定表徵圖與標題,但是之後的監聽器的標題是不同的。注意監聽器的重名問題,重名的監聽器,必須在聲明其所在類進行區分,否則無法通過編譯。

程式另一部分是對物理按鈕的監聽,這個很簡單的。無需使用xml進行聲明,直接寫監聽代碼即可。

package com.alertdialog;import android.os.Bundle;import android.view.KeyEvent;import android.view.View;import android.widget.Button;import android.widget.Toast;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.DialogInterface.OnMultiChoiceClickListener;public class MainActivity extends Activity {private Button button1;private Button button2;private Button button3;private Button button4;private String[] listItems = new String[] { "選項1", "選項2", "選項3", "選項4" };// 選項清單項目數組@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button1 = (Button) findViewById(R.id.button1);button2 = (Button) findViewById(R.id.button2);button3 = (Button) findViewById(R.id.button3);button4 = (Button) findViewById(R.id.button4);// 這裡的普通按鈕點擊監聽器與對話方塊按鈕的點擊監聽器是不同的,要聲明是View這個類button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();alertDialog.setIcon(R.drawable.ic_launcher);// 設定對話方塊的表徵圖為應用程式的表徵圖alertDialog.setTitle("帶多按鈕的彈出框");alertDialog.setMessage("對話方塊的內容");// 這裡的對話方塊按鈕的點擊監聽器與普通按鈕點擊監聽器是不同的,要聲明是DialogInterface這個類alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface arg0, int arg1) {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "取消按鈕被點擊",Toast.LENGTH_LONG).show();}});// 不想要這個按鈕則不寫這個方法alertDialog.setButton(DialogInterface.BUTTON_NEUTRAL, "中立",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface arg0, int arg1) {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "中立按鈕被點擊",Toast.LENGTH_LONG).show();}});// 不想要這個按鈕則不寫這個方法alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface arg0, int arg1) {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "OK按鈕被點擊",Toast.LENGTH_LONG).show();}});alertDialog.show();// 必須要有這個方法,否則對話方塊不顯示}});button2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubAlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);// 這裡區別與其它組件的builder,必須這樣寫builder.setIcon(R.drawable.ic_launcher);// 設定對話方塊的表徵圖為應用程式的表徵圖builder.setTitle("帶列表的彈出框");builder.setItems(listItems,new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface arg0, int which) {Toast.makeText(MainActivity.this,listItems[which] + "被點擊",Toast.LENGTH_LONG).show();}});builder.create().show();// 必須要有這個方法,否則對話方塊不顯示}});button3.setOnClickListener(new View.OnClickListener() {private String chooseItem;// 用於記錄被選擇的項@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubAlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);// 這裡區別與其它組件的builder,必須這樣寫builder.setIcon(R.drawable.ic_launcher);// 設定對話方塊的表徵圖為應用程式的表徵圖builder.setTitle("帶列表的彈出框");builder.setSingleChoiceItems(listItems, 0,new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface arg0, int which) {chooseItem = listItems[which];}});builder.setPositiveButton("確定",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface arg0, int which) {Toast.makeText(MainActivity.this,chooseItem + "被點擊", Toast.LENGTH_LONG).show();}});builder.create().show();// 必須要有這個方法,否則對話方塊不顯示}});button4.setOnClickListener(new View.OnClickListener() {private boolean[] checkedItems;// 用於記錄被選擇的項@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubAlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);// 這裡區別與其它組件的builder,必須這樣寫builder.setIcon(R.drawable.ic_launcher);// 設定對話方塊的表徵圖為應用程式的表徵圖builder.setTitle("帶列表的彈出框");checkedItems = new boolean[] { false, false, true, true };// 初始化被選擇的項builder.setMultiChoiceItems(listItems, checkedItems,new OnMultiChoiceClickListener() {// 多項選擇監聽器是獨立的,所以在前面無須聲明其所在類@Overridepublic void onClick(DialogInterface arg0,int which, boolean isChecked) {// TODO Auto-generated method stubcheckedItems[which] = isChecked;// 任意一項被選擇與否,其對應數組的布爾值會被改變}});builder.setPositiveButton("確定",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface arg0, int which) {// 尋找被選擇項所對應的選項String result = "";for (int i = 0; i < checkedItems.length; i++) {if (checkedItems[i]) {result += listItems[i] + ",";}}if (!result.equals("")) {// 如果使用者有選擇東西Toast.makeText(MainActivity.this,result + "被選擇", Toast.LENGTH_LONG).show();} else {Toast.makeText(MainActivity.this,"沒有選項被選擇", Toast.LENGTH_LONG).show();}}});builder.create().show();// 必須要有這個方法,否則對話方塊不顯示}});}//對物理按鈕的監聽@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {switch (keyCode) {case KeyEvent.KEYCODE_MENU:Toast.makeText(MainActivity.this, "菜單鍵被按下", Toast.LENGTH_LONG).show();break;case KeyEvent.KEYCODE_BACK:finish();break;}return super.onKeyDown(keyCode, event);}}


【Android】各式各樣的彈出框與對菜單鍵、返回鍵的監聽

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.