7

私は今これで頭を悩ませています.... 私はActionBarActivityイニシャルをロードするを持っていますFragment- 元のメニューはアクティビティ内で膨らみます。これで、アイテムが選択されたときに別のフラグメントをロードし、これをバックスタックに追加するナビゲーション バーができました。

これを行うとき、設定したいことがいくつかあります。

  1. ホームをアップ インジケーターとして設定する
  2. メイン アクティビティのオプション メニューを無効にする
  3. セットには、フラグメントに対して true のオプションがあります
  4. アップ インジケーターが元のフラグメントに正しく戻ることを確認します。

かなり奇妙なことが起こっています - アップインジケーターは一度だけ表示され、戻るボタンとして動作しません.新しいメニューを無効にして膨らませましたが、新しいメニューは元のアクティビティメニューに追加されます.

編集:menu.clear()わかりました、追加の問題を解決しました-メソッドに追加するのを忘れましたonCreateOptionsMenu

私のナビゲーション ドロワー レイアウトにはonClick、別の Fragment の読み込みをトリガーするすべてのメニュー項目へのメソッドがあります。

public void navItemClick(View view) {

        switch (view.getId()) {
            case R.id.ripSMS:
                mNavigationDrawer.toggleHome(false);
                getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                FragmentTransaction mTrans = getSupportFragmentManager().beginTransaction();
                mTrans.replace(R.id.voiceover_frame_layout,new MessageFragment(),"main_ui")
                        .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE).addToBackStack("msg").commit();
                break;
            case R.id.ripEmail:
                break;
            case R.id.ripSettings:
                break;
        }

        mNavigationDrawer.closeDrawer();
    }

トグルホーム:

public void toggleHome(boolean show) {
        mDrawerToggle.setDrawerIndicatorEnabled(show);

        if (!show) {
            mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
        } else {
            mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
        }
    }

アイテムがトリガーされるonCreateと、invalidate と hasOptions コードが含まれます。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getActivity().invalidateOptionsMenu();
    setHasOptionsMenu(true);
}

次にonCreateOptionsMenu、別のメニュー レイアウトを拡張します (設定と呼ばれる 1 つの項目を含みます)。

前述のように、これは部分的に 1 回しか機能しません。最初にアイテムを使用してフラグメントをロードすると、戻るアイコンが表示されますが、機能しません (これはonOptionsItemSelected、ホーム アイテムのプレスをチェックするために設定されています。何もしません)。戻るボタンを押すと、正しい場所に戻ります。ただし、戻ると、コードが実行されても戻る矢印が表示されなくなりましたonCreate

4

3 に答える 3

12

わかりましたので、試行錯誤の末、これを解決することができました。2 つの変更が行われました。

  1. 埋め込むaddOnBackStackChangedListener
  2. ActionBarDrawerToggle's setToolbarNavigationClickListener設定する必要がありました

アクティビティが 1 つしかないので (他はすべて Fragment クラスです)、バックスタック リスナーを親アクティビティのonCreateメソッドに追加しました。

getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
                getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            } else {
                getSupportActionBar().setDisplayHomeAsUpEnabled(false);
            }
        }
    });

これにより、フラグメントに戻るときに戻る矢印が消える問題が解決されました。最後に、NavigationDrawer のセットアップ クラスにリスナーを追加しました。

mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getActivity().onBackPressed();
            }
        });

私が持っている唯一の質問は、onOptionsItemSelectedメソッドを使用することを指し示しているすべてだと思いますandroid.R.id.homeが、これはうまくいきませんでした。もちろん、それは私が実装した方法かもしれませんが、誰かが理由について明らかなことを見たら、私に知らせてください!

于 2015-03-08T22:29:58.133 に答える
6

これらの手順は、フラグメントが読み込まれたときにツールバーに戻るボタンを表示するのに役立ちます。クリックすると飛び出します。

setNavigationOnClickListenerアクティビティのツールバーに設定 します。

final DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          if(getSupportFragmentManager().getBackStackEntryCount() > 0){
              getSupportFragmentManager().popBackStack();
          }else {
              drawer.openDrawer(GravityCompat.START);
          }
        }
    });

FragmentManager.OnBackStackChangedListenerあなたのアクティビティに実装します。そして、それをSupportFragmentManager に登録しますOnCreate()

 getSupportFragmentManager().addOnBackStackChangedListener(this);

OnBackStackChangedListener実装方法:

@Override
public void onBackStackChanged() {
    if(getSupportFragmentManager().getBackStackEntryCount() > 0){
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }else {
        getSupportActionBar().setDisplayHomeAsUpEnabled(false);
        toggle.syncState();
    }
}
于 2016-02-27T11:43:58.787 に答える