Вызов setDisplayHomeAsUpEnabled для фрагментов в ActionBarCompat

Я использую ActionBarCompat. Когда я загружаю дочерний фрагмент, я хочу, чтобы кнопка "Дом" работала как кнопка "вверх". Поэтому я назвал это из дочернего фрагмента:

((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Но кнопка дома не отображается как кнопка "вверх". Я также добавил логику для id android.R.id.home в onOptionsItemSelected, но она по-прежнему не работает. Любые идеи, как я могу это сделать?

Ответ 1

Я боролся с этим в течение нескольких долгих дней, и вот что я нашел для работы. Я надеюсь, что там будет лучшее решение, но это делает работу:

В моей основной деятельности (той, которая запускает фрагмент), создайте следующую публичную функцию, которая будет вызываться дочерним фрагментом:

// The method is in MainActivity.java
public void resetActionBar(boolean childAction, int drawerMode)
{
    if (childAction) {
        // [Undocumented?] trick to get up button icon to show
        drawerToggle.setDrawerIndicatorEnabled(false);
        mActionBar.setDisplayHomeAsUpEnabled(true);
    } else {
        drawerToggle.setDrawerIndicatorEnabled(true);
    }

    drawerLayout.setDrawerLockMode(drawerMode);
}

Затем из вашего фрагмента, который вы хотите, чтобы кнопка Up появлялась, просто вызовите этот метод следующим образом (при необходимости адаптируйте имена классов):

// This method in in SomeFragment.java
((MainActivity)getActivity()).resetActionBar(true,
      DrawerLayout.LOCK_MODE_LOCKED_CLOSED);

Подводя итог, здесь, как включить кнопку из фрагмента:

  • Отключить индикатор ящика на объекте drawerToggle - вызов setDrawerIndicatorEnabled (false)
  • Установить displayHomeAsUp - вызвать setDisplayHomeAsUpEnable (true) в объекте actionBar
  • При необходимости заблокируйте ящик, чтобы он не появлялся при прокрутке края.

Надеюсь, что это поможет, и я надеюсь, что это станет проще в будущем...

Ответ 2

Бит опоздал на сторону:)

Я делюсь этим так, что это может помочь кому-то. У меня есть голова вокруг множества решений, и никто из них не работает отлично. Я использовал варианты решений, доступных в моем проекте, который приведен ниже. Используйте этот код внутри класса, где вы инициализируете панель инструментов и макет ящика.

getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
                drawerFragment.mDrawerToggle.setDrawerIndicatorEnabled(false);
                getSupportActionBar().setDisplayHomeAsUpEnabled(true);// show back button
                toolbar.setNavigationOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        onBackPressed();
                    }
                });
            } else {
                //show hamburger
                drawerFragment.mDrawerToggle.setDrawerIndicatorEnabled(true);
                getSupportActionBar().setDisplayHomeAsUpEnabled(false);
                drawerFragment.mDrawerToggle.syncState();
                toolbar.setNavigationOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        drawerFragment.mDrawerLayout.openDrawer(GravityCompat.START);
                    }
                });
            }
        }
    });

Ответ 3

Я ссылался на ответ и принимал такие изменения:

//add third parameter for Fragment
    public void resetActionBar(boolean childAction, int drawerMode , final Fragment fragment) {
        if (childAction) {
            // [Undocumented?] trick to get up button icon to show
            actionBarDrawerToggle.setDrawerIndicatorEnabled(false);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            toolbar.setNavigationOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    FragmentManager manager = getSupportFragmentManager();
                    FragmentTransaction transaction = manager.beginTransaction();
                    transaction.replace(R.id.mainFrame, fragment);
                    transaction.commit();
                }
            });
        } else {
            actionBarDrawerToggle.setDrawerIndicatorEnabled(true);
        }
        drawerLayout.setDrawerLockMode(drawerMode);
    }

и я вызываю эту функцию в другом фрагменте следующим образом:

//new Homepage it my one of fragments , you can pick up your destination
    ((MainActivity) getActivity()).resetActionBar(true,DrawerLayout.LOCK_MODE_LOCKED_CLOSED,new HomePage());

Я все еще запутался в вопросе жизненного круга, может ли это помочь вам.

Ответ 4

class ABC : Fragment()  {
    override fun onCreate(savedInstanceState: Bundle?) {

        super.onCreate(savedInstanceState)
        **(activity as MainActivity).supportActionBar?.setDisplayHomeAsUpEnabled(false)**
    }
}

Ответ 5

Попробуйте это, также не забудьте указать родительскую активность и метаданные для активности в манифесте

public boolean onOptionsItemSelected(MenuItem item) {

    if (item.getItemId() == android.R.id.home) {

        Intent intent = NavUtils.getParentActivityIntent(this);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        NavUtils.navigateUpTo(this, intent);
        // NavUtils.navigateUpFromSameTask(this);
        // finish();
        return true;
    } else {
        return super.onOptionsItemSelected(item);
    }
}