23

少なくとも Gmail と Youtube の Android アプリは、スワイプまたはアプリ アイコン (ホーム ボタン) をクリックして開くサイド メニュー (ナビゲーション ドロワー?) を使用します。

ここに画像の説明を入力

上のスクリーンショットのメニュー インジケーター/アイコンは、Android SDK の既製の部分ですか? (または、Google がアプリで使用するカスタム アイコン?) いずれにせよ、ホーム ボタンをそのように見せる、つまり、メニューを開くようにする最も簡単な方法は何ですか?

( targetSdkVersion18; minSdkVersion14)

解像度

最後にそれが機能しました。私にとって欠けていたのは、1)実際のアイコンと2)の延期された呼び出しでしsyncState()ActionBarDrawerToggle

4

3 に答える 3

33

同様の実装を作成したり、アプリケーションを調べたりするにはActionBarDrawerToggle、カスタム アイコンを ActionBar のホーム ボタンの横にあるインジケーターとして使用および設定する必要があります。例えば ​​:

import android.app.ActionBar;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;

private void setUpDrawerToggle(){
    ActionBar actionBar = getActionBar();
    actionBar.setDisplayHomeAsUpEnabled(true);
    actionBar.setHomeButtonEnabled(true);

    // ActionBarDrawerToggle ties together the the proper interactions
    // between the navigation drawer and the action bar app icon.
    mDrawerToggle = new ActionBarDrawerToggle(
            this,                             /* host Activity */
            mDrawerLayout,                    /* DrawerLayout object */
            R.drawable.ic_drawer,             /* nav drawer image to replace 'Up' caret */
            R.string.navigation_drawer_open,  /* "open drawer" description for accessibility */
            R.string.navigation_drawer_close  /* "close drawer" description for accessibility */
    ) {
        @Override
        public void onDrawerClosed(View drawerView) {
            invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
        }

        @Override
        public void onDrawerOpened(View drawerView) {
            invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
        }
    };

    // Defer code dependent on restoration of previous instance state.
    // NB: required for the drawer indicator to show up!
    mDrawerLayout.post(new Runnable() {
        @Override
        public void run() {
            mDrawerToggle.syncState();
        }
    });

    mDrawerLayout.setDrawerListener(mDrawerToggle);
}

R.drawable.ic_drawerインジケータとして使用するアイコンは実際にはどこにありますか。Android Asset Studioで見つけることができます。ナビゲーション ドロワー インジケータを参照してください。

参考文献

  1. ActionBarDrawerToggle
  2. ナビゲーション ドロワーの作成
于 2013-11-01T10:13:11.013 に答える
10

Android-DeveloperHpTermは、正しい方向で私を助けてくれました。

  1. これは確かにNavigationDrawer固有のものであることを指摘しています(Googleの例のようにすでに使用していました)
  2. アイコンの場所を伝えるic_drawer.png(→ Android Asset Studio )

残念ながら、以下のように ActionBarDrawerToggle を作成するだけでは十分ではないようです。少なくとも私の Nexus 7 (API 18) テスト デバイスでは。

drawerToggle = new ActionBarDrawerToggle(this, 
                       drawerLayout, 
                       R.drawable.ic_navigation_drawer, 
                       R.string.side_menu_open, 
                       R.string.side_menu_closed) {
    // ...
};

部分的な解決策 (API レベル 18+)

ただし、インジケーターを表示させる方法が 1 つ見つかりましたsetHomeAsUpIndicator()。欠点: そのメソッドは API レベル 18 で追加されました。

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...
    getActionBar().setDisplayHomeAsUpEnabled(true); // also required
    if (Build.VERSION.SDK_INT >= 18) {
        getActionBar().setHomeAsUpIndicator(
            getResources().getDrawable(R.drawable.ic_navigation_drawer));
    }
}

APIレベル14から17でこれを(私の場合)どのように機能させるのですか?

4.1.2 (API 16) デバイスでic_drawerアイコンが表示されないことを確認しました。setDisplayHomeAsUpEnabled(true)通常の「ホーム」アイコン (左向きの小さな矢印) を取得すると、アプリ アイコンに残されたスペースは空白のままになります。

最終的解決

Android-Developer's answerの編集版を使用して動作するようになりました。

非常に興味深いことに、ActionBarDrawerToggle の初期化コードに欠けていたのは次のとおりです。

   // Defer code dependent on restoration of previous instance state.
   drawerLayout.post(new Runnable() {
        @Override
        public void run() {
            mDrawerToggle.syncState();
        }
    });

それが含まれていれば、電話setHomeAsUpIndicator()は必要ありません

于 2013-11-01T13:17:32.977 に答える