2016-03-11 6 views
0

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

DrawerArrowDrawable drawerArrow = new DrawerArrowDrawable(this); 
toolbar.setNavigationIcon(drawerArrow) 
mDrawerToggle.syncState(); 

Теперь, когда я открываю фрагмент я использую actionBar.setHomeAsUpIndicator(R.drawable.back_icon); & actionBar.setDisplayHomeAsUpEnabled(true); в этом самом фрагменте, чтобы изменить значок навигации в виде значка обратно. Значок изменяется, но функциональность этой кнопки остается такой же, то есть она открывает навигационный ящик, но я хочу вернуться к предыдущему фрагменту (используя popBackStack).

Я попытался переопределить onOptionsItemSelected:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
     FragmentManager fm = getSupportFragmentManager(); 
     if (fm.getBackStackEntryCount() > 0) { 
      fm.popBackStack(); 
     } 
     break; 
    } 
} 

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

Если я узнаю, что Как перехватить событие click DrawerArrowDrawable? Я мог бы запустить popBackStack и делать то, что хочу.

ответ

0
toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         FragmentManager fm = getSupportFragmentManager(); 
         if (fm.getBackStackEntryCount() > 0) { 
         fm.popBackStack(); 
         } 
        } 
       }); 
+0

Hi @Ankit, спасибо за ваш ответ, но есть одна проблема, после использования кода ящик навигации не открывается при нажатии кнопки. –

+0

Привет @AnasAzeem В методе onDetach фрагмента, из которого вы делаете popBackStack, вам нужно снова установить NavigationDrawer. –

0

Добавить слушателя внутри Активность Навигация Ящика:

private FragmentManager.OnBackStackChangedListener mOnBackStackChangedListener = new FragmentManager.OnBackStackChangedListener() { 
    @Override 
    public void onBackStackChanged() { 
     setActionBarArrowDependingOnFragmentsBackStack(); 
    } 
}; 

Затем создайте этот метод:

public void setActionBarArrowDependingOnFragmentsBackStack() { 
    int backStackEntryCount = getFragmentManager().getBackStackEntryCount(); 
    mDrawerToggle.setDrawerIndicatorEnabled(backStackEntryCount == 0); 
} 

Теперь переопределить эти методы:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    if (mDrawerToggle.isDrawerIndicatorEnabled() && mDrawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } else if (item.getItemId() == android.R.id.home && getFragmentManager().popBackStackImmediate()) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    return super.onCreateOptionsMenu(menu); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 

    getFragmentManager().removeOnBackStackChangedListener(mOnBackStackChangedListener); 

} 

Наконец добавить этот внутри ваш метод onCreate():

getFragmentManager().addOnBackStackChangedListener(mOnBackStackChangedListener); 
+0

Привет @Jofre, спасибо за ваш ответ, но это не сработало для меня. Даже в подфрагментах щелчок по значку открывает навигационный ящик. –

+0

Когда вы делаете транзакцию фрагмента, вы добавляете фрагмент в стопку вправо? 'ft.addToBackStack (null); ft.commit(); ' – Jofre

+0

Да. Я добавляю в задний стек –

Смежные вопросы