zoukankan      html  css  js  c++  java
  • 低版本系统兼容的ActionBar(二)ActionProvider+分离式ActionBar+分离式的ActionMode

          

      

      这篇文章主要讲的是在低版本兼容的ActionBar中实现自定义的ActionProvider,ShareActionProvider的使用方法,如何实现分离式ActionBar,外加在分离式ActionBar上的ActionMode的效果。

    一、自定义ActionProvider

    建立一个类,继承android.support.v4.view.ActionProvider,然后复写里面的方法即可。主要就是初始化视图和相应点击事件。

    范例一:

    SettingsActionProvider.java(定义按钮的图标和功能)

    package com.kale.actionbar01.provider;
    
    import android.content.Context;
    import android.content.Intent;
    import android.provider.Settings;
    import android.support.v4.view.ActionProvider;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.widget.ImageButton;
    
    import com.kale.actionbar01.R;
    
    /**
     * @author:Jack Tony
     * 感谢:http://www.bdqn.cn/news/201308/10625.shtml
     * @date  :2014-7-28
     */
    public class SettingsActionProvider extends ActionProvider {
    
        /** An intent for launching the system settings. */
        private static final Intent sSettingsIntent = new Intent(Settings.ACTION_SETTINGS);
    
        /** Context for accessing resources. */
        private final Context mContext;
    
        public SettingsActionProvider(Context context) {
            super(context);
            mContext = context;
            System.out.println("----初始化 SettingsActionProvider----");
        }
    
        @Override
        public View onCreateActionView() {
            // Inflate the action view to be shown on the action bar.
            LayoutInflater layoutInflater = LayoutInflater.from(mContext);
            View view = layoutInflater.inflate(R.layout.setting_layout, null);
            ImageButton button = (ImageButton) view.findViewById(R.id.imageButton_id);
            // Attach a click listener for launching the system settings.
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mContext.startActivity(sSettingsIntent);
                }
            });
            return view;
        }
    
        /**
         * {@inheritDoc}
         */
        @Override
        public boolean onPerformDefaultAction() {
            // This is called if the host menu item placed in the overflow menu of the
            // action bar is clicked and the host activity did not handle the click.
            mContext.startActivity(sSettingsIntent);
            return true;
        }
    }

    范例二:

    MyActionProvider.java(里面添加了子菜单,至于Item的图片在Activity中定义)

    package com.kale.actionbar01.provider;
    
    import android.content.Context;
    import android.support.v4.view.ActionProvider;
    import android.view.MenuItem;
    import android.view.MenuItem.OnMenuItemClickListener;
    import android.view.SubMenu;
    import android.view.View;
    
    import com.kale.actionbar01.R;
    
    public class MyActionProvider extends ActionProvider {
    
        private final Context mContext;
    
        public MyActionProvider(Context context) {
            super(context);
            mContext = context;
            System.out.println("----初始化 MyActionProvider----");
        }
    
        @Override
        public View onCreateActionView() {
            // TODO 自动生成的方法存根
            return null;
        }
    
        @Override
        public void onPrepareSubMenu(SubMenu subMenu) {
            super.onPrepareSubMenu(subMenu);
            subMenu.clear();
            subMenu.add("SubMenu01").setIcon(R.drawable.ic_launcher)
                    .setOnMenuItemClickListener(new OnMenuItemClickListener() {
                        @Override
                        public boolean onMenuItemClick(MenuItem item) {
                            return true;
                        }
                    });
            subMenu.add("SubMenu02").setIcon(R.drawable.ic_launcher)
                    .setOnMenuItemClickListener(new OnMenuItemClickListener() {
                        @Override
                        public boolean onMenuItemClick(MenuItem item) {
                            return true;
                        }
                    });
            subMenu.add("SubMenu03").setIcon(R.drawable.ic_launcher)
                    .setOnMenuItemClickListener(new OnMenuItemClickListener() {
                        @Override
                        public boolean onMenuItemClick(MenuItem item) {
                            return true;
                        }
                    });
        }
    
        @Override
        public boolean hasSubMenu() {
            //告诉系统,这个有子菜单
            return true;
        }
    
    }

    使用方式:

    1.xml布局 res/menu

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        tools:context="com.kale.actionbar01.MainActivity" >
        
        <item android:id="@+id/menu_item_myProvider"
            app:showAsAction="always"
            android:title="自定义"
            app:actionProviderClass="com.kale.actionbar01.provider.SettingsActionProvider"/>
    
    </menu>

    然后

    @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main, menu);
            
            return true;
        }

    2.用代码来建立

    @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main, menu);
            // 在代码中再定义一个自定义的actionProvider
            MenuItem setItem = menu.add("setting").setIcon(R.drawable.ic_compose);
            MenuItemCompat.setActionProvider(setItem, new MyActionProvider(this));
            MenuItemCompat.setShowAsAction(setItem,
                    MenuItemCompat.SHOW_AS_ACTION_ALWAYS);return true;
        }

    二、使用ShareActionProvider

    1.先在XML中定义,在代码中定义的方式同上

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        tools:context="com.kale.actionbar01.MainActivity" >
    
        <item android:id="@+id/menu_item_share_provider"
            app:showAsAction="ifRoom"
            android:title="分享"
            app:actionProviderClass="android.support.v7.widget.ShareActionProvider" />
    
    </menu>

    2.在Activity中进行设置(得到对象,然后设置intent)

    @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main, menu);
    
            shareProvider = (ShareActionProvider) MenuItemCompat
                    .getActionProvider(menu.findItem(R.id.menu_item_share_provider));
            if (shareProvider == null) {
                System.out.println("----------------> is null");
            } else {
                System.out.println("--------------not null-----------");
            }
            shareProvider
                    .setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
            shareProvider.setShareIntent(createShareIntent());
    
            return true;
        }
    
        /**
         * @return The sharing intent.
         */
        private Intent createShareIntent() {
            Intent shareIntent = new Intent(Intent.ACTION_SEND);
            shareIntent.setType("text/plain");
            shareIntent.putExtra(Intent.EXTRA_TEXT, "share");
            return shareIntent;
        }

    三、将ActionBar改为分离式

    感谢:http://www.xue5.com/Mobile/Mobile/738648.html

    1.API > =14 , 在manifest文件中的activitiy节点或application节点中添加 uiOptions=“splitActionBarWhenNarrow”属性

    2.API < 14 , 除了要添加以上属性以外,还需要在activity节点中添加如下节点: 

    <meta-dataandroid:name="android.support.UI_OPTIONS"android:value="splitActionBarWhenNarrow">

    示例代码如下:

        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/Theme.AppCompat.Light.DarkActionBar" >
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name"
                android:uiOptions="splitActionBarWhenNarrow" >
                <meta-data
                    android:name="android.support.UI_OPTIONS"
                    android:value="splitActionBarWhenNarrow" />
    
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>

    四、在分离式的ActionBar上面实现ActionMode

      这个和之前讲的一样,完全没新的东西,直接上代码。

        public void buttonListener(View v) {
            mMode = startSupportActionMode(new AnActionModeOfEpicProportions());
        }
    
        private final class AnActionModeOfEpicProportions implements ActionMode.Callback {
            @Override
            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
    
                MenuItemCompat.setShowAsAction(
                        menu.add("Save").setIcon(R.drawable.ic_compose),
                        MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
                MenuItemCompat.setShowAsAction(
                        menu.add("Search").setIcon(R.drawable.ic_search),
                        MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
    
                MenuItemCompat.setShowAsAction(
                        menu.add("Refresh").setIcon(R.drawable.ic_refresh),
                        MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
    
                MenuItemCompat.setShowAsAction(
                        menu.add("Save").setIcon(R.drawable.ic_compose),
                        MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
    
                MenuItemCompat.setShowAsAction(
                        menu.add("Search").setIcon(R.drawable.ic_search),
                        MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
    
                MenuItemCompat.setShowAsAction(
                        menu.add("Refresh").setIcon(R.drawable.ic_refresh),
                        MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
    
                return true;
            }
    
            @Override
            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                return false;
            }
    
            @Override
            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                Toast.makeText(MainActivity.this, "Got click: " + item,
                        Toast.LENGTH_SHORT).show();
                mode.finish();
                return true;
            }
    
            @Override
            public void onDestroyActionMode(ActionMode mode) {
            }
        }

    源码下载:http://download.csdn.net/detail/shark0017/7687305

  • 相关阅读:
    T Fiddler 教程 _转
    领域模型驱动设计(Domain Driven Design)入门概述 -----DDD 解释
    VS清除打开项目时的TFS版本控制提示
    C#设计模式_转
    CentOS6.5菜鸟之旅:安装Realtek无线网卡驱动
    CentOS6.5菜鸟之旅:安装输入法(小呀小企鹅)
    CentOS6.5菜鸟之旅:U盘安装CentOS64位
    JS魔法堂:属性、特性,傻傻分不清楚
    .Net魔法堂:发个带附件的邮件
    JS魔法堂:那些困扰你的DOM集合类型
  • 原文地址:https://www.cnblogs.com/tianzhijiexian/p/3873259.html
Copyright © 2011-2022 走看看