Android开发基础与案例实战 课件 童长飞 第4、5章 菜单与对话框、多线程与网络应用_第1页
Android开发基础与案例实战 课件 童长飞 第4、5章 菜单与对话框、多线程与网络应用_第2页
Android开发基础与案例实战 课件 童长飞 第4、5章 菜单与对话框、多线程与网络应用_第3页
Android开发基础与案例实战 课件 童长飞 第4、5章 菜单与对话框、多线程与网络应用_第4页
Android开发基础与案例实战 课件 童长飞 第4、5章 菜单与对话框、多线程与网络应用_第5页
已阅读5页,还剩90页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

菜单与对话框

4.1任务1-使用选项菜单OptionsMenu21菜单的XML文件2选项菜单的创建方法3选项菜单的事件响应方法OptionsMenuOptionsMenu不依赖于内容,在应用创建视图时,OptionsMenu也被生成,常用于全局场合项目模板创建一个空白活动页面时,默认没有菜单文件夹,在创建OptionsMenu时,可利用向导创建相关文件夹和文件重要方法onCreateOptionsMenu()应用首次生成选项菜单时调用,之后不再被调用,适合生成静态菜单onPrepareOptionsMenu()没次点击选项菜单时被调用,适合生成动态内容的菜单项onOptionsItemSelected()选项菜单的点击事件回调菜单XMLmenu根节点item节点为菜单项android:title菜单项在菜单中所显示的文本android:icon菜单项的图标,须与app:showAsAction配合app:showAsAction属性always:在动作栏以图标形式显示菜单项3相关布局文件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选项创建实现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对象上

//newMenuInflater(getApplicationContext()).inflate(R.menu.opt_menu,menu);

//也可以使用MenuInflater填充菜单

returnsuper.onCreateOptionsMenu(menu);

}

@Override

publicbooleanonOptionsItemSelected(@NonNullMenuItemitem){

Strings="";

//哪个选项菜单项被选中,建议使用菜单项的id进行判断

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任务2-使用上下文菜单ContextMenu61注册上下文菜单2上下文菜单的创建和点击响应方法3上下文菜单获取触发位置4适配器数据的更新ContextMenuContextMenu依赖于内容,需要注册才能被使用调用registerForContextMenu()方法对UI对象注册ContextMenu长按被注册的视图,弹出上下文菜单重要方法onCreateContextMenu()每次弹出上下文菜单均会被调用onContextItemSelected(MenuItemitem)菜单项点击事件回调若是针对ListView、GridView等组件,需要知道弹出上下文菜单的位置item.getMenuInfo()方法得到ContextMenuInfo对象无法得到position或者id信息须将ContextMenuInfo对象强制类型转换成AdapterContextMenuInfo对象适配器视图更新方法notifyDataSetChanged()方法一旦数据源的数据发生变化,需要调用适配器更新视图,保持视图与数据的一致性7项目的布局文件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>实现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);

//对ListView视图注册ContextMenu,长按ListView视图会弹出ContextMenu

//若不注册ContextMenu,则不会生成对应菜单

}

@Override

publicvoidonCreateContextMenu(ContextMenumenu,Viewv,

ContextMenu.ContextMenuInfomenuInfo){

super.onCreateContextMenu(menu,v,menuInfo);

getMenuInflater().inflate(R.menu.ctx_menu,menu);

//将res/menu/ctx_menu.xml菜单生成到菜单对象menu上

}

@Override

publicbooleanonContextItemSelected(@NonNullMenuItemitem){

ContextMenu.ContextMenuInfomenuInfo=item.getMenuInfo();

//通过item获得菜单项对象ContextMenuInfo

AdapterView.AdapterContextMenuInfoadapterContextMenuInfo=

(AdapterView.AdapterContextMenuInfo)menuInfo;

//将ContextMenuInfo对象强制类型转换为AdapterContextMenuInfo

//通过AdapterContextMenuInfo获得位置信息position

intposition=adapterContextMenuInfo.position;

switch(item.getItemId()){

caseR.id.ctx_insert:

Strings=String.format("Random:%d",newRandom().nextInt(1000));

//产生一个区间为[0,1000)的随机整数(不包括1000)

list.add(position,s);//数据源插入数据s至指定位置position

adapter.notifyDataSetChanged();

//数据源发生变化,通知适配器数据更新,适配器全盘更新

break;

caseR.id.ctx_delete:

list.remove(position);//数据源删除指定位置position的数据

adapter.notifyDataSetChanged();//通知适配器更新视图

break;

}

returnsuper.onContextItemSelected(item);

}

}4.3任务3-使用弹出菜单PopupMenu101上下文菜单的局限性2PopupMenu可以实现多视图注册3PopupMenu的使用方法项目的布局文件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>基于上下文菜单的双视图注册12publicclassMainActivityextendsAppCompatActivity{

ArrayList<String>list=newArrayList<>();

ArrayAdapter<String>adapter;

ListViewlv;

TextViewtv;

intctx_position=0;//设置ContextMenu触发位置的变量为全局变量

@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);//对ListView视图注册ContextMenu

tv=findViewById(R.id.tv_result);

registerForContextMenu(tv);//对TextView视图注册ContextMenu

}

@Override

publicvoidonCreateContextMenu(ContextMenumenu,Viewv,

ContextMenu.ContextMenuInfomenuInfo){

super.onCreateContextMenu(menu,v,menuInfo);

if(v==lv){

//若是ListView,生成对应菜单,并获得位置信息赋给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触发的ContextMenu对象对应的menuInfo是null,无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);//设置文本字体大小

break;

caseR.id.ctx_tv_16:

tv.setTextSize(16.0f);

break;

}

returnsuper.onContextItemSelected(item);

}

}PopupMenu使用要点PopupMenu的构造方法publicPopupMenu(android.content.Contextcontext,android.view.Viewanchor)context为上下文,可通过传递Activity对象或者直接通过getApplicationContext()方法获得anchor为PopupMenu所依赖的视图,即可理解为PopupMenu所需要注册的视图构造出PopupMenu的对象popupMenu,使用popupMenu实现菜单填充和事件处理菜单填充popupMenu.getMenuInflater()方法得到菜单填充器,进而通过菜单填充器的inflate()方法填充菜单popupMenu.getMenu()方法获得Menu对象需要调用show()方法进行显示事件处理PopupMenu对象调用setOnMenuItemClickListener()方法设置侦听器onMenuItemClick()回调方法中进行处理PopupMenu可以对不同视图分别注册,得到不同的PopupMenu对象,并分别对之进行菜单填充和事件侦听处理,提高代码解耦性13基于PopupMenu的实现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);//对ListView视图注册ContextMenu

TextViewtv=findViewById(R.id.tv_result);

tv.setOnLongClickListener(newView.OnLongClickListener(){

//利用对象tv长按弹出PopupMenu

@Override

publicbooleanonLongClick(Viewv){

showTextViewPopUpMenu(tv);//自定义方法,显示PopupMenu

returntrue;//true表示长按事件不再往下传,false则继续往下传递事件

}

});

}

privatevoidshowTextViewPopUpMenu(TextViewv){

PopupMenupopupMenu=newPopupMenu(getApplicationContext(),v);

//对视图v生成菜单对象popupMenu

popupMenu.getMenuInflater()

.inflate(R.menu.ctx_tv_menu,popupMenu.getMenu());

//利用菜单对象popupMenu的getMenuInflater()方法获得对应菜单填充器

//利用菜单对象popupMenu的getMenu()方法获得Menu对象menu

popupMenu.setOnMenuItemClickListener(

newPopupMenu.OnMenuItemClickListener(){

//对popupMenu设置菜单项点击侦听

@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表示菜单项选中事件不再往下传,false则继续下传

}

});

popupMenu.show();//调用show()方法显示PopupMenu

}

@Override

publicvoidonCreateContextMenu(ContextMenumenu,Viewv,

ContextMenu.ContextMenuInfomenuInfo){

}

@Override

publicbooleanonContextItemSelected(@NonNullMenuItemitem){

}

}4.4任务4-使用对话框AlertDialog151消息对话框2列表对话框3单选对话框对话框AlertDialog的使用要点AlertDialog使用AlertDialog.Builder()方法创建1个Builder对象setTitle()方法设置对话框标题setMessage()方法设置对话框的文本内容setItems()方法设置列表数据和点击侦听setSingleChoiceItems()方法设置单选数据、默认选中位置和点击侦听setView()方法设置自定义视图,此时建议使用LayoutInflater从布局文件中生成视图对象setMultiChoiceItems()方法设置多选内容、多选默认选中的数据和相关侦听事件setAdapter()方法设置适配器setCursor()方法设置Cursor数据,Cursor为数据库查询返回的游标setIcon()方法设置图标show()方法显示对话框对话框的按钮设置方法setPositiveButton()方法设置确定按钮setNegativeButton()方法设置取消按钮setNeutralButton()方法设置中间按钮第1个参数是按钮所显示的文本第2个参数是对应的点击事件接口,若不需要处理点击事件,可传入null16项目的布局文件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="消息对话框"/>

<Button

android:id="@+id/bt2"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="列表对话框"/>

<Button

android:id="@+id/bt3"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="单选对话框"/>

</LinearLayout>实现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("这是一个消息提示框");

}

});

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代表不对事件响应做处理

bl.show();

}

privatevoidshowItemsDialog(String[]hobbies){

AlertDialog.Builderbl=newAlertDialog.Builder(this);

bl.setTitle("列表框").setItems(hobbies,

newDialogInterface.OnClickListener(){

@Override

publicvoidonClick(DialogInterfacedialog,intwhich){

//每次点击列表项均会更新TextView

Stringhobby=hobbies[which];

//若要在PositiveButton点击事件中获得hobby

//不借助全局变量或者自定义类,难以实现

tv.setText(hobby);

}

});

bl.setNegativeButton("退出",null);

bl.show();

}实现MainActivity(续)19

privatevoidshowSingleChoiceDialog(String[]hobbies){

//finalintchoiceIndex=0;//无法实现,final变量不能被二次赋值

//finalIntegerchoiceIndex=newInteger(0);

//无法实现,Integer类没有setter相关方法

finalMyIntegermyInteger=newMyInteger(0);

//不加final无法在匿名回调方法中被访问

//通过自定义类解决int类型的final变量不能二次赋值问题

//myInteger不能重新指向new对象,但可以调用类方法对类成员改值

AlertDialog.Builderbl=newAlertDialog.Builder(this);

bl.setTitle("单选对话框");

bl.setSingleChoiceItems(hobbies,myInteger.getPosition(),

newDialogInterface.OnClickListener(){

@Override

publicvoidonClick(DialogInterfacedialog,intwhich){

//showMessageDialog("inside");//测试对话框中是否能生成另一个对话框

myInteger.setPosition(which);

//通过setPosition()方法给类成员变量重新赋值

}

});

bl.setPositiveButton("确定",newDialogInterface.OnClickListener(){

//点击确定按钮,在回调中处理确定按钮对应的逻辑,更新爱好选项到TextView

@Override

publicvoidonClick(DialogInterfacedialog,intwhich){

//从自定义类对象myInteger中取选中索引值

intposition=myInteger.getPosition();

tv.setText(hobbies[position]);

}

});

bl.setNegativeButton("退出",null);

bl.show();

}

classMyInteger{

//定义一个内部类解决final问题

//类对象变成final,不能重新指向对象,但是可以调用类的相

//关方法改变类成员变量的值

privateintposition=0;

publicMyInteger(intposition){

this.position=position;

}

publicintgetPosition(){

returnposition;

}

publicvoidsetPosition(intposition){

this.position=position;

}

}

}通过自定义类实现final变量的赋值问题4.5任务5-使用自定义视图对话框201自定义视图的使用方法2利用自定义接口提高代码的解耦性3使用对话框新增修改数据项目的布局文件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>数据封装类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(){

//必须改写toString()方法,否则无法将PhoneData字符串化显示在适配器中

returnString.format("%s%s",name,phone);

}

}未改写toString(),ArrayAdapter显示效果实现自定义视图对话框PhoneDataDialog23publicclassPhoneDataDialog{

privateContextcontext;//LayoutInflater需要Context参数

privateStringtitle;//对话框标题

publicinterfaceOnSubmitListener{//自定义一个接口

voidonSubmit(PhoneDataupdatedData);

//通过用户实现接口的onSubmit()方法对updatedData进行处理

//使用updatedData修改数据或者新增数据完全取决于用户实现的代码

//接口回调在对话框的确定按钮中触发

}

publicPhoneDataDialog(Contextcontext,Stringtitle){

this.context=context;

this.title=title;

}

publicvoidshowDialog(PhoneDatadata,OnSubmitListenerl){

/***

data数据是用户传进来的待修改数据,若是新增数据,可传null

OnSubmitListener是用户实现的接口,在确定按钮中触发回调,

通过onSubmit(PhoneDataupdatedData)传出修改后的数据updatedData

用户则在调用showDialog()时实现回调方法,对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);

//将布局文件填充为视图对象v

EditTextet_name=v.findViewById(R.id.dialog_et_name);

EditTextet_phone=v.findViewById(R.id.dialog_et_phone);

//对两个EditText赋data传进的初值

et_name.setText(temp.getName());

et_phone.setText(temp.getPhone());

AlertDialog.Builderbl=newAlertDialog.Builder(context);

bl.setTitle(title);

bl.setView(v);//将XML布局填充的视图对象v设置为对话框的内容

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){//判断接口非空才能设置自定义接口回调

l.onSubmit(updatedData);

}

}

});

bl.show();

}

}实现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个PhoneData数据

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. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论