20

Я имею следующую проблему:Android - Переключатель ActionBar Кнопка Назад к навигации Кнопка

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

Отсюда:
enter image description here

к этому:

enter image description here

с помощью: getSupportActionBar().setDisplayHomeAsUpEnabled(true);


Теперь я хочу сделать обратное действие, я хочу, чтобы перейти от значок кнопки «Назад» на значок гамбургера:

enter image description here

сюда:

enter image description here

Как я могу это сделать?

Update:

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

    setSupportActionBar(mToolbar); 
    getSupportActionBar().setDisplayShowTitleEnabled(false); 
} 

private void enableViews(boolean enable) { 
    if(enable) { 
     // Enables back button icon 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    } else { 
     // TODO: Enables burger icon 
    } 
} 
+0

может быть, эта ссылка поможет вам http://stackoverflow.com/a/28072236/1607191 –

ответ

59

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

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

ActionBarDrawerToggle mDrawerToggle; 

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 = (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) { 
      // 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 { 
      // 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 для видимости кнопки Up, по существу, используя свои drawable ресурсов.

Другие предположения

  • Ваша тема активность распространяется Theme.AppCompat.Light.NoActionBar.
+2

Amazing, @ Ade.Akinyede! Это именно то, что я искал. Вы выполнили все мои требования к подаче, дали хорошее объяснение и хороший пример, также вы сделали хороший анализ и предложения. Вы заработали щедрость – Antonio

+1

Рад это услышать :) –

+0

@ ade.akinyede Спасибо за ответ, мой следующий вопрос: как я мог пропустить эти кнопки при переходе к значкам гамбургера и обратно? –

0

вы можете изменить кнопку действия бар с:

 getSupportActionBar().setHomeAsUpIndicator(R.drawable.back_button); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
+0

Спасибо за ваш ответ, @ Мартин Huergo. Я ожидаю, что не предоставит ярлык, если только он не является родным android drawable – Antonio

+0

, это хорошо для взлома. – cweitat

0

Используйте этот

getSupportActionBar().setDisplayShowHomeEnabled(true); 
0
final Toolbar toolbar = (Toolbar) findViewById(R.id.actionbar); 
     toolbar.setTitle(Html.fromHtml("<font color=#ffffff>" +  getString(R.string.print_s) + "</font>")); 
     toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.menu_icon)); 
    toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      DetailActivity.this.finish(); 
     } 
    }); 
    toolbar.inflateMenu(R.menu.fav); 
    toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener()  { 
     @Override 
     public boolean onMenuItemClick(MenuItem item) { 
       item.setIcon(R.drawable.back_icon) 
       return true; 
      } 
      return false; 
     } 
    }); 
+0

Спасибо за ваш ответ, @Dinesh. Вы прочитали мое описание щедрости? – Antonio

+0

Нет, но я попробовал свой ответ, поскольку знаю любую проблему. – Dinesh

0

Попробуйте добавить ниже код styleAppTheme на ваш activity's theme/style.xml он сделает ваш hamburger icon до back icon с animation.

Состояние если вы используете гамбургер значок с NavigationDrawer и AppCompatActivity/ActionBarActivity

<style name="AppTheme" parent="Theme.AppCompat.Light"> 
      <item name="windowActionBar">false</item> 
      <item name="drawerArrowStyle">@style/DrawerArrowStyle</item> 
     </style> 


<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle"> 
    <item name="spinBars">true</item> 
    <item name="color">@android:color/white</item> 
</style> 

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

Проверить это link

1

Я нашел гибкие решения в The Google I/O 2017 Android App.

public Toolbar getToolbar() { 
    if (mToolbar == null) { 
     mToolbar = (Toolbar) findViewById(R.id.toolbar); 
     if (mToolbar != null) { 
      setSupportActionBar(mToolbar); 
      mToolbar.setNavigationContentDescription(R.string.navdrawer_description_a11y); 
      mToolbarTitle = (TextView) mToolbar.findViewById(R.id.toolbar_title); 
      if (mToolbarTitle != null) { 
       int titleId = getNavigationTitleId(); 
       if (titleId != 0) { 
        mToolbarTitle.setText(titleId); 
       } 
      } 

      // We use our own toolbar title, so hide the default one 
      getSupportActionBar().setDisplayShowTitleEnabled(false); 
     } 
    } 
    return mToolbar; 
} 

/** 
* @param clickListener The {@link android.view.View.OnClickListener} for the navigation icon of 
*      the toolbar. 
*/ 
protected void setToolbarAsUp(View.OnClickListener clickListener) { 
    // Initialise the toolbar 
    getToolbar(); 
    if (mToolbar != null) { 
     mToolbar.setNavigationIcon(R.drawable.ic_up); 
     mToolbar.setNavigationContentDescription(R.string.close_and_go_back); 
     mToolbar.setNavigationOnClickListener(clickListener); 
    } 
} 

Таким образом, использование действительно простое.

setToolbarAsUp(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // onBackPressed(); 
     // or navigate to parent or some other intent 
    } 
}); 
Смежные вопросы