标签:
首先承认:这篇文章翻译的有点不准确,因为这个action,我拿不准怎么翻译,不知道是翻译成动词还是名词。所以我把有道词典上的翻译结果列在下面。
action n. 行动;活动;功能;战斗;情节
开始翻译
v7 appcompat 支持库为你的应用提供了几种和用户的交互方式。前面的几节课讲解了如何定义一个action(讲的并不怎么明白)可以是一个按钮或者一个菜单项。这节课讲解如何添加另外两种通用的组件。
应用栏上的动作视图有很多功能。例如,一个搜索动作视图可以让用户在应用栏上输入搜索文字,而不用改变活动或者fragment界面(意思是不用在一个新的界面上进行搜索动作)。
一个动作提供器拥有自定义的布局。这个动作在初始的时候是作为一个按钮或者菜单项出现的,当用户点击这个action的时候,这个动作提供器控制任何你想定义的动作行为。例如当你点击的时候,动作提供器会弹出一个菜单。
安卓支持库提供了几种特定的动作视图和动作提供者组件。例如,SearchView 实现了输入内容来查询的动作视图,ShareActionProvider 实现了与其他应用共享信息的动作提供器。你也可以定义你自己的动作视图和动作提供器。
在toolbar的菜单资源文件中新建一个元素,来添加一个动作视图。
actionViewClass: 实现了这个动作的组件的类
actionLayout: 描述这个动作的内容的布局文件
showAsAction 属性可以取值为”ifRoom|collapseActionView” 或者 “never|collapseActionView”.(collapse意思是可折叠的)collapseActionView 表示当用户没有和当前action交互的时候action组件如何展示。如果组件是在应用栏上,这个组件会展示为一个图标。如果这个组件是在overflow按钮中,这个组件会展示为一个菜单项。当用户和这个组建交互的时候,这个组件会填满到整个应用栏。
例如,下面的代码给应用栏添加了一个SearchView
<item
android:id="@+id/action_search"
android:title="搜索"
android:icon="@drawable/ic_search_white_48dp"
app:showAsAction="always|collapseActionView"
app:actionViewClass="android.support.v7.widget.SearchView"/>
如果用户没有和这个组件交互的时候,应用会把这个组件展示为一个图标。(通过android:icon 定义的图标)(如果应用栏上没有足够的空间,就把这个组件附加到overflow菜单中。)当用户点击了这个图标或者菜单项,这个组件会充满整个toolbar,允许用户和它交互。
图表1:当用户点击了一个动作视图的图标,这个视图会充满整个toolbar。
如果你需要设置这个动作视图,在你的activity的onCreateOptionsMenu()回调方法中设置。你可以调用getActionView()这个静态方法得到这个动作视图的引用。例如,下面的代码得到了上面示例代码中定义的SearchView的引用。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_activity_actions, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView =
(SearchView) MenuItemCompat.getActionView(searchItem);
// 设置搜索内容并添加事件监听等等。。。
return super.onCreateOptionsMenu(menu);
}
如果一个动作元素有一个collapseActionView的标志。那么当用户不和这个动作视图交互的时候,应用会把这个动作视图展示为一个图标。当用户点击了这个图标,onOptionsItemSelected()的内置处理程序会把这个动作视图展开。如果你集成了Activity并且重写了onOptionsItemSelected()方法,你复写的方法必须(must)调用super.onOptionsItemSelected(),不然这个动作视图不能展开。
如果当这个动作视图展开或者折叠起来的时候你想做一些事情,你可以定义一个类实现MenuItem.OnActionExpandListener并作为一个参数传递给 setOnActionExpandListener()。例如,当这个动作视图展开或者折叠的时候你想更新这个activity。下面的片段展示了如何定义并传递一个listener。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.options, menu);
// ...
//定义一个监听器
OnActionExpandListener expandListener = new OnActionExpandListener() {
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
// 当item折叠起来的时候的处理动作
return true; // 返回true来折叠起这个动作视图
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
// 当item展开来的时候的处理动作
return true; // 返回true来展开这个动作视图
}
};
// Get the MenuItem for the action item
MenuItem actionMenuItem = menu.findItem(R.id.myActionItem);
// 给这个动作视图添加监听
MenuItemCompat.setOnActionExpandListener(actionMenuItem, expandListener);
//选项菜单创建的时候,你想做的其他事情
return true;
在toolbar的菜单资源文件中新建一个元素来声明一个动作提供器。添加一个actionProviderClass属性,并赋值为内容提供器类的全路径名。
例如,下面的代码声明了了一个ShareActionProvider。这是支持库中的一个组件用来与其他应用共享数据。
<item android:id="@+id/action_share"
android:title="@string/share"
app:showAsAction="ifRoom"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>
在这种情况下,不必要为这个组件提供一个图标,因为ShareActionProvider自带了图标,但是如果你要用一个自定义的图标,那就声明一个图标。
关于自定义一个动作提供器更多信息,请参考 “ ActionProvider reference ”。更多关于设置ShareActionProvider的信息,请参考“ShareActionProvider类”
<item
android:id="@+id/action_search"
android:title="搜索"
android:icon="@drawable/ic_search_white_48dp"
app:showAsAction="always|collapseActionView"
app:actionViewClass="android.support.v7.widget.SearchView"/>
2 .然后在MainActivity中重写方法 onCreateOptionsMenu(Menu menu)
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//这句话的意思是把mymenu加载到menu中
getMenuInflater().inflate(R.menu.mymenu, menu);
return super.onCreateOptionsMenu(menu);
}
3.看一下运行效果
4.给这个search动作视图添加一个搜索文字变化的监听事件。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//这句话的意思是把mymenu加载到menu中
getMenuInflater().inflate(R.menu.mymenu, menu);
MenuItem searchItem=menu.findItem(R.id.action_search);
SearchView searchView= (SearchView) MenuItemCompat.getActionView(searchItem);
/**
* 添加一个搜索文字的监听事件制作,只做一个简单的操作,
*/
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
//在这里搜索框里输入什么editText就显示什么
editText.setText(newText);
return true;
}
});
return super.onCreateOptionsMenu(menu);
}
4.给这个search动作视图添加一个展开和折叠的监听事件。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//这句话的意思是把mymenu加载到menu中
getMenuInflater().inflate(R.menu.mymenu, menu);
MenuItem searchItem=menu.findItem(R.id.action_search);
MenuItemCompat.OnActionExpandListener expandListener=new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
Toast toast= Toast.makeText(MainActivity.this,"搜索框展开了",Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER,0,0);
toast.show();
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
Toast toast=Toast.makeText(MainActivity.this,"搜索框折叠了",Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER,0,0);
toast.show();
return true;
}
};
MenuItemCompat.setOnActionExpandListener(searchItem,expandListener);
return super.onCreateOptionsMenu(menu);
}
下面进入到添加一个动作提供器的实战环节
//这句话的意思是把mymenu加载到menu中
getMenuInflater().inflate(R.menu.mymenu, menu);
MenuItem shareItem = menu.findItem(R.id.action_share);
ShareActionProvider myShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);
myShareIntent = new Intent(Intent.ACTION_SEND);
myShareIntent.setType("image/*");
//我手机的内存卡的根目录的Pictures目录下有一张叫share的图片,我要把它分享给qq好友
File imgFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/share.jpg");
myShareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(imgFile));
myShareActionProvider.setShareIntent(myShareIntent);
3.在onOptionsItemSelected(MenuItem item)中操作
switch (item.getItemId()) {
case R.id.action_share:
//分享图片
MainActivity.this.startActivity(Intent.createChooser(myShareIntent, "分享图片"));
return true;
}
return super.onOptionsItemSelected(item);
效果如下
差不多就到这了,关于toolbar的翻译应该结束了。有疑问和错误的地方欢迎指出。
动作视图和动作提供器(Action Views and Action Providers)
标签:
原文地址:http://blog.csdn.net/leilifengxingmw/article/details/51199283