Android中ActionBar的使用

在郭霖大神的博客中,这方面已经做了比较详细的说说明。点击打开链接

在实现这个ActionBar的功能的时候,需要注意一下的几点问题:

(1)在AndroidManifest.xml文件中,application和activity需要配置成NoActionBar的模式。这是为了防止和AppcompactActivity发生冲突。这是要注意的。也就是说,是默认的配置就好了。

(2)为了

/*设置这个方法,ActionBar有一个返回的图标的显示*/
actionBar.setDisplayHomeAsUpEnabled(true);   。                                                                                                                                              使这个方法能够实现点击返回箭头的时候,能够跳转回到主界面。需要配置父Activity.这点是和按返回键是不一样的。当然,在不同的版本中,这个设置是不一样的。可以像以下这样设置:
<meta-data
    android:name="android.support.PARENT_ACTIVITY"
    android:value=".LaunchActivity" />                                                                                                                                                       (3)在配置menu的Item的时候,需要像以下这样设置:
<item
    android:icon="@drawable/ic_launcher"
    android:id="@+id/action_settings"
    android:title="@string/action_settings"
    app:showAsAction="never" />   
<item
    android:id="@+id/action_search"
    android:icon="@drawable/ic_action_search"
    app:actionViewClass="android.support.v7.widget.SearchView"
    android:title="@string/action_search"
    app:showAsAction="ifRoom|collapseActionView"
/>

特别要注意的是,showAsAction需要设置为app:showAsAction:.....
actionViewClass的版本号:
android.support.v7.widget.SearchView"

(4)几个比较重要的方法:
1.
ActionBar actionBar=getSupportActionBar();
/*设置这个方法,ActionBar有一个返回的图标的显示*/
actionBar.setDisplayHomeAsUpEnabled(true);
2
@Override
public boolean onCreateOptionsMenu(Menu menu);
3.
@Override
public boolean onOptionsItemSelected(MenuItem item);
4.返回主界面的方法:
case android.R.id.home:
    Intent upIntent = NavUtils.getParentActivityIntent(this);
    if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
        TaskStackBuilder.create(this)
                .addNextIntentWithParentStack(upIntent)
                .startActivities();
    } else {
        upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        NavUtils.navigateUpTo(this, upIntent);
    }
    return true;
5.获得指定的menu中的Item:
final SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
6.获得指定的ActionProvider:
MenuItem shareItem = menu.findItem(R.id.action_share);
ShareActionProvider myShareActionProvider =
        (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);
7.searchView中的相关的方法:
	
);*/
 /*显示检索的按钮*/
 searchView.setSubmitButtonEnabled(true);
 /*点击检索按钮的时候的事件监听器*/
 searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

     @Override
     public boolean onQueryTextSubmit(String query) {
         Intent intent = new Intent();
         intent.setAction(Intent.ACTION_SEARCH);
         intent.putExtra(SearchManager.QUERY, query);
         startActivity(intent);
         return true;
     }

     @Override
     public boolean onQueryTextChange(String newText) {

         return false;
     }
 });

6.searchView展开和收拢时注册的监听器:
/*主要是为searchView这个ActionView绑定事件监听器。当searchView展开时和
* searchView不展开的时候,分别调用不同的方法*/
MenuItemCompat.OnActionExpandListener expandListener = new MenuItemCompat.OnActionExpandListener() {
    @Override
    public boolean onMenuItemActionCollapse(MenuItem item) {
      Toast.makeText(MainActivity.this,"Collapse",Toast.LENGTH_SHORT).show();
        // Do something when action item collapses
        return true;  // Return true to collapse action view
    }

    @Override
    public boolean onMenuItemActionExpand(MenuItem item) {
        // Do something when expanded
        Toast.makeText(MainActivity.this,"expand",Toast.LENGTH_SHORT).show();
        return true;  // Return true to expand action view
    }
};









项目的结构图如下:

一:AndroidManifest.xml中的代码如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="learnvp.lg.com.actionbardemo">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".LaunchActivity" />
        </activity>
        <activity
            android:name=".LaunchActivity"
            android:label="launchActivity"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".CActivity"
            android:label="@string/title_activity_c"
            android:theme="@style/AppTheme.NoActionBar"></activity>
    </application>

</manifest>

二:LaunchActivity和CActivity都是为了测试使用的,只是在界面设置了按钮,实现了Activity之间的跳转而已。
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;

public class LaunchActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(LaunchActivity.this, CActivity.class));
            }
        });

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }

}

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;

public class CActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_c);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        findViewById(R.id.btnC).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(CActivity.this, MainActivity.class));
            }
        });

    }

}

三:MainActivity中的内容:
import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NavUtils;
import android.support.v4.app.TaskStackBuilder;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.ShareActionProvider;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.ViewConfiguration;
import android.view.Window;
import android.widget.Toast;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
        Toolbar myToolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(myToolbar);
//比较重要的方法:
        ActionBar actionBar=getSupportActionBar();
        /*设置这个方法,ActionBar有一个返回的图标的显示*/
        actionBar.setDisplayHomeAsUpEnabled(true);
//        invalidateOptionsMenu();
        setOverflowShowingAlways();

/*Android 5.0以后,这个方法已经是被抛弃的了,所以在这里这个方法没有实现*/
        /*actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        ActionBar.TabListener tabListener=new ActionBar.TabListener() {
            @Override
            public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {

            }

            @Override
            public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {

            }

            @Override
            public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {

            }
        };

        for (int i = 0; i < 3; i++) {
            actionBar.addTab(actionBar.newTab().setText("Tab"+(i+1)).setTabListener(tabListener));
        }*/
/*
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });*/
    }


/*通过反射来对一些类的内部的私有的属性进行更改
* 在这里,如果一部手机是有menu键的话,那么overflow默认是不显示的。那么我们可以通过下面的这种方法
* 来对它的内部的属性进行更改*/
    private void setOverflowShowingAlways() {
        try {
            ViewConfiguration config = ViewConfiguration.get(this);
            Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
            menuKeyField.setAccessible(true);
            menuKeyField.setBoolean(config, false);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /*这个也是想通过内部的一些方法对一些私有的属性进行更改,可是不行*/
    @Override
    public boolean onMenuOpened(int featureId, Menu menu) {
        if (featureId == Window.FEATURE_ACTION_BAR && menu != null) {
            if (menu.getClass().getSimpleName().equals("MenuBuilder")) {
                try {
                    Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
                    m.setAccessible(true);
                    m.invoke(menu, true);
                } catch (Exception e) {
                }
            }
        }
        return super.onMenuOpened(featureId, menu);
    }

    /*menu中注册的所有的Item都可以在这里进行找到,然后对这些进行操作。*/
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);

        /*主要是为searchView这个ActionView绑定事件监听器。当searchView展开时和
        * searchView不展开的时候,分别调用不同的方法*/
        MenuItemCompat.OnActionExpandListener expandListener = new MenuItemCompat.OnActionExpandListener() {
            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
              Toast.makeText(MainActivity.this,"Collapse",Toast.LENGTH_SHORT).show();
                // Do something when action item collapses
                return true;  // Return true to collapse action view
            }

            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                // Do something when expanded
                Toast.makeText(MainActivity.this,"expand",Toast.LENGTH_SHORT).show();
                return true;  // Return true to expand action view
            }
        };

        final SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        // Assumes current activity is the searchable activity
        final SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        MenuItem searchItem = menu.findItem(R.id.action_search);
        MenuItemCompat.setOnActionExpandListener(searchItem, expandListener);



       /* searchView.setIconifiedByDefault(false);
        searchView.setSubmitButtonEnabled(true);
        MenuItem searchItem = menu.findItem(R.id.action_search);
*/
//       searchView.setSubmitButtonEnabled(true);
     /*  searchView.setOnSearchClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               Intent intent = new Intent();
               intent.setAction(Intent.ACTION_SEARCH);
               intent.putExtra(SearchManager.QUERY, true);
           }
       });*/
        /*显示检索的按钮*/
        searchView.setSubmitButtonEnabled(true);
        /*点击检索按钮的时候的事件监听器*/
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

            @Override
            public boolean onQueryTextSubmit(String query) {
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_SEARCH);
                intent.putExtra(SearchManager.QUERY, query);
                startActivity(intent);
                return true;
            }

            @Override
            public boolean onQueryTextChange(String newText) {

                return false;
            }
        });
/*ShareActionProvider是系统默认的ActionProvider*/
        MenuItem shareItem = menu.findItem(R.id.action_share);
        ShareActionProvider myShareActionProvider =
                (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);


        Intent myShareIntent = new Intent(Intent.ACTION_SEND);
        myShareIntent.setType("image/*");

        myShareActionProvider.setShareIntent(myShareIntent);


        return super.onCreateOptionsMenu(menu);
    }


/*当点击menu中不同的Item的时候,那么就可以触发不同的事件了*/
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement

        switch (id) {

            case R.id.action_search:

                return true;
            case R.id.action_settings:
                Toast.makeText(this, "Hello", Toast.LENGTH_SHORT).show();
                return true;

            case android.R.id.home:
                Intent upIntent = NavUtils.getParentActivityIntent(this);
                if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
                    TaskStackBuilder.create(this)
                            .addNextIntentWithParentStack(upIntent)
                            .startActivities();
                } else {
                    upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    NavUtils.navigateUpTo(this, upIntent);
                }
                return true;
            default:return super.onOptionsItemSelected(item);
        }

    }
}

五:这是自定义的ActionProvider中的内容,可是没有效果:
import android.content.Context;
import android.view.ActionProvider;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;

/**
 * Created by 李果 on 2016/7/18.
 */
public class MyActionProvider extends ActionProvider {

    public MyActionProvider(Context context) {
        super(context);
    }

    @Override
    public View onCreateActionView() {
        return null;
    }

    @Override
    public void onPrepareSubMenu(SubMenu subMenu) {
        subMenu.clear();
        subMenu.add("sub item 1").setIcon(R.drawable.ic_launcher)
                .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        return true;
                    }
                });
        subMenu.add("sub item 2").setIcon(R.drawable.ic_launcher)
                .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        return true;
                    }
                });
    }

    /*必须重写这个方法,表明这个ActionProvider是有俩个子菜单的*/
    @Override
    public boolean hasSubMenu() {
        return true;
    }

}

六: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="learnvp.lg.com.actionbardemo.MainActivity">
    <item
        android:icon="@drawable/ic_launcher"
        android:id="@+id/action_settings"
        android:title="@string/action_settings"
        app:showAsAction="never" />
    <item
        android:id="@+id/action_search"
        android:icon="@drawable/ic_action_search"
        app:actionViewClass="android.support.v7.widget.SearchView"
        android:title="@string/action_search"
        app:showAsAction="ifRoom|collapseActionView"
    />
    <item
        android:actionProviderClass="learnvp.lg.com.actionbardemo.MyActionProvider"
        android:id="@+id/action_my"
        android:title="myProvider"
        android:icon="@drawable/ic_launcher"
        app:showAsAction="ifRoom"/>

    <item android:id="@+id/action_share"
        android:title="@string/share"
        app:showAsAction="ifRoom"
        app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>
</menu>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱coding的同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值