码迷,mamicode.com
首页 > 其他好文 > 详细

动作视图和动作提供器(Action Views and Action Providers)

时间:2016-04-22 20:36:10      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:

首先承认:这篇文章翻译的有点不准确,因为这个action,我拿不准怎么翻译,不知道是翻译成动词还是名词。所以我把有道词典上的翻译结果列在下面。

action n. 行动;活动;功能;战斗;情节

开始翻译

v7 appcompat 支持库为你的应用提供了几种和用户的交互方式。前面的几节课讲解了如何定义一个action(讲的并不怎么明白)可以是一个按钮或者一个菜单项。这节课讲解如何添加另外两种通用的组件。

  • 应用栏上的动作视图有很多功能。例如,一个搜索动作视图可以让用户在应用栏上输入搜索文字,而不用改变活动或者fragment界面(意思是不用在一个新的界面上进行搜索动作)。

  • 一个动作提供器拥有自定义的布局。这个动作在初始的时候是作为一个按钮或者菜单项出现的,当用户点击这个action的时候,这个动作提供器控制任何你想定义的动作行为。例如当你点击的时候,动作提供器会弹出一个菜单。

安卓支持库提供了几种特定的动作视图和动作提供者组件。例如,SearchView 实现了输入内容来查询的动作视图,ShareActionProvider 实现了与其他应用共享信息的动作提供器。你也可以定义你自己的动作视图和动作提供器。

添加一个动作视图 (Add an Action View)

在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);
}

动作视图展开的时候进行交互(Responding to action view expansion)

如果一个动作元素有一个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;

添加一个动作提供器(Add an Action Provider)

在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类”

接下来进入实践阶段

  1. 在我的mymenu.xml文件中添加一个item项
<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动作视图添加一个搜索文字变化的监听事件。

  • 首先在MainActivity的布局文件中添加一个EditText,用来显示搜索框中输入的内容。在onCreate()方法中找到这个控件。
 @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);
    }

技术分享

下面进入到添加一个动作提供器的实战环节

  1. 在MainActivity中声明一个Intent myShareIntent;
  2. 在onCreateOptionsMenu(Menu 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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!