Android:NavigationDrawer和ActionBarCompat

我开始使用ActionBarSherlockNavigationDrawer一起工作,并取得了很好的结果,但是我的公司批准这个开放源代码不可能很快来,所以我正在切换到ActionBarCompat。

ActionBarCompat昨天刚刚正式发布(2013年7月24日)。 有没有人同时兼得? 我希望我能回答我自己的问题,但看看是否有人得到这个工作。 比赛正在进行中! 🙂

YouTube上ActionBarCompat的发布: https //www.youtube.com/watch?v = 6TGgYqfJnyc


更新(工作代码,是的!):我已经从谷歌的示例NavigationDrawer应用程序转换为使用ActionBarCompat,它工作正常。 你可以在这里find它作为参考或开始你的项目: https : //github.com/bcrider/NavigationDrawerActionBarCompat

2.x版本看起来比用ActionBarSherlock做得更好,但是我必须更多地使用ActionBarCompat来看看我是否更喜欢它。


Solutions Collecting From Web of "Android:NavigationDrawer和ActionBarCompat"

注意:我太新了,不能在post中添加多个链接等等,所以我正在回答自己的问题,而不是编辑它(希望不违反规则?)。 一旦允许,将编辑原件。

简单的方法来添加导航抽屉与ActionBarCompat:我发现,转换我现有的应用程序并不像我想象的那样糟糕。 谷歌的样本让我相信碎片是必要的,但事实并非如此。

您可以简单地使用DrawerLayout包装现有的布局,然后插入ListView(或包含ListView的任何布局)以进行实际的导航。 然后添加正常的代码到你现有的Activity(扩展ActionBarActivity),并build立导航,你将不得不反正。

以下是一些用于包装现有布局的示例代码:

<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" > [YOUR EXISTING LAYOUT GOES HERE] <ListView android:id="@+id/left_drawer" android:layout_width="300dp" android:layout_height="match_parent" android:layout_gravity="start" android:background="#111" android:choiceMode="singleChoice" android:divider="@android:color/transparent" android:dividerHeight="0dp" /> </android.support.v4.widget.DrawerLayout> 

如果你想从一个示例应用程序开始使用片段,并从那里开始,这里是我的基于示例代码的github存储库: https : //github.com/bcrider/NavigationDrawerActionBarCompat

我昨天将我的应用程序从ActionBarSherlock转换为ActionBarCompat。 我有一些问题,但没有太严重。

我有一些意见:

为了更新主题,我只需要将“Sherlock”重写为“AppCompat”。 例如,我不是从@ style / Theme.Sherlock.Light.DarkActionBarinheritance,而是从@ style / Theme.AppCompat.Light.DarkActionBarinheritance。

对于行动项目,只需更新这种方式:

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:yourapp="http://schemas.android.com/apk/res-auto" > <item android:id="@+id/action_search" android:icon="@drawable/ic_action_search" android:title="@string/action_search" yourapp:showAsAction="ifRoom" /> ... </menu> 

在onCreateOptionsMenu中,使用正常的MenuItem,但使用MenuItemCompat的静态方法来做ActionBar的东西。 例如:MenuItemCompat.expandActionView(searchMenuItem);

如果您使用从RoboSherlockActivityinheritance的RoboGuice,则只需将其复制并更改为ActionBarActivity即可。 这是我的解决scheme:

 public class RoboActionBarActivity extends ActionBarActivity implements RoboContext { protected EventManager eventManager; protected HashMap<Key<?>, Object> scopedObjects = new HashMap<Key<?>, Object>(); @Inject ContentViewListener ignored; // BUG find a better place to put this @Override protected void onCreate(Bundle savedInstanceState) { final RoboInjector injector = RoboGuice.getInjector(this); eventManager = injector.getInstance(EventManager.class); injector.injectMembersWithoutViews(this); super.onCreate(savedInstanceState); eventManager.fire(new OnCreateEvent(savedInstanceState)); } @Override public void setContentView(int layoutResID) { super.setContentView(layoutResID); contentViewChanged(); } @Override public void setContentView(View view) { super.setContentView(view); contentViewChanged(); } @Override public void setContentView(View view, ViewGroup.LayoutParams params) { super.setContentView(view, params); contentViewChanged(); } @Override public void addContentView(View view, ViewGroup.LayoutParams params) { super.addContentView(view, params); contentViewChanged(); } private void contentViewChanged() { RoboGuice.getInjector(this).injectViewMembers(this); eventManager.fire(new OnContentChangedEvent()); } @Override protected void onRestart() { super.onRestart(); eventManager.fire(new OnRestartEvent()); } @Override protected void onStart() { super.onStart(); eventManager.fire(new OnStartEvent()); } @Override protected void onResume() { super.onResume(); eventManager.fire(new OnResumeEvent()); } @Override protected void onPause() { super.onPause(); eventManager.fire(new OnPauseEvent()); } @Override protected void onNewIntent( Intent intent ) { super.onNewIntent(intent); eventManager.fire(new OnNewIntentEvent()); } @Override protected void onStop() { try { eventManager.fire(new OnStopEvent()); } finally { super.onStop(); } } @Override protected void onDestroy() { try { eventManager.fire(new OnDestroyEvent()); } finally { try { RoboGuice.destroyInjector(this); } finally { super.onDestroy(); } } } @Override public void onConfigurationChanged(Configuration newConfig) { final Configuration currentConfig = getResources().getConfiguration(); super.onConfigurationChanged(newConfig); eventManager.fire(new OnConfigurationChangedEvent(currentConfig, newConfig)); } @Override public void onContentChanged() { super.onContentChanged(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); eventManager.fire(new OnActivityResultEvent(requestCode, resultCode, data)); } @Override public Map<Key<?>, Object> getScopedObjectMap() { return scopedObjects; } } 

现在,您使用supportStartActionMode()启动ActionMode,并从库的包中导入ActionMode。

要使用SearchView,你需要做这样的事情:

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/search" app:actionViewClass="android.support.v7.widget.SearchView" android:icon="@drawable/abc_ic_search" app:showAsAction="always|collapseActionView" android:title="@string/search"/> </menu> @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.search_menu, menu); searchMenuItem = menu.findItem(R.id.search); searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem); if (searchView != null) { searchView.setIconifiedByDefault(false); SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() { public boolean onQueryTextChange(String newText) { return true; } public boolean onQueryTextSubmit(String query) { doSomething(query); return true; } }; searchView.setOnQueryTextListener(queryTextListener); } return super.onCreateOptionsMenu(menu); } 

除此之外,其他的东西都没有修改,只是import的包装。

你可以在这里看到更多的信息: http : //developer.android.com/guide/topics/ui/actionbar.html 。

4.3 sdk的示例看起来很有希望,但是我将创build一个testing项目,并尝试将我自己的应用程序转换为ActionBarCompact并查看它是否比ActionBarSherlock更好或更差。 如果我成功了,我会更新这个post!

虽然提供的例子是好的,但我做了另一个例子,它更接近原来的Google Navigation Drawer例子,因为它包含了所有的原始代码(现在支持库)和格式。 只有一些属性必须replace为类似的属性,因为它们只能从v11开始提供。

从以下url下载: https : //github.com/GunnarBs/NavigationDrawerWithActionBarCompat

注意:这需要v7 appcompat库存在,详情请参阅http://developer.android.com/tools/support-library/setup.html