it-swarm.com.ru

"Кнопка назад" с использованием getSupportActionbar и панели инструментов appcompat v7

Я использую новую панель инструментов из библиотеки Appcompat V7 и создаю приложение с навигационным блоком и фрагментами.

В некоторых фрагментах я не хочу показывать значок гамбургера, а вместо этого стрелку ... Хорошо, я сделал это следующим образом:

mDrawerToggle.setDrawerIndicatorEnabled(false);

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

getSupportActionBar().setHomeAsUpIndicator(R.drawable.abc_ic_ab_back_mtrl_am_alpha);

Мой вопрос заключается в следующем: как или где мне нужно настроить lisener кнопки home или что мне нужно прослушать для кнопки «назад»? Я хочу вызвать основной метод backpressed и вернуть значок навигационного ящика со значком гамбургера.

50
András Ferencz

Вы можете сделать это так:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);  
    toolbar = (Toolbar)findViewById(R.id.toolbar);
    if (toolbar != null) {
      setSupportActionBar(toolbar);
      getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    setUpNavigationDrawer();

    getFragmentManager().addOnBackStackChangedListener(backStackListener); // listen to the backstack of the fragment manager
}

Определите onBackSTackChangedListener:

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

Установите иконку в соответствии с обратным стеком вашего фрагмента:

protected void setNavIcon() {
    int backStackEntryCount = getFragmentManager().getBackStackEntryCount();
    drawerToggle.setDrawerIndicatorEnabled(backStackEntryCount == 0);
}

Определите, когда иконка в ящике нажата:

public boolean onOptionsItemSelected(MenuItem item) {
    if (drawerToggle.isDrawerIndicatorEnabled() && drawerToggle.onOptionsItemSelected(item)) {
        return true;
    }

    switch (item.getItemId()) {
      case x:
         return true;
      default:
         return false;
    }
}

И обработайте кнопку вверх:

public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}

Это работает для меня. Удачи.

41
tanneebee

Добавьте этот метод в onCreate():

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Затем переопределите функцию onOptionItemSelected(), как показано ниже:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case Android.R.id.home:
            onBackPressed();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}
70
Raja Jawahar

Не уверен, что это работает в случае OP, но во многих случаях это, вероятно, самый простой вариант для реализации кнопки «Назад» с помощью панели инструментов AppCompat.

Пропустите все материалы setHomeButtonEnabled, setDisplayHomeAsUpEnabled и onOptionsItemSelected и связанные с этим вопросы

Вместо этого при инициализации панели инструментов просто установите для нее 1) значок навигации и 2) навигацию OnClickListener:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

if (enableBackNavigation) {
    toolbar.setNavigationIcon(R.drawable.ic_back);
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onBackPressed();
        }
    });
}
31
Jonik

1- Создать Toolbar макет;

<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.Toolbar xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:local="http://schemas.Android.com/apk/res-auto"
    Android:id="@+id/toolbar"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:background="@color/dark_blue"
    Android:minHeight="?attr/actionBarSize"
    local:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    local:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

2- Включите это в свой макет в том месте, где вы хотите, чтобы toolbar был.

3- Вставьте следующий код в свою деятельность. (Extends ActionBarActivity)

private Toolbar mToolbar;

//For Toolbar (Action bar) start
        mToolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(mToolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        mToolbar.setNavigationIcon(R.drawable.ic_back_arrow);
        mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });
        getSupportActionBar().setTitle("Event Details");
        //For Toolbar (Action bar) end

4- измените значок щелчка назад на что хотите.

16
Surendar D

активировать кнопку возврата:

getActionBar().setDisplayHomeAsUpEnabled(enable);

и слушайте клики в onBackPressed()

Очевидно, ваша активность должна расширяться ActionBarActivity

3
TheRedFox

Просто вы можете установить значок навигации и убедиться, что вы устанавливаете setNavigationOnClickListener() после настройки setSupportActionBar(toolbar)

toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_arrow_back));
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        onBackPressed();
    }
});
2
Fenil

в манифесте добавьте эти строки под действием, которое вы хотите, чтобы стрелка назад работала 

Android: parentActivityName = "Имя вашей родительской активности"

1
murtaza agaz

Добавить setDisplayHomeAsUpEnabled (true)

    Toolbar toolbar  = findViewById(R.id.toolbar);
    ActionBar actionBar = getSupportActionBar();
    if (actionBar != null) {
        actionBar.setDisplayHomeAsUpEnabled(true);
    }

Ручка назад кнопка

   public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
0
Farid Haq