版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
菜單與對(duì)話框
4.1任務(wù)1-使用選項(xiàng)菜單OptionsMenu21菜單的XML文件2選項(xiàng)菜單的創(chuàng)建方法3選項(xiàng)菜單的事件響應(yīng)方法OptionsMenuOptionsMenu不依賴于內(nèi)容,在應(yīng)用創(chuàng)建視圖時(shí),OptionsMenu也被生成,常用于全局場(chǎng)合項(xiàng)目模板創(chuàng)建一個(gè)空白活動(dòng)頁(yè)面時(shí),默認(rèn)沒(méi)有菜單文件夾,在創(chuàng)建OptionsMenu時(shí),可利用向?qū)?chuàng)建相關(guān)文件夾和文件重要方法onCreateOptionsMenu()應(yīng)用首次生成選項(xiàng)菜單時(shí)調(diào)用,之后不再被調(diào)用,適合生成靜態(tài)菜單onPrepareOptionsMenu()沒(méi)次點(diǎn)擊選項(xiàng)菜單時(shí)被調(diào)用,適合生成動(dòng)態(tài)內(nèi)容的菜單項(xiàng)onOptionsItemSelected()選項(xiàng)菜單的點(diǎn)擊事件回調(diào)菜單XMLmenu根節(jié)點(diǎn)item節(jié)點(diǎn)為菜單項(xiàng)android:title菜單項(xiàng)在菜單中所顯示的文本android:icon菜單項(xiàng)的圖標(biāo),須與app:showAsAction配合app:showAsAction屬性always:在動(dòng)作欄以圖標(biāo)形式顯示菜單項(xiàng)3相關(guān)布局文件4<!--OptionsMenu布局文件res/menu/opt_menu.xml-->
<menuxmlns:app="/apk/res-auto"
xmlns:android="/apk/res/android">
<item
android:id="@+id/opt_add"
android:icon="@drawable/ic_baseline_add_box_24"
android:title="增加"
app:showAsAction="always"/>
<item
android:id="@+id/opt_modify"
android:title="修改"/>
<item
android:id="@+id/opt_delete"
android:title="刪除"/>
</menu><vectorandroid:height="24dp"android:tint="#FFFFFF"
android:viewportHeight="24"android:viewportWidth="24"
android:width="24dp"xmlns:android="/apk/res/android">
<pathandroid:fillColor="#FF9800"android:pathData="M19,3L5,3c-1.11,0-2,0.9-2,2v14c0,1.10.89,22,2h14c1.1,02,-0.92,-2L21,5c0,-1.1-0.9,-2-2,-2zM17,13h-4v4h-2v-4L7,13v-2h4L11,7h2v4h4v2z"/>
</vector><!--my_main.xml-->
<LinearLayoutxmlns:android="/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="YournameandID"/>
<TextView
android:id="@+id/tv_result"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=""/>
</LinearLayout>矢量圖文件,右擊res/drawable文件夾,new→VectorAsset選項(xiàng)創(chuàng)建實(shí)現(xiàn)MainActivity5publicclassMainActivityextendsAppCompatActivity{
TextViewtv;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.my_main);
tv=findViewById(R.id.tv_result);
}
@Override
publicbooleanonCreateOptionsMenu(Menumenu){
getMenuInflater().inflate(R.menu.opt_menu,menu);
//將res/menu/opt_menu.xml菜單文件填充到menu對(duì)象上
//newMenuInflater(getApplicationContext()).inflate(R.menu.opt_menu,menu);
//也可以使用MenuInflater填充菜單
returnsuper.onCreateOptionsMenu(menu);
}
@Override
publicbooleanonOptionsItemSelected(@NonNullMenuItemitem){
Strings="";
//哪個(gè)選項(xiàng)菜單項(xiàng)被選中,建議使用菜單項(xiàng)的id進(jìn)行判斷
switch(item.getItemId()){
caseR.id.opt_add:
s="增加";
break;
caseR.id.opt_modify:
s="修改";
break;
caseR.id.opt_delete:
s="刪除";
break;
}
tv.setText(s);
returnsuper.onOptionsItemSelected(item);
}
}4.2任務(wù)2-使用上下文菜單ContextMenu61注冊(cè)上下文菜單2上下文菜單的創(chuàng)建和點(diǎn)擊響應(yīng)方法3上下文菜單獲取觸發(fā)位置4適配器數(shù)據(jù)的更新ContextMenuContextMenu依賴于內(nèi)容,需要注冊(cè)才能被使用調(diào)用registerForContextMenu()方法對(duì)UI對(duì)象注冊(cè)ContextMenu長(zhǎng)按被注冊(cè)的視圖,彈出上下文菜單重要方法onCreateContextMenu()每次彈出上下文菜單均會(huì)被調(diào)用onContextItemSelected(MenuItemitem)菜單項(xiàng)點(diǎn)擊事件回調(diào)若是針對(duì)ListView、GridView等組件,需要知道彈出上下文菜單的位置item.getMenuInfo()方法得到ContextMenuInfo對(duì)象無(wú)法得到position或者id信息須將ContextMenuInfo對(duì)象強(qiáng)制類型轉(zhuǎn)換成AdapterContextMenuInfo對(duì)象適配器視圖更新方法notifyDataSetChanged()方法一旦數(shù)據(jù)源的數(shù)據(jù)發(fā)生變化,需要調(diào)用適配器更新視圖,保持視圖與數(shù)據(jù)的一致性7項(xiàng)目的布局文件8<!--ContextMenu布局文件res/menu/ctx_menu.xml-->
<menuxmlns:app="/apk/res-auto"
xmlns:android="/apk/res/android">
<item
android:id="@+id/ctx_insert"
android:title="插入"/>
<item
android:id="@+id/ctx_delete"
android:title="刪除"/>
</menu><!--MainActivity的布局文件my_main.xml-->
<LinearLayoutxmlns:android="/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_result"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="YournameandID"/>
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>實(shí)現(xiàn)MainActivity9publicclassMainActivityextendsAppCompatActivity{
ArrayList<String>list=newArrayList<>();
ArrayAdapter<String>adapter;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.my_main);
for(inti=0;i<20;i++){
Strings=String.format("Item%02d",i);
list.add(s);
}
adapter=newArrayAdapter<>(this,android.R.layout.simple_list_item_1,list);
ListViewlv=findViewById(R.id.listView);
lv.setAdapter(adapter);
registerForContextMenu(lv);
//對(duì)ListView視圖注冊(cè)ContextMenu,長(zhǎng)按ListView視圖會(huì)彈出ContextMenu
//若不注冊(cè)ContextMenu,則不會(huì)生成對(duì)應(yīng)菜單
}
@Override
publicvoidonCreateContextMenu(ContextMenumenu,Viewv,
ContextMenu.ContextMenuInfomenuInfo){
super.onCreateContextMenu(menu,v,menuInfo);
getMenuInflater().inflate(R.menu.ctx_menu,menu);
//將res/menu/ctx_menu.xml菜單生成到菜單對(duì)象menu上
}
@Override
publicbooleanonContextItemSelected(@NonNullMenuItemitem){
ContextMenu.ContextMenuInfomenuInfo=item.getMenuInfo();
//通過(guò)item獲得菜單項(xiàng)對(duì)象ContextMenuInfo
AdapterView.AdapterContextMenuInfoadapterContextMenuInfo=
(AdapterView.AdapterContextMenuInfo)menuInfo;
//將ContextMenuInfo對(duì)象強(qiáng)制類型轉(zhuǎn)換為AdapterContextMenuInfo
//通過(guò)AdapterContextMenuInfo獲得位置信息position
intposition=adapterContextMenuInfo.position;
switch(item.getItemId()){
caseR.id.ctx_insert:
Strings=String.format("Random:%d",newRandom().nextInt(1000));
//產(chǎn)生一個(gè)區(qū)間為[0,1000)的隨機(jī)整數(shù)(不包括1000)
list.add(position,s);//數(shù)據(jù)源插入數(shù)據(jù)s至指定位置position
adapter.notifyDataSetChanged();
//數(shù)據(jù)源發(fā)生變化,通知適配器數(shù)據(jù)更新,適配器全盤(pán)更新
break;
caseR.id.ctx_delete:
list.remove(position);//數(shù)據(jù)源刪除指定位置position的數(shù)據(jù)
adapter.notifyDataSetChanged();//通知適配器更新視圖
break;
}
returnsuper.onContextItemSelected(item);
}
}4.3任務(wù)3-使用彈出菜單PopupMenu101上下文菜單的局限性2PopupMenu可以實(shí)現(xiàn)多視圖注冊(cè)3PopupMenu的使用方法項(xiàng)目的布局文件11<!--TextView的菜單文件res/menu/ctx_tv_menu.xml-->
<menuxmlns:app="/apk/res-auto"
xmlns:android="/apk/res/android">
<item
android:id="@+id/ctx_tv_12"
android:title="12sp"/>
<item
android:id="@+id/ctx_tv_16"
android:title="16sp"/>
</menu><!--ContextMenu布局文件res/menu/ctx_menu.xml-->
<menuxmlns:app="/apk/res-auto"
xmlns:android="/apk/res/android">
<item
android:id="@+id/ctx_insert"
android:title="插入"/>
<item
android:id="@+id/ctx_delete"
android:title="刪除"/>
</menu><!--MainActivity的布局文件my_main.xml-->
<LinearLayoutxmlns:android="/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_result"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="YournameandID"/>
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>基于上下文菜單的雙視圖注冊(cè)12publicclassMainActivityextendsAppCompatActivity{
ArrayList<String>list=newArrayList<>();
ArrayAdapter<String>adapter;
ListViewlv;
TextViewtv;
intctx_position=0;//設(shè)置ContextMenu觸發(fā)位置的變量為全局變量
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.my_main);
for(inti=0;i<20;i++){
Strings=String.format("Item%02d",i);
list.add(s);
}
adapter=newArrayAdapter<>(this,android.R.layout.simple_list_item_1,list);
lv=findViewById(R.id.listView);
lv.setAdapter(adapter);
registerForContextMenu(lv);//對(duì)ListView視圖注冊(cè)ContextMenu
tv=findViewById(R.id.tv_result);
registerForContextMenu(tv);//對(duì)TextView視圖注冊(cè)ContextMenu
}
@Override
publicvoidonCreateContextMenu(ContextMenumenu,Viewv,
ContextMenu.ContextMenuInfomenuInfo){
super.onCreateContextMenu(menu,v,menuInfo);
if(v==lv){
//若是ListView,生成對(duì)應(yīng)菜單,并獲得位置信息賦給ctx_position
getMenuInflater().inflate(R.menu.ctx_menu,menu);
AdapterView.AdapterContextMenuInfoadapterContextMenuInfo=
(AdapterView.AdapterContextMenuInfo)menuInfo;
ctx_position=adapterContextMenuInfo.position;
}elseif(v==tv){
//若是TextView,生成另一種菜單
getMenuInflater().inflate(R.menu.ctx_tv_menu,menu);
}
}
@Override
publicbooleanonContextItemSelected(@NonNullMenuItemitem){
//TextView觸發(fā)的ContextMenu對(duì)象對(duì)應(yīng)的menuInfo是null,無(wú)position屬性
intposition=ctx_position;
//ctx_position在onCreateContextMenu()方法中被賦值
switch(item.getItemId()){
caseR.id.ctx_insert:
Strings=String.format("Random:%d",newRandom().nextInt(1000));
list.add(position,s);
adapter.notifyDataSetChanged();
break;
caseR.id.ctx_delete:
list.remove(position);
adapter.notifyDataSetChanged();
caseR.id.ctx_tv_12:
tv.setTextSize(12.0f);//設(shè)置文本字體大小
break;
caseR.id.ctx_tv_16:
tv.setTextSize(16.0f);
break;
}
returnsuper.onContextItemSelected(item);
}
}PopupMenu使用要點(diǎn)PopupMenu的構(gòu)造方法publicPopupMenu(android.content.Contextcontext,android.view.Viewanchor)context為上下文,可通過(guò)傳遞Activity對(duì)象或者直接通過(guò)getApplicationContext()方法獲得anchor為PopupMenu所依賴的視圖,即可理解為PopupMenu所需要注冊(cè)的視圖構(gòu)造出PopupMenu的對(duì)象popupMenu,使用popupMenu實(shí)現(xiàn)菜單填充和事件處理菜單填充popupMenu.getMenuInflater()方法得到菜單填充器,進(jìn)而通過(guò)菜單填充器的inflate()方法填充菜單popupMenu.getMenu()方法獲得Menu對(duì)象需要調(diào)用show()方法進(jìn)行顯示事件處理PopupMenu對(duì)象調(diào)用setOnMenuItemClickListener()方法設(shè)置偵聽(tīng)器onMenuItemClick()回調(diào)方法中進(jìn)行處理PopupMenu可以對(duì)不同視圖分別注冊(cè),得到不同的PopupMenu對(duì)象,并分別對(duì)之進(jìn)行菜單填充和事件偵聽(tīng)處理,提高代碼解耦性13基于PopupMenu的實(shí)現(xiàn)14publicclassMainActivityextendsAppCompatActivity{
ArrayList<String>list=newArrayList<>();
ArrayAdapter<String>adapter;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.my_main);
for(inti=0;i<20;i++){
Strings=String.format("Item%02d",i);
list.add(s);
}
adapter=newArrayAdapter<>(this,
android.R.layout.simple_list_item_1,list);
ListViewlv=findViewById(R.id.listView);
lv.setAdapter(adapter);
registerForContextMenu(lv);//對(duì)ListView視圖注冊(cè)ContextMenu
TextViewtv=findViewById(R.id.tv_result);
tv.setOnLongClickListener(newView.OnLongClickListener(){
//利用對(duì)象tv長(zhǎng)按彈出PopupMenu
@Override
publicbooleanonLongClick(Viewv){
showTextViewPopUpMenu(tv);//自定義方法,顯示PopupMenu
returntrue;//true表示長(zhǎng)按事件不再往下傳,false則繼續(xù)往下傳遞事件
}
});
}
privatevoidshowTextViewPopUpMenu(TextViewv){
PopupMenupopupMenu=newPopupMenu(getApplicationContext(),v);
//對(duì)視圖v生成菜單對(duì)象popupMenu
popupMenu.getMenuInflater()
.inflate(R.menu.ctx_tv_menu,popupMenu.getMenu());
//利用菜單對(duì)象popupMenu的getMenuInflater()方法獲得對(duì)應(yīng)菜單填充器
//利用菜單對(duì)象popupMenu的getMenu()方法獲得Menu對(duì)象menu
popupMenu.setOnMenuItemClickListener(
newPopupMenu.OnMenuItemClickListener(){
//對(duì)popupMenu設(shè)置菜單項(xiàng)點(diǎn)擊偵聽(tīng)
@Override
publicbooleanonMenuItemClick(MenuItemitem){
switch(item.getItemId()){
caseR.id.ctx_tv_12:
v.setTextSize(12.0f);
break;
caseR.id.ctx_tv_16:
v.setTextSize(16.0f);
break;
}
returntrue;//true表示菜單項(xiàng)選中事件不再往下傳,false則繼續(xù)下傳
}
});
popupMenu.show();//調(diào)用show()方法顯示PopupMenu
}
@Override
publicvoidonCreateContextMenu(ContextMenumenu,Viewv,
ContextMenu.ContextMenuInfomenuInfo){
…
}
@Override
publicbooleanonContextItemSelected(@NonNullMenuItemitem){
…
}
}4.4任務(wù)4-使用對(duì)話框AlertDialog151消息對(duì)話框2列表對(duì)話框3單選對(duì)話框?qū)υ捒駻lertDialog的使用要點(diǎn)AlertDialog使用AlertDialog.Builder()方法創(chuàng)建1個(gè)Builder對(duì)象setTitle()方法設(shè)置對(duì)話框標(biāo)題setMessage()方法設(shè)置對(duì)話框的文本內(nèi)容setItems()方法設(shè)置列表數(shù)據(jù)和點(diǎn)擊偵聽(tīng)setSingleChoiceItems()方法設(shè)置單選數(shù)據(jù)、默認(rèn)選中位置和點(diǎn)擊偵聽(tīng)setView()方法設(shè)置自定義視圖,此時(shí)建議使用LayoutInflater從布局文件中生成視圖對(duì)象setMultiChoiceItems()方法設(shè)置多選內(nèi)容、多選默認(rèn)選中的數(shù)據(jù)和相關(guān)偵聽(tīng)事件setAdapter()方法設(shè)置適配器setCursor()方法設(shè)置Cursor數(shù)據(jù),Cursor為數(shù)據(jù)庫(kù)查詢返回的游標(biāo)setIcon()方法設(shè)置圖標(biāo)show()方法顯示對(duì)話框?qū)υ捒虻陌粹o設(shè)置方法setPositiveButton()方法設(shè)置確定按鈕setNegativeButton()方法設(shè)置取消按鈕setNeutralButton()方法設(shè)置中間按鈕第1個(gè)參數(shù)是按鈕所顯示的文本第2個(gè)參數(shù)是對(duì)應(yīng)的點(diǎn)擊事件接口,若不需要處理點(diǎn)擊事件,可傳入null16項(xiàng)目的布局文件my_main.xml17<LinearLayoutxmlns:android="/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="YournameandID"/>
<TextView
android:id="@+id/tv_result"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=""/>
<Button
android:id="@+id/bt1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="消息對(duì)話框"/>
<Button
android:id="@+id/bt2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="列表對(duì)話框"/>
<Button
android:id="@+id/bt3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="單選對(duì)話框"/>
</LinearLayout>實(shí)現(xiàn)MainActivity18publicclassMainActivityextendsAppCompatActivity{
TextViewtv;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.my_main);
tv=findViewById(R.id.tv_result);
String[]hobbies=newString[]{"游泳","跑步","籃球"};
findViewById(R.id.bt1).setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
showMessageDialog("這是一個(gè)消息提示框");
}
});
findViewById(R.id.bt2).setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
showItemsDialog(hobbies);
}
});
findViewById(R.id.bt3).setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
showSingleChoiceDialog(hobbies);
}
});
}
privatevoidshowMessageDialog(Strings){
AlertDialog.Builderbl=newAlertDialog.Builder(this);
bl.setTitle("消息提示框").setMessage(s);
bl.setNegativeButton("退出",null);//退出按鈕,null代表不對(duì)事件響應(yīng)做處理
bl.show();
}
privatevoidshowItemsDialog(String[]hobbies){
AlertDialog.Builderbl=newAlertDialog.Builder(this);
bl.setTitle("列表框").setItems(hobbies,
newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
//每次點(diǎn)擊列表項(xiàng)均會(huì)更新TextView
Stringhobby=hobbies[which];
//若要在PositiveButton點(diǎn)擊事件中獲得hobby
//不借助全局變量或者自定義類,難以實(shí)現(xiàn)
tv.setText(hobby);
}
});
bl.setNegativeButton("退出",null);
bl.show();
}實(shí)現(xiàn)MainActivity(續(xù))19
privatevoidshowSingleChoiceDialog(String[]hobbies){
//finalintchoiceIndex=0;//無(wú)法實(shí)現(xiàn),final變量不能被二次賦值
//finalIntegerchoiceIndex=newInteger(0);
//無(wú)法實(shí)現(xiàn),Integer類沒(méi)有setter相關(guān)方法
finalMyIntegermyInteger=newMyInteger(0);
//不加final無(wú)法在匿名回調(diào)方法中被訪問(wèn)
//通過(guò)自定義類解決int類型的final變量不能二次賦值問(wèn)題
//myInteger不能重新指向new對(duì)象,但可以調(diào)用類方法對(duì)類成員改值
AlertDialog.Builderbl=newAlertDialog.Builder(this);
bl.setTitle("單選對(duì)話框");
bl.setSingleChoiceItems(hobbies,myInteger.getPosition(),
newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
//showMessageDialog("inside");//測(cè)試對(duì)話框中是否能生成另一個(gè)對(duì)話框
myInteger.setPosition(which);
//通過(guò)setPosition()方法給類成員變量重新賦值
}
});
bl.setPositiveButton("確定",newDialogInterface.OnClickListener(){
//點(diǎn)擊確定按鈕,在回調(diào)中處理確定按鈕對(duì)應(yīng)的邏輯,更新愛(ài)好選項(xiàng)到TextView
@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
//從自定義類對(duì)象myInteger中取選中索引值
intposition=myInteger.getPosition();
tv.setText(hobbies[position]);
}
});
bl.setNegativeButton("退出",null);
bl.show();
}
classMyInteger{
//定義一個(gè)內(nèi)部類解決final問(wèn)題
//類對(duì)象變成final,不能重新指向?qū)ο?,但是可以調(diào)用類的相
//關(guān)方法改變類成員變量的值
privateintposition=0;
publicMyInteger(intposition){
this.position=position;
}
publicintgetPosition(){
returnposition;
}
publicvoidsetPosition(intposition){
this.position=position;
}
}
}通過(guò)自定義類實(shí)現(xiàn)final變量的賦值問(wèn)題4.5任務(wù)5-使用自定義視圖對(duì)話框201自定義視圖的使用方法2利用自定義接口提高代碼的解耦性3使用對(duì)話框新增修改數(shù)據(jù)項(xiàng)目的布局文件21<!--MainActivity的布局文件my_main.xml-->
<LinearLayoutxmlns:android="/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="YournameandID"/>
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout><!--ContextMenu菜單文件res/menu/ctx_menu.xml-->
<menuxmlns:android="/apk/res/android"
xmlns:app="/apk/res-auto">
<item
android:id="@+id/ctx_add"
android:title="新增"/>
<item
android:id="@+id/ctx_edit"
android:title="修改"/>
</menu><!--AlertDialog自定義視圖res/layout/dialog_view.xml-->
<LinearLayoutxmlns:android="/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/dialog_et_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Inputyourname"
android:text=""/>
<EditText
android:id="@+id/dialog_et_phone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Inputyourphonenumber"
android:text=""/>
</LinearLayout>數(shù)據(jù)封裝類PhoneData22publicclassPhoneData{
privateStringname;
privateStringphone;
publicPhoneData(Stringname,Stringphone){
this.name=name;
this.phone=phone;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicStringgetPhone(){
returnphone;
}
publicvoidsetPhone(Stringphone){
this.phone=phone;
}
@Override
publicStringtoString(){
//必須改寫(xiě)toString()方法,否則無(wú)法將PhoneData字符串化顯示在適配器中
returnString.format("%s%s",name,phone);
}
}未改寫(xiě)toString(),ArrayAdapter顯示效果實(shí)現(xiàn)自定義視圖對(duì)話框PhoneDataDialog23publicclassPhoneDataDialog{
privateContextcontext;//LayoutInflater需要Context參數(shù)
privateStringtitle;//對(duì)話框標(biāo)題
publicinterfaceOnSubmitListener{//自定義一個(gè)接口
voidonSubmit(PhoneDataupdatedData);
//通過(guò)用戶實(shí)現(xiàn)接口的onSubmit()方法對(duì)updatedData進(jìn)行處理
//使用updatedData修改數(shù)據(jù)或者新增數(shù)據(jù)完全取決于用戶實(shí)現(xiàn)的代碼
//接口回調(diào)在對(duì)話框的確定按鈕中觸發(fā)
}
publicPhoneDataDialog(Contextcontext,Stringtitle){
this.context=context;
this.title=title;
}
publicvoidshowDialog(PhoneDatadata,OnSubmitListenerl){
/***
data數(shù)據(jù)是用戶傳進(jìn)來(lái)的待修改數(shù)據(jù),若是新增數(shù)據(jù),可傳null
OnSubmitListener是用戶實(shí)現(xiàn)的接口,在確定按鈕中觸發(fā)回調(diào),
通過(guò)onSubmit(PhoneDataupdatedData)傳出修改后的數(shù)據(jù)updatedData
用戶則在調(diào)用showDialog()時(shí)實(shí)現(xiàn)回調(diào)方法,對(duì)updatedData處理(新增或者修改)
*/
PhoneDatatemp=newPhoneData("","");
if(data!=null){//若data不為空,則將值賦給變量temp
temp.setName(data.getName());
temp.setPhone(data.getPhone());
}
Viewv=LayoutInflater.from(context)
.inflate(R.layout.dialog_view,null,false);
//將布局文件填充為視圖對(duì)象v
EditTextet_name=v.findViewById(R.id.dialog_et_name);
EditTextet_phone=v.findViewById(R.id.dialog_et_phone);
//對(duì)兩個(gè)EditText賦data傳進(jìn)的初值
et_name.setText(temp.getName());
et_phone.setText(temp.getPhone());
AlertDialog.Builderbl=newAlertDialog.Builder(context);
bl.setTitle(title);
bl.setView(v);//將XML布局填充的視圖對(duì)象v設(shè)置為對(duì)話框的內(nèi)容
bl.setNegativeButton("取消",null);
bl.setPositiveButton("確定",newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
PhoneDataupdatedData=newPhoneData(
et_name.getText().toString(),
et_phone.getText().toString());
//不直接修改變量data
//使用updatedData的目的是data可能是null
if(l!=null){//判斷接口非空才能設(shè)置自定義接口回調(diào)
l.onSubmit(updatedData);
}
}
});
bl.show();
}
}實(shí)現(xiàn)MainActivity24publicclassMainActivityextendsAppCompatActivity{
ArrayList<PhoneData>list=newArrayList<>();
ArrayAdapter<PhoneData>adapter;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.my_main);
ListViewlv=findViewById(R.id.listView);
for(inti=0;i<4;i++){//模擬了8個(gè)PhoneData數(shù)據(jù)
list.add(newPhoneData("張三",));
list.add(newPhoneData("李四",));
}
adapter=newArrayAdapter<>(this,
android.R.layout.simple_list_item_1,list);
lv.setAdapter(adapter);
registerForContextMenu(lv);
}
@Override
publicvoidonCreateContextMenu(ContextMenumenu,Viewv,
ContextMenu.ContextMenuInfomenuInfo){
super.onCreateContextMenu(menu,v,menuInfo);
getMenuInflater().inflate(R.menu.ctx_menu,menu);//生成ContextMenu
}
@Override
publicbooleanonContextItemSelected(@NonNullMenuItemitem){
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度水利設(shè)施維修履約擔(dān)保協(xié)議模板3篇
- 2025年北師大新版選修3物理上冊(cè)階段測(cè)試試卷含答案
- 專用標(biāo)識(shí)牌采購(gòu)協(xié)議(2024版)版A版
- 2025年度項(xiàng)目部員工聘用合同規(guī)范文本范本解析2篇
- 二零二五年瓷磚行業(yè)綠色環(huán)保材料研發(fā)合作合同范本2025版2篇
- 2025年外研版七年級(jí)歷史上冊(cè)階段測(cè)試試卷
- 福州市倉(cāng)山區(qū)市場(chǎng)監(jiān)督管理局招考1名編外人員高頻重點(diǎn)提升(共500題)附帶答案詳解
- 二零二五年度生態(tài)飯店承包經(jīng)營(yíng)合同規(guī)范范本3篇
- 2025年外研版高三生物上冊(cè)月考試卷含答案
- 2025年北師大新版八年級(jí)物理上冊(cè)月考試卷含答案
- 2024-2025學(xué)年成都高新區(qū)七上數(shù)學(xué)期末考試試卷【含答案】
- 定額〔2025〕1號(hào)文-關(guān)于發(fā)布2018版電力建設(shè)工程概預(yù)算定額2024年度價(jià)格水平調(diào)整的通知
- 2025年浙江杭州市西湖區(qū)專職社區(qū)招聘85人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 《數(shù)學(xué)廣角-優(yōu)化》說(shuō)課稿-2024-2025學(xué)年四年級(jí)上冊(cè)數(shù)學(xué)人教版
- “懂你”(原題+解題+范文+話題+技巧+閱讀類素材)-2025年中考語(yǔ)文一輪復(fù)習(xí)之寫(xiě)作
- 2025年景觀照明項(xiàng)目可行性分析報(bào)告
- 2025年江蘇南京地鐵集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 2025年度愛(ài)讀書(shū)學(xué)長(zhǎng)參與的讀書(shū)項(xiàng)目投資合同
- 電力系統(tǒng)分析答案(吳俊勇)(已修訂)
- 一種基于STM32的智能門(mén)鎖系統(tǒng)的設(shè)計(jì)-畢業(yè)論文
- 華為經(jīng)營(yíng)管理-華為經(jīng)營(yíng)管理華為的IPD(6版)
評(píng)論
0/150
提交評(píng)論