_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)?
答案:設定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類)的位置決定,先呼叫的方法生效!
(六)下圖是一個選項選單項的子選單,請寫出建立這個子選單的核心程式碼。
答案:建立帶複選框和選項按鈕的子選單的程式碼如下:
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