Intereting Posts
Каков наилучший способ создания чертежей для разных dpi Как удалить повторяющиеся ключи, предварительный просмотр пользовательской клавиатуры Android Параметры макета загруженного представления игнорируются Можно ли настроить пользовательские заголовки HTTP в WebView Android SQLite SQLiteOpenHelper IllegalStateException – DB уже закрыта ошибка Изменение внешнего вида текста в стилях и темах для приложения для Android Использование ContentProviderOperation для обновления и вставки контактов Панель инструментов перекрывается ниже строки состояния Какой флаг использовать в SimpleCursorAdapter? Виртуальное устройство Android, которое не загрузилось Как читать HTTP-ответ через сокеты? Невозможно получить точную форму круга при использовании вида карты Запуск простых тестов JUnit на Android Studio (IntelliJ) при использовании конфигурации на основе Gradle Хранение WebView для автономного просмотра Как запрашивать события календаря Android для определенного диапазона дат?

Панель инструментов AppCompat v7 Up / Back Arrow не работает

У меня есть два фрагмента в действии. Когда отображается фрагмент A, я хочу, чтобы значок гамбургера навигационного ящика показывался, и ящик навигации работал. Когда фрагмент B показывает, я хочу, чтобы стрелка назад показывалась, и когда она нажата, выполните навигацию вверх. Однако я не могу заставить новую панель инструментов AppCompat v7 показывать стрелку вверх вообще в моей ActionBarActivity, если ядро ​​nav открыто.

В моей деятельности для моего метода onCreate () у меня есть …

toolbar = (Toolbar) findViewById(R.id.toolbar); if (toolbar != null) { setSupportActionBar(toolbar); } mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close); mDrawerLayout.setDrawerListener(mDrawerToggle); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); 

И затем я вызываю mDrawerToggle.syncState(); В моем onPostCreate ()

Я попытался найти, как программно запускать значок панели инструментов на стрелку назад, но ничего не сработало. Из того, что я собрал,

 getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); 

Из моего фрагмента следует изменить значок, но это не так. Это может быть глупый вопрос, но что я делаю неправильно?

Solutions Collecting From Web of "Панель инструментов AppCompat v7 Up / Back Arrow не работает"

Из того, что я видел в исходном коде v7 ActionBarDrawerToggle , вы можете анимировать значок в разных состояниях, не открывая ящик.

  private enum ActionDrawableState{ BURGER, ARROW } private static void toggleActionBarIcon(ActionDrawableState state, final ActionBarDrawerToggle toggle, boolean animate){ if(animate) { float start = state == ActionDrawableState.BURGER ? 0f : 1.0f; float end = Math.abs(start - 1); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { ValueAnimator offsetAnimator = ValueAnimator.ofFloat(start, end); offsetAnimator.setDuration(300); offsetAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); offsetAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float offset = (Float) animation.getAnimatedValue(); toggle.onDrawerSlide(null, offset); } }); offsetAnimator.start(); }else{ //do the same with nine-old-androids lib :) } }else{ if(state == ActionDrawableState.BURGER){ toggle.onDrawerClosed(null); }else{ toggle.onDrawerOpened(null); } } } 

Морфинг между Burger и Arrow зависит от значений между 0f и 1.0f , в основном это значения, которые ящик передает в ActionBarDrawerToggle.

Я использовал ValueAnimator для анимации значений в этом диапазоне, т. ValueAnimator переключение ящика.

null аргументы безопасны, потому что ActionBarDrawerToggle совершенно не интересуется представлениями ящиков. Удостоверьтесь, что вы взгляните на новые интерполяторы, чтобы сделать анимацию полностью по книге рекомендаций по дизайну материалов:

 fast_out_linear_in fast_out_slow_in 

Другой подход заключается в доступе mSlider частному полю mSlider ActionBarDrawer посредством метода отражения и вызова setPosition(float position) для переключения между Burger и Arrow. mSlider имеет тип (extends) DrawerArrowDrawable .

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

Поскольку Библиотека поддержки обновлена ​​до 23.0.0, есть лучший способ воспроизвести анимацию стрелок-стрелок. Поэтому я собираюсь улучшить ответ Николы. Вот код:

 public static void playDrawerToggleAnim(final DrawerArrowDrawable d) { float start = d.getProgress(); float end = Math.abs(start - 1); ValueAnimator offsetAnimator = ValueAnimator.ofFloat(start, end); offsetAnimator.setDuration(300); offsetAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); offsetAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float offset = (Float) animation.getAnimatedValue(); d.setProgress(offset); } }); offsetAnimator.start(); } 

И назовите его, когда захотите:

 playDrawerToggleAnim((DrawerArrowDrawable) toolbar.getNavigationIcon()); 
 getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { @Override public void onBackStackChanged() { int stackHeight = getSupportFragmentManager().getBackStackEntryCount(); if (stackHeight > 0) { // if we have something on the stack (doesn't include the current shown fragment) getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } else { getSupportActionBar().setDisplayHomeAsUpEnabled(false); getSupportActionBar().setHomeButtonEnabled(false); } } }); 

После …

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: getSupportFragmentManager().popBackStack(); return true; .... } 

В моем случае значок анимации: я использовал ActionBarDrawerToggle v7.

Основная деятельность:

  Toolbar toolbar = (Toolbar) findViewById(R.id.tool1); setSupportActionBar(toolbar); toolbar.setTitle("ToolBar Demo"); toolbar.setLogo(R.drawable.ic_launcher); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.open_navigation_drawer, R.string.close_navigation_drawer) { @Override public void onDrawerSlide(View drawerView, float slideOffset) { // TODO Auto-generated method stub super.onDrawerSlide(drawerView, slideOffset); } /** Called when a drawer has settled in a completely closed state. */ @Override public void onDrawerClosed(View view) { super.onDrawerClosed(view); getSupportActionBar().setTitle("hello"); } /** Called when a drawer has settled in a completely open state. */ @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); getSupportActionBar().setTitle("hi"); } }; mDrawerLayout.setDrawerListener(mDrawerToggle); } @Override public boolean onOptionsItemSelected(MenuItem item) { // <---- added if (mDrawerToggle.onOptionsItemSelected(item)) { return true; } return super.onOptionsItemSelected(item); } @Override protected void onPostCreate(Bundle savedInstanceState) { // <---- added super.onPostCreate(savedInstanceState); mDrawerToggle.syncState(); // important statetment for drawer to // identify // its state } @Override public void onConfigurationChanged(Configuration newConfig) { // <---- added super.onConfigurationChanged(newConfig); mDrawerToggle.onConfigurationChanged(newConfig); } @Override public void onBackPressed() { if (mDrawerLayout.isDrawerOpen(Gravity.START | Gravity.LEFT)) { // <---- // added mDrawerLayout.closeDrawers(); return; } super.onBackPressed(); }