Android – кнопка переключения ActionBar Back на навигационную кнопку

У меня возникает следующая проблема:

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

Из этого:
введите описание изображения здесь

к этому:

введите описание изображения здесь

используя: getSupportActionBar().setDisplayHomeAsUpEnabled(true);

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

введите описание изображения здесь

сюда:

введите описание изображения здесь

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

Обновить:

 @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 } } 

Если я предполагаю, что вы используете 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 ie setDrawerIndicatorEnabled(false), navigation icon // clicks are disabled ie 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 для видимости кнопки « Вверх» , по существу, с использованием их соответствующих drawable ресурсов.

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

  • Тема вашей темы расширяет Theme.AppCompat.Light.NoActionBar .

Я нашел гибкие решения в приложении Google I / O 2017 для Android .

 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 } }); 

вы можете изменить кнопку панели действий с помощью:

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

Использовать это

 getSupportActionBar().setDisplayShowHomeEnabled(true); 
  final Toolbar toolbar = (Toolbar) findViewById(R.id.actionbar); toolbar.setTitle(Html.fromHtml("" + getString(R.string.print_s) + "")); 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; } }); 

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

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

   

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

Проверить эту ссылку

Для меня я хотел поменять значок Burger с помощью значка Back Arrow на левой стороне ActionBar Fragment , поскольку я использую Navigation Drawer . Также добавление меню с правой стороны.

В основной деятельности он уже установлен – по умолчанию, когда Android Studio создает ящик навигации для меня – вот так:

 Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); DrawerLayout drawer = findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.addDrawerListener(toggle); toggle.syncState(); 

Проблема заключается в том, как настроить ActionBar во Fragment , поэтому, когда я перейду к Fragment он покажет мне настроенный ActionBar и когда щелкнут значок « Стрелка назад» , он должен оставить fragment, и ActionBar должен вернуться в первое состояние.

В fragmentе ( полная реализация ):

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); // To show the menu options } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState){ super.onViewCreated(view, savedInstanceState); showActionBar(); // the method to change ActionBar } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // inflate the customized menu which already created in XML getActivity().getMenuInflater().inflate(R.menu.fragment_menu, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { // add implementation when user select an item from the menu switch (item.getItemId()) { case R.id.option1: // do something return true; case R.id.option2: // do something return true; case R.id.option3: // do something return true; default: return super.onOptionsItemSelected(item); } } private void showActionBar() { // get the ToolBar from Main Activity final Toolbar toolbar = getActivity().findViewById(R.id.toolbar); // get the ActionBar from Main Activity final ActionBar actionBar = ((AppCompatActivity)getActivity()).getSupportActionBar(); // inflate the customized Action Bar View LayoutInflater inflater = (LayoutInflater) getActivity() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = inflater.inflate(R.layout.fragment_actionbar, null); if (actionBar != null) { // enable the customized view and disable title actionBar.setDisplayShowCustomEnabled(true); actionBar.setDisplayShowTitleEnabled(false); actionBar.setCustomView(v); // remove Burger Icon toolbar.setNavigationIcon(null); // add click listener to the back arrow icon v.findViewById(R.id.back).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // reverse back the show actionBar.setDisplayShowCustomEnabled(false); actionBar.setDisplayShowTitleEnabled(true); //get the Drawer and DrawerToggle from Main Activity // set them back as normal DrawerLayout drawer = getActivity().findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( getActivity(), drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); // All that to re-synchronize the Drawer State toggle.syncState(); // Implement Back Arrow Icon // so it goes back to previous Fragment getActivity().onBackPressed(); } }); } } 

fragment_actionbar.xml

     

ic_menu_back.xml

    

fragment_menu.xml

      

Давайте будем гением компьютера.