您的位置:首页 > 其它

10.10上下文菜单与上下文操作模式。

2014-10-10 10:48 155 查看
目的:为应用实现长按列表项删除crime记录功能。

3.0版本前(旧)是在浮动上下文菜单实现

3.0版本后(新)在上下文操作栏呈现。

为兼容API级别,必须定义一种菜单资源,和两组回调方法(新旧各一种)。

18.2.1菜单资源:在res/menu中新建菜单资源文件。

<?xml version="1.0" encoding="utf-8"?>

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item android:id="@+id/menu_item_delete_crime"

android:icon="@android:drawable/ic_menu_delete"

android:title="@string/delete"/>

</menu>

实例化生成上下文菜单的方法:public void onCreateContextMenu(ContextMenu menu,View v,ContextMenu.ContextMenuInfo menuInfo)

创建上下文菜单:

//由于这个菜单回调方法不接受MenuInflater实例参数,所以先获得它,然后调用inflate()方法进行上下文菜单的填充。

public void onCreateContextMenu(ContextMenu menu,View v,ContextMenu.ContextMenuInfo menuInfo){

getActivity().getMenuInflater().inflate(R.menu.crime_list_item_context, menu);

}

18.2.2为上下文登记视图:Fragment方法:public void registerForContextMenu(View view)

如果想为任意列表项登记,直接登记ListView即可,里面的各个列表项会自动登记。

//在onCreateView方法中引用并登记ListView:

ListView listView = (ListView)v.findViewById(android.R.id.list);

registerForContextMenu(listView);

//使用android.R.id.list获取ListFragment管理的ListView,是因为ListFragment的getListView方法只能在onCreateView方法后使用。

18.2.3响应菜单项选择:

public boolean onContextItemSelected(MenuItem item){

AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo();

int position = info.position;

CrimeAdapter adapter = (CrimeAdapter)getListAdapter();

Crime crime = adapter.getItem(position);

switch(item.getItemId()){

case R.id.menu_item_delete_crime:

CrimeLab.get(getActivity()).deleteCrimes(crime);

adapter.notifyDataSetChanged();

return true;

}

return super.onContextItemSelected(item);

}

//因ListView是AdapterView的子类,所以getMenuInfo返回AdapterContextMenuInfo实例。获取选取项的位置,进行操作,还要adapter进行视

图的刷新。

18.3实施上下文操作模式。

上下文操作栏的类和方法不适合于旧系统,所以要分隔开

18.3.1视图列表的多选模式。

很简单,只需要将ListView选择模式设置为CHOICE_MODE_MULTIPE_MODAL即可

if(Build.VERSION.SDK_INT<Build.VERSION_CODES.HONEYCOMB){

registerForContextMenu(listView);

}else{

listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);

}

18.3.2列表视图操作模式回调方法

listView.setMultiChoiceModeListener(new MultiChoiceModeListener(){

@Override

public boolean onCreateActionMode(ActionMode mode, Menu menu) {

MenuInflater inflater = mode.getMenuInflater();

inflater.inflate(R.menu.crime_list_item_context, menu);

return true;

}

@Override

public boolean onPrepareActionMode(ActionMode mode, Menu menu) {

// TODO Auto-generated method stub

return false;

}

@Override

public boolean onActionItemClicked(ActionMode mode,

MenuItem item) {

switch(item.getItemId()){

case R.id.menu_item_delete_crime:

CrimeAdapter adapter = (CrimeAdapter)getListAdapter();

CrimeLab crimeLab = CrimeLab.get(getActivity());

for(int i = adapter.getCount()-1;i>=0;i--){

if(getListView().isItemChecked(i)){

crimeLab.deleteCrimes(adapter.getItem(i));

}

}

mode.finish();

adapter.notifyDataSetChanged();

return true;

default:

return false;

}

}

为了突出显示,改变已选中视图的显示背景

· 基于视图的状态,可使用state list drawable资源改变背景。(好神奇!)它是与屏幕密度无关,所以新建在drawable目录下就可以

了,不需要带修饰符。

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android" >

<item

android:state_activated="true"

android:drawable="@android:color/darker_gray"

/>

</selector>

根元素为selector。

还要对该xml进行引用。

android:background="@drawable/background_activated"

以上的调回方法只适用于listView和gridview视图,其他的视图首先要设置一个实现了View.OnLongClickListener接口的监听器。监听器内部

要自己调用Activity.startActionMode(ActionMode.Callback)方法创建一个ActionMode实例,首先创建一个参数的实例,然后调用方法,或者适用匿名

内部类的方式调用就好。

然后就是学习了针对新旧系统是用回退还是复制操作。这没什么可说的。

最后就是挑战练习,需要我自个来定义选项菜单的定义和操作。

今天就先写到这吧。

现在还是很难记住刚学的东西啊,要时不时的回头看,但更要向下面学。

目前的选择是先看完这本书,然后我再去打算看看老罗的视频。话说视频好像好长啊!不过没关系,我有的,就是时间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: