2013-07-25 16 views
9

私はActionBarSherlockを使用してNavigationDrawerで作業を開始し、良い結果を得たが、このオープンソースの承認を私の会社は、いつでもすぐに来そうにないので、私はActionBarCompatに切り替えるには働いています。アンドロイド:NavigationDrawerとActionBarCompat

ActionBarCompatは、正式に昨日(2013年7月24日)にリリースされました。誰もがお互いにうまくやっているのですか?私は自分の質問に答えることができると思っていますが、誰かがこれを働かせているかどうかを見ています。レースは始まった! :-)

のYouTube ActionBarCompatのリリースについて: https://www.youtube.com/watch?v=6TGgYqfJnyc


UPDATE(作業コード、はい!):私はGoogleからのサンプルNavigationDrawerアプリを得ている がActionBarCompatを使用するように変換され、それは正常に動作しています。あなたは、参照としてここでそれを見つけるか、プロジェクトに起動することができます。 https://github.com/bcrider/NavigationDrawerActionBarCompat

2.xバージョンは、それがActionBarSherlockで行った方法よりもさらに良く見えるが、私が見て、より多くのActionBarCompatで作業する必要があります私はそれがより好きならば。 4.3 SDKに付属して


+0

ActionBar compatとNav drawerであなたの経験を知りたいですが、私もNav DrawerとABSを使いました。 –

+0

メニュー項目を除いてうまく動作します。正しい構文についてこの回答を確認してください。http://stackoverflow.com/questions/17913311/is-it-possible-to-have-a-action-bar-menu-using-the-appcompat-library – Zeezer

+0

Appearpat Drawer Navが非常に遅いです私のM860 Motorolaでさえ、私はいくつかのCustom Drawer libを試してみたが、その性能ははるかに良くなった。 – Singgum3b

答えて

13

注:私はポストなどで複数のリンクを追加するには新しく、編集する代わりに自分の質問に答える(ルールに反しないことを願っていますか?)。一度許可されたオリジナルを編集します。 ActionBarCompatとナビゲーションドロワーを追加する

簡単な方法: 私は私の既存のアプリを変換すると、私はそれがために思っていたほど悪くはなかったことがわかりました。 Googleのサンプルは、フラグメントが必要であると信じていましたが、それはそうではありませんでした。

実際のナビゲーションでは、既存のレイアウトをDrawerLayoutで折り返して、ListView(またはその点でListViewを含むレイアウト)を差し込むだけです。そして、あなたの既存のActivity(ActionBarActivityを拡張)に通常のコードを追加して、とにかくナビゲーションを構築します。

ことはここでは、既存のレイアウトをラップするといくつかのサンプルコードです:

<?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

0

サンプルは有望に見えるが、私はテストプロジェクトを作成し、ActionBarCompactに自分のアプリケーションを変換し、それが良いか悪いActionBarSherlockより機能かどうかを確認しようとするつもりです!私が成功したかどうかはこの投稿を更新します!

+2

最後にこれに戻り、私は統合プロセスに欠けているステップを見つけた。ビデオは、プロジェクトをライブラリとしてインポートすることを明確に示していません。一度それをしたら、多くの問題が解消されました。 \ sdk \ extras \ android \ support \ v7 \ appcompatを自分のワークスペースにインポートし、それをメインプロジェクトにライブラリとして追加しました。ビデオが示唆しているようにjarファイルをコピーするだけでは十分ではありませんでした。 –

2

昨日私のアプリをActionBarSherlockからActionBarCompatに変換しました。私はいくつかの問題を抱えていますが、それほど深刻なことはありませ

私はいくつかのコメントがあります

は、テーマを更新するには、私はちょうど「シャーロック」に「APPCOMPAT」を上書きする必要がありました。たとえば、@ style/Theme.Sherlock.Light.DarkActionBarから継承する代わりに、@ style/Theme.AppCompat.Light.DarkActionBarから継承しています。アクション項目については

、ちょうどこの方法を更新します。通常のMenuItemを使用し、

<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ではなく、アクションバーのものを行うためにMenuItemCompatの静的メソッドを使用します。たとえば:MenuItemCompat.expandActionView(searchMenuItem);

RoboSherlockActivityを継承しているRoboGuiceを使用している場合は、コピーしてActionBarActivityに変更するだけで問題が発生します。ここに私のソリューションです:

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); 
} 

他の事は全く変更が、輸入品のパッケージで作業しています。

詳しくは、http://developer.android.com/guide/topics/ui/actionbar.htmlをご覧ください。

+0

非常に良い!私はあなたがABSからABCに変換した後、次の1週間かそこらでそれを使い始めるつもりで、あなたが検索ビューの作品を言いましたことをうれしく思っています。 –

+0

まあ、SearchViewに問題があります。ここをクリックしてください:http://stackoverflow.com/questions/17898282/searchview-taking-all-the-space-in-the-new-actionbarcompat –

+0

別のロードブロッキング:ActionBarCompatをMapActivityで使用します。既にあなたはそのロードブロッキングを通過している可能性はありますか?私はここに質問を投稿した:http://stackoverflow.com/questions/17980503/actionbarcompat-and-mapactivity –

0

提供されている例は良いですが、オリジナルのGoogle Navigation Drawerの例にもう少し近い別の例を示しました(ライブラリのサポートを目指しています)。 一部の属性のみがv11以降で使用可能なものと同様のものに置き換えられました。 https://github.com/GunnarBs/NavigationDrawerWithActionBarCompat

注:で

ダウンロードこれが存在することがV7 APPCOMPATライブラリを必要とし、詳細についてはhttp://developer.android.com/tools/support-library/setup.htmlを参照してください。

関連する問題