Как я могу переопределить поведение кнопки навигации ящика и изменить значок? - PullRequest
0 голосов
/ 06 октября 2019

У меня есть приложение, которое использует навигацию по ящикам, чтобы показать разные фрагменты с основными темами. Навигация по ящику

А во фрагменте «Дом» я отображаю разные категории (эти цветные прямоугольники), и когда я выбираю одну категорию, он отображает новый фрагмент с ежедневными и общими сведениями об этой категории. Фрагмент детали) Фрагмент дома

То, что я хочу и не могу понять, как выполнить, находится в этом фрагменте детали, я хочу, чтобы была стрелка назад, которая возвращает меня к фрагменту дома, а незначок меню гамбургера, который открывает ящик навигации. Фрагмент детали

Ответы [ 3 ]

0 голосов
/ 06 октября 2019

Если я предполагаю, что вы используете android.support.v4.widget.DrawerLayout в вашем макете, то этот подход может работать для вас;Я тестировал только API 21, но, учитывая, что он в основном использует библиотеки поддержки, он должен работать (известные последние слова) на более низких или более высоких целях.

import android.support.v7.app.ActionBarDrawerToggle import android. support.v4.widget.DrawerLayout

ActionBarDrawerToggle mDrawerToggle;
DrawerLayout drawerLayout;
private boolean mToolBarNavigationListenerIsRegistered = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setSupportActionBar(mToolbar);
    getSupportActionBar().setDisplayShowTitleEnabled(false);
    // Get DrawerLayout ref from layout
    drawerLayout = (DrawerLayout)findViewById(R.id.drawer);
    // Initialize ActionBarDrawerToggle, which will control toggle of hamburger.
    // You set the values of R.string.open and R.string.close accordingly.
    // Also, you can implement drawer toggle listener if you want.
    mDrawerToggle = new ActionBarDrawerToggle (this, drawerLayout, mToolbar, R.string.open, R.string.close);
    // Setting the actionbarToggle to drawer layout
    drawerLayout.setDrawerListener(mDrawerToggle);
    // Calling sync state is necessary to show your hamburger icon...
    // or so I hear. Doesn't hurt including it even if you find it works
    // without it on your test device(s)
    mDrawerToggle.syncState();
}

/**
 * To be semantically or contextually correct, maybe change the name
 * and signature of this function to something like:
 *
 * private void showBackButton(boolean show)
 * Just a suggestion.
 */
 private void enableViews(boolean enable) {

    // To keep states of ActionBar and ActionBarDrawerToggle synchronized,
    // when you enable on one, you disable on the other.
    // And as you may notice, the order for this operation is disable first, then enable - VERY VERY IMPORTANT.
    if(enable) {
        //You may not want to open the drawer on swipe from the left in this case  
        drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
        // Remove hamburger
        mDrawerToggle.setDrawerIndicatorEnabled(false);
        // Show back button
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        // when DrawerToggle is disabled i.e. setDrawerIndicatorEnabled(false), navigation icon
        // clicks are disabled i.e. the UP button will not work.
        // We need to add a listener, as in below, so DrawerToggle will forward
        // click events to this listener.
        if(!mToolBarNavigationListenerIsRegistered) {
            mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // Doesn't have to be onBackPressed
                    onBackPressed();
                }
            });

            mToolBarNavigationListenerIsRegistered = true;
        }

    } else {
        //You must regain the power of swipe for the drawer. 
        drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);

        // Remove back button
        getSupportActionBar().setDisplayHomeAsUpEnabled(false);
        // Show hamburger 
        mDrawerToggle.setDrawerIndicatorEnabled(true);
        // Remove the/any drawer toggle listener
        mDrawerToggle.setToolbarNavigationClickListener(null);
        mToolBarNavigationListenerIsRegistered = false;
    }

    // So, one may think "Hmm why not simplify to:
    // .....
    // getSupportActionBar().setDisplayHomeAsUpEnabled(enable);
    // mDrawer.setDrawerIndicatorEnabled(!enable);
    // ......
    // To re-iterate, the order in which you enable and disable views IS important #dontSimplify.
}

Решение использует ActionBarDrawerToggle.setDrawerIndicatorEnabled, чтобы переключать видимость значка гамбургера и ActionBar.setDisplayHomeAsUpEnabled для видимости кнопки «Вверх», по существу, используя соответствующие ресурсы рисования.

0 голосов
/ 07 октября 2019

Спасибо за вашу помощь, я получил некоторые идеи из ваших ответов и некоторых других сообщений в Stackoverflow. Если вы думаете, что это плохое решение, пожалуйста, дайте мне знать. Вот как я смог заставить его работать с довольно простым решением (Kotlin):

Поместите это в свои действия onCreate

supportFragmentManager.addOnBackStackChangedListener {
       actionBarDrawerToggle?.isDrawerIndicatorEnabled = supportFragmentManager.backStackEntryCount <= 0
}

и переопределите onSupportNavigateUp ():

override fun onSupportNavigateUp(): Boolean {
    supportFragmentManager.popBackStack()
    return super.onSupportNavigateUp()
}
0 голосов
/ 06 октября 2019

Вы можете сделать это, динамически добавляя панель инструментов к основному виду деятельности, а не используя встроенный навигационный ящик, сделайте его с нуля. при добавлении фрагментов добавляйте панель инструментов на фрагменты. Панель инструментов myChildToolbar = (Панель инструментов) findViewById (R.id.my_child_toolbar);setSupportActionBar (myChildToolbar);

// Get a support ActionBar corresponding to this toolbar
ActionBar ab = getSupportActionBar();

// Enable the Up button
ab.setDisplayHomeAsUpEnabled(true);

Тогда вы сможете переопределить метод для метода навигации по кнопкам вверх, чтобы включить нужную кнопку назад на панели инструментов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...