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

低版本系统兼容的ActionBar(二)ActionProvider+分离式ActionBar+分离式的ActionMode

时间:2014-07-28 23:37:54      阅读:408      评论:0      收藏:0      [点我收藏+]

标签:android   des   style   blog   http   java   color   使用   

bubuko.com,布布扣   bubuko.com,布布扣   bubuko.com,布布扣

  

  这篇文章主要讲的是在低版本兼容的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

 

低版本系统兼容的ActionBar(二)ActionProvider+分离式ActionBar+分离式的ActionMode,布布扣,bubuko.com

低版本系统兼容的ActionBar(二)ActionProvider+分离式ActionBar+分离式的ActionMode

标签:android   des   style   blog   http   java   color   使用   

原文地址:http://www.cnblogs.com/tianzhijiexian/p/3873259.html

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