在郭霖大神的博客中,这方面已经做了比较详细的说说明。点击打开链接
在实现这个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>