1. 程式人生 > >_040_Android_Android面試寶典總結 --第四章:對話方塊、資訊提示和選單

_040_Android_Android面試寶典總結 --第四章:對話方塊、資訊提示和選單

 轉自https://blog.csdn.net/wenzhi20102321/article/details/60868763,感謝作者的無私分享。

Android面試寶典總結

                 –第四章:對話方塊、資訊提示和選單 
本文對Android面試寶典的面試題目做一點總結和記錄,希望對大家有幫助。

一.對話方塊

(一)Android的標準對話方塊最多可以有幾個按鈕?寫出顯示對話方塊按鈕的方法。

解析:對話方塊的顯示使用的是AlertDialog,它的串模式也是Builder模式! 
答案:Android的標準對話方塊最多可以有三個按鈕,AlertDialog.Builder類提供了3個直觀的顯示按鈕的方法:setPositiveButton(左起第1)、setNeutralButton(第2)、setNegativeButton(第3).

(二)如何響應Android標準對話方塊的按鈕點選事件,請舉例說明。

答案:AlertDialog.Builder類的方法:setPositiveButton、setNeutralButton、setNegativeButton,可以設定按鈕點選事件監聽物件,例如,下面的按鈕響應了第一個按鈕的點選事件:

new AlertDialog.Builder(this)
.setTitle(“我的對話方塊”)
.positiveButton(“確定”,new
DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int whichButton){
//響應按鈕的點選事件的程式碼

}
}).show();

(三)如何只使用AlertDialog,而不使用外部佈局的情況下在對話方塊中顯示一個列表(列表項內只包含一行文字,資料來源是String[]型別的值),並響應每一個列表項的單擊事件?

解析:本題考查的是AlertDialog.Builder.setItems的使用方法。 
答案:使用AlertDialog.Builder.setItems的方法可以將一個String陣列以列表的形式顯示在對話方塊中,程式碼如下:

//定義要顯示在列表中的字串陣列
String[] provinces=new String[]{“廣東省”,”廣西省”,”江西省”,”四川省”};
//對話方塊物件的建立
new AlertDialog.Buikder(this)
.setItems(provinces,new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
Log.e(“TAG”,”你選擇了”+provinces[which]);
}
}).show();

 

(四)如何將字串作為資料來源為列表方式顯示標準對話方塊中,並在列表後面加上選項按鈕?

答案:使用AlertBuilder.Builder.setSingleChoiceItems方法可以在對話方塊上顯示列表,也可以在後面新增選項按鈕。 
示例程式碼:

  public void showSingleChoiceDialog() {


        final StringBuffer stringBuffer = new StringBuffer();

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setIcon(R.mipmap.ic_launcher).setTitle("單選對話方塊");

        final String[] items = new String[] {"北京", "紐約", "曼谷", "倫敦"};

        builder.setSingleChoiceItems(items, -1,
                new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                Toast.makeText(MainActivity.this,"你點選了:" + items[i], Toast.LENGTH_SHORT).show();
                stringBuffer.delete(0,stringBuffer.length());
                stringBuffer.append(items[i]);

            }
        });

        builder.setPositiveButton("確定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(MainActivity.this,"你最終了選擇:" + stringBuffer.toString(), Toast.LENGTH_SHORT).show();
            }
        });
        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {

            }
        });
        builder.create().show();
    }

 

(五)多選列表項對話方塊的顯示?

答案:使用ALertDialog.Builder.setMultiChoiceItems方法,示例程式碼:

 public void showMultiChoiceDialog() {

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setIcon(R.mipmap.ic_launcher).setTitle("多選對話方塊");

        final String[] items = new String[] {"北京", "紐約", "曼谷", "倫敦"};

        final StringBuffer stringBuffer = new StringBuffer();
        final Set set=new HashSet<String>();
        //初始化選中狀態
        boolean[] booleans = {true, false, true, false};
        for(int i=0;i<booleans.length;i++){
            if(booleans[i]){
                set.add(items[i]);
            }
        }
        builder.setMultiChoiceItems(items,booleans,
                new DialogInterface.OnMultiChoiceClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i, boolean b) {
                Toast.makeText(MainActivity.this, "你點選了:" + items[i], Toast.LENGTH_SHORT).show();
                if(b){
                    set.add(items[i]);
                }else{
                    set.remove(items[i]);
                }
            }
        });

        builder.setPositiveButton("確定", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                Iterator iterator = set.iterator();
                while(iterator.hasNext()){
                    stringBuffer.append(iterator.next()+" ");
                }
                Toast.makeText(MainActivity.this, "你最終選中了:" + stringBuffer.toString(), Toast.LENGTH_SHORT).show();
            }
        });
        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
            }
        });
        builder.create().show();
    }

 

(六)請描述一下進度對話方塊(ProgressDialog)的使用方法。

答案:ProgressDialog類是AlertDialog的子類,但是物件的建立不是使用Builder模式,而是new出來的。 
並且進度條可以顯示圓形的進度條或水平樣式的進度條,示例程式碼:

// 建立進度條的對話方塊
        ProgressDialog dialog = new ProgressDialog(this);
        // 設定進度條的樣式,選擇圓形或條狀
        // 這裡這圓形的
        dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        // 設定標題
        dialog.setTitle("檔案下載");
        // 設定文字資訊
        dialog.setMessage("正在下載。。。");
        // 設定是否能用後退鍵出對話方塊
        // 選擇false就代表不能
        // 如果設定為false,程式可能退出不了
        dialog.setCancelable(true);
        // 顯示對話方塊
        dialog.show();

(七)如何在標準對話方塊中任意放置可視元件?

答案:使用AlertDialog.Builder.setView方法可以在對話方塊上顯示一個View。該View的物件可以使用java程式碼建立,也可以從佈局檔案中載入。

(八)在Android中顯示對話方塊有幾種方式?

答案:一般有三種顯示對話方塊的方式: 
1.使用AlertDialog顯示對話方塊 
2.使用Theme.Dialog將Activity主題改成對話方塊風格,一般是在佈局中設定,示例程式碼: 

(九)預設情況下對話方塊都是在螢幕中心顯示的,這個顯示位置是否可以改變,如果可以如何改變?

答案:使用setGravity方法可以設定對話方塊的位置,下面的程式碼讓對話方塊在螢幕左上角顯示。

AlertDialog alertDialog=new AlertDialog.Builder(this)
.setMessage(“在頂端顯示對話方塊”)
.setPositiveButton(“確定”,null).create();
//獲取Window物件
Window window=alertDialog.getWindow();
//呼叫setGravity方法是對話方塊在螢幕左上方顯示
window.setGravity(Gravity.TOP|Gravity.LEEF);
alertDialog.show();

(十)使用AlertDialog彈出對話方塊無論點選任何按鈕都會關閉對話方塊。如果想在點選按鈕後執行一些程式碼,並由自己來控制對話方塊的關閉應該如何做呢?

解析:AlertDialog類中有一個mString變數,如果把這個變數變為false時,系統會認為對話方塊已經關閉而不再關閉對話方塊,但是需要用到反編譯的知識! 
答案:只要在按鈕點選事件中修改AlertDialog.mShowing變數的值即可,程式碼如下:

try{
Field field=dialog.getClass().getSuperclass().getDeclaredField(“mString”);
field.setAccessible(true);
Field.set(dialog,false);
}catch(Exception e){ }

執行上面程式碼後,點選按鈕後對話方塊就不會關閉!如果要關閉還需要重新將AlertDialog.mShowing變數的值設定為true。

(十一)如何改變對話方塊的透明度?

答案:通過設定Window的alpha屬性可以改變對話方塊的透明度,程式碼如下:

AlertDialog alertDialog=new AlertDialog.Builder(this)
.setMessage(“透明的對話方塊”)
.setPositiveButton(“確定”,null).create();
Window window=alertDialog.getWindow();
windowManager.LayoutParams lp=window.getAttributes();
//設定透明度為0.7f
Lp.alpha=0.7f;//alpha的範圍從0f到1f,預設是1f表示不透明,0f代表完全透明!
window.setAttributtes(lp);
alertDialog.show();

二.資訊提示

        AndroidSDK提供了兩種用於顯示提示資訊的方式(吐司Toast和通知Notification)。這兩種不同於對話方塊。對話方塊是獨佔方式的,也就說只有關閉對話方塊才能做其他的操作,而在顯示Toast和Notifation時,並不會影響使用者進行其他的操作。 
Toast資訊框 
(一)請寫出顯示一個Toast資訊框的Java程式碼。

Toast toast=Toast.makeText(this,”我的資訊”,Toast.LENGTH_LONG);
toast.show();
  • 1
  • 2

(二)顯示Toast資訊框後會在一定時間內自動關閉,有沒有辦法自己來控制Toast資訊的顯示和關閉?

解析:在系統內部會有一個佇列來管理多個Toast。當前一個Toast資訊框關閉後會從佇列中獲取下一個Toast資訊框顯示。這也是為什麼Toast資訊框會一個一個顯示。而Toast.show方法並不是真正顯示Toast資訊框,而是將Toast資訊框加入佇列中。想要自己控制對話方塊的顯示和關閉,就不能將Toast資訊框放入佇列中,並且需要直接顯示和關閉Tost資訊框的方法。在Toast類中有一個內嵌類TN,該類中有兩個方法show和hide,分別用來顯示和關閉Toast資訊框。由於TN不是公開的,就需要反射來獲得物件,再呼叫show和hide方法。 
答案:呼叫Toast.TN.show和Toast.TN.hide方法可以直接顯示和關閉Toast資訊框,而且不會自動關閉,程式碼如下: 
顯示Toast資訊框:

//先建立一個Toast物件
Toast toast=Toast.makeText(this,”不會自動關閉的Toast”,Toast.LENGTH_SHORT);
Try{
//從Toast物件中獲得mTN物件
Field field=toast.getClass().getDeclaredField(“mTN”);
field.setAccessible(true);
Object object=field.get(toast);
//從TN物件中獲得了show方法
Method method=obj.getClass().getDeclaredMethod(“show”,null);
//呼叫show方法來顯示Toast資訊框
method.invike(obj,null);
}catch(Exception e){}

關閉Toast資訊框:

tyr{
Method method=obj.getClass().getDeclaredMethod(“hide”,null);
Method.invoke(obj,null);
}catch(Exception e){  }

(三)如何顯示一個不可獲得焦點,也不影響使用者進行其他的操作的視窗?

解析:Toast資訊框可以在完全滿足這個條件,很有PopupWindow也可以達到這個目的。 
答案:最簡單的方法可以採用Toast資訊框,並通過反射技術呼叫Toast.TN.show和Toast.TN.hide方法直接控制Toast資訊的顯示和關閉。除了Toast資訊框外,還可以使用PopupWindow物件顯示一個類似Toast資訊框的視窗,程式碼如下:

View view=etLayoutInflater().inflate(R.laout.toast,null);
PopupWindow popupWindow=new PopupWindow(layout,200,100);
popupWindow.setTouchable(false);
//顯示一個視窗
popupWindow.showAtLocation(layout,Gravity.CENTER_HORIZONTAL,20,0);

//關閉視窗的程式碼
popupWindow.dismiss();

通知(Notificaiton)

(四)請描述一下在狀態列上顯示Notification的實現步驟,並寫出相應的java程式碼。

答案:建立和顯示一個Notification需要5步: 
1.通過getSystemService方法獲得一個NotificationManager物件。 
2.建立一個Notification物件。每一個Notification對應一個Notificaiton物件。這一步需要設定顯示在螢幕上方狀態列的通知訊息、通知訊息前方的影象資源ID和發出通知的時間,一般為當前時間。 
3.由於Notification可以與應用程式脫離,也就是說,即使應用程式被關閉,Notification仍然會顯示在狀態列中。 
當程式再次啟動後,又可以重新控制這些Notification,如清除或替換它們。因此,需要建立一個PendingIntent物件。該物件由Android系統負責維護,因此,在程式關閉後,物件仍然不會被釋放。 
4.使用Notification類的setLatesEvenInfo方法設定Notification的詳細資訊。 
5.使用NotificationManiger類的notify方法顯示Notification訊息。在這一步需要指定標識Notification的唯一ID。這個ID必須相對同一個NotificationManager物件時唯一的,否則就會覆蓋相同的ID的Notification。 
顯示Notification的java程式碼:

//第一步
NotificationManager notificationManager =(NotificationManager)getSystemService(NOTIFICATION_SERVICE);

//第二步
Notification notification=new Notification(R.drawable.icon,”你有新訊息了!”,System.currentTimeMillis());

//第三步
PendingIntent contentIntent=PendingIntent.getActivity(this,0,getIntent(),0);

//第四步
notification.setLatesEventInfo(this,”天氣預報”,”晴轉多雲”,contentIntent);
//第五步
notificationManager.notify(R.drawable.icon,notification);

(五)如何做才能在點選Notification後彈出一個Activity?

答案:使用PendingIntent.getActivity方法獲取一個PendingIntent物件,並將PendingIntent物件傳入setLatesEventInfo方法的最後一個引數。主要程式碼:

PendingIntent contentIntent=PendingIntent.getActivity(this,0,new Intent(this,Main.class),0);
notification.setLatesEventInfo(this,”title”,”content”,contentIntent);

擴充套件:點選Notification觸發的動作 
單擊Notification後不僅可以彈出一個Activity,還可以傳送廣播或開始一個服務。這兩個動作都需要依靠PaddingIntent物件,程式碼如下: 
//傳送廣播:

Intent intent=new Intent(“MyBroadcast”);
PenddingIntent penddingIntent=new PenddingIntent.getBroadcast(this,1,intent,PenddingIntent.FLAG _UPDATE_CURRENT);

//開始服務

Intent intent=new Intent(this,MyService.class);
PenddingIntent penddingIntent=new PenddingIntent.getService(this,1,intent,PenddingIntent.FLAG_UPDATE_CURRENT);

(六)如何從狀態列清除Notification?

答案:如果想從狀態列清除指定的Notification,可以使用NotificationManager.cancel方法,該方法只有一個引數,表示要清除的Notification的ID。使用cancelAll方法可以清除當前NotificationManager物件的所有通知Notification。

(七)如何將Notification放在如下圖所示“正在進行的”的位置(在該欄中Notification是永久存在的,除非使用NotificationManager.cancel該方法清除該Notification)?

z

答案:設定Notification的flags屬性,程式碼如下:

Notification notification=new Notification(R.drawable.smile,”收到簡訊了”,system.currentTimeMillis());
PenddingIntent penddingIntent=new PenddingIntent.getActivity(this,0,new Intent(this,Main.class),0);
//將Notification放到“正在進行的”欄中
notification.flags=Notification.FLAG_ONGOING_EVENT;
notification.   setLatestEventInfo(this,”簡訊內容”,”最近在忙什麼?”,penddingIntent);
notificationManager.notify(R.drawble.smile,notification);

(八)如何自定義Notification, 並說出Notification支援那些可視元件。

答案:只需設定Notificaiton.contentView變數即可,程式碼如下:

Notification notification=new Notification(R.drawable.smile,”自定義Notificaion”,System.currentIimeMillis);
PenddingIntent  penddingIntent= PenddingIntent.getActivity(this,0,new Intent(this,Main.class),0);
//R.layout.notification為自定義的Notificaiton佈局檔案
RemoteViews remoteView=new RemoteView(getPackageName(),R.layout.notication);
remoteView.setTextViewText(R.id.textView,”更新自定義內容”);
Notification.contentView=remoteView;
notification.contentViewIntent=penddingIntent;

自定義的Notification只支援如下的可視元件。 
佈局: 
1.FrameLayout 
2.LinearLayout 
3.RelativeLayout

元件: 
1.AnalogClock 
2.Button 
3.Chronomete 
4.ImageButton 
5.ImageView 
6.ProgressBar 
7.TextView

三.選單

(一)Android支援哪幾種菜單?

答案:選項選單,上下文選單,子選單

(二)哪些Android支援的選單中選單項可以顯示影象

答案:只有選項選單的選單項可以顯示影象,上下文和子選單的選單頭可以顯示影象,但是選單項不能顯示影象。

(三)請描述一下如何為一個 Activity新增選項選單

答案:實現Activity.onCreateOptionMenu方法,並利用Menu物件新增選單,程式碼如下:

public   boolean onCreaateOptionMenu(Menu menu){
Menu.add(1,1,1,”選單項1”);
Menu.add(1,2,2,”選單項2”);
Menu.add(1,3,3,”選單項3”);
return true;
}

擴充套件知識:繫結上下文選單 
上下文選單應與某些可視檢視元件繫結,首先需要實現一個建立上下文選單的onCreateContextMenu方法,程式碼如下:

public void onCreateContextMenu(    ContextMenu menu,View view,ContextMenuInfo menInfo){
menu.add(1,1,1,”上下文選單項1”);
menu.add(1,2,2,”上下文選單項2”);
menu.add(1,3,3,”上下文選單項3”);

}

然後需要使用registerForContextMenu方法將上下文選單與可視元件繫結在一起,程式碼如下: 
Button buton=(Button)findViewById(R.id.btnAddMenu); 
registerForcontextMenu(buton); 
長按 Button,就會彈出OnCreateContextMenu方法建立 的上下文選單。

(四)在點選選單項時,除了使用Java程式碼顯示一個Activity外,還可以用什麼方法顯示Activity?

答案:可以將一個Activity與某個選單項關聯,這樣在單擊該選單時就會自動顯示Activity。關聯選單項與Activity的程式碼如下:

MenuItem menuItem=menu.add(1,1,1,“選單項”);
//將Activity與選單項關聯
menuItem.setInetent(new Intent(this,MyActivity.class));

 

(五)響應選單項事件有哪些方法?

答案:有如下3個方法可以響應選單項的點選事件 
1.OnMenuItemClick 
2.OnOptionsItemSelected 
3.OnMenuItemSelected

擴充套件:多個選單項的點選事件如何響應 
當同時設定三種菜單項的點選事件時,當O你MenuItemClick方法返回true時,其他兩個點選事件無效;當設定後面兩種點選事件時,系統會根據這兩個方法在父類(Activity類)的位置決定,先呼叫的方法生效! 
(六)下圖是一個選項選單項的子選單,請寫出建立這個子選單的核心程式碼。 
z2 
答案:建立帶複選框和選項按鈕的子選單的程式碼如下:

public boolean onCreateOptionMenu(Menu menu){
//新增子選單
SubMenu fileSubMenu=menu.addMenu(1,1,1,“檔案”);
//設定在選項選單中顯示的影象
fileSubMenu.setIcon(R.drawable.file);
//設定子選單的影象
fileSubMenu.setHeaderIcon(R.drawable.headerfile);
MenuItem newMenuItem=fileSubMenu.add(1,2,2,”新建”);
//將第一個子選單項設定成複選框的型別
newMenuItem.setCheckable(true);
//選中第一個子選單項的複選框
newMenuItem.setChecked(true);
MenuItem openMenuItem=fileSubMenu.add(2,3,3,”開啟”);
MenuItem exitMenuItem=fileSubMenu.add(2,3,3,”退出”);

//將第三個選單項的選型按鈕設為選中狀態
exitMenuItem.setChecked(true);
//將後面兩個子選單項設定成選項按鈕型別
fileSubMenu.setGroupCheckable(2,true,true);

}

 

(七)如何自定義選項選單,請寫出核心程式碼。

解析:本題考點主要有兩點: 
1.如何顯示和關閉自定義選項選單 
2.自定義選項選單用什麼實現 
答案:選項選單通過手機的“menu”鍵彈出,當按“back”鍵時,選項選單會關閉。因此,只需在onKeyDown方法中截獲“menu”和“back”鍵即可。 
可以使用PopupWindow物件來模擬選型選單。在建立PopupWindow物件時需要一個View物件(一般從佈局檔案中裝載),建立、顯示、關閉自定義選項選單的程式碼如下:

public boolean onKeyDown(int keyCode,KeyEven keyEven){
switch(keyCode){
    case  KeyEvent.KEYCODE_MENU://按下menu鍵的動作
        //選項選單已經彈出,不再彈出新的視窗
        if(state==1){
            return false;
        }
        //裝載選項選單佈局檔案
        layout=getLayoutInflater().inflate(R.layout.menu_layout,null);
        //建立PopupWindow物件,並在指定位置彈出用於顯示選單的視窗
        pop=new PopupWindow(layout,getWindowManager().getDefaultDisplay().getWidth(),getWindowManager().getDefaultDisplay().getHeight());
        //設定彈出視窗的位置
        pop.showAtLocation(layout,Gravity.BOTTOM,0,0);
        //彈出選項選單後,鍵狀態設定為1,表示已經彈出選項選單
        state=1;
        retuen false;

    case  KeyEvent.KEYCODE_BACK://按下back鍵的動作
        if(state==1){
            //如果選項選單已經彈出,關閉它
            pop.dismiss();
            //將狀態變數設定為選單欄關閉狀態
            state=2;
        }else(state==2){
            //如果選單欄還沒顯示,或已經關閉,則關閉當前Activity
            finish();
        }
        return false;
    }

}

本文中的對話方塊和吐司提示還是用得比較多的,後面的知識現在很少用了。

之前我也有一個對對話方塊非常詳細的總結: 
http://blog.csdn.net/wenzhi20102321/article/details/52818351