Nano Hash - криптовалюты, майнинг, программирование

Кнопка "Назад" с помощью панели инструментов 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);

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


Ответы:


1

Сделать это можно так:

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

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

17.04.2015
  • Что case x должно быть? 16.08.2016
  • @tanneebee: как получить щелчок стрелки назад? 14.09.2016

  • 2

    Добавьте этот метод в 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);
        }
    }
    
    09.10.2015

    3

    Не уверен, работает ли это в случае 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();
            }
        });
    }
    
    23.04.2015
  • Это не мешает смахивать от края, чтобы вытащить панель навигации. 10.07.2015

  • 4

    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- Вставьте следующий код в свою деятельность. (Расширяет 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- измените значок щелчка назад на все, что хотите.

    26.08.2015
  • Это очень четкое, простое для понимания, эффективное и многоразовое решение. Я бы так же поступил! Отличная работа! ;) 15.04.2016

  • 5

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

    getActionBar().setDisplayHomeAsUpEnabled(enable);
    

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

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

    01.12.2014

    6

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

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

    7

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

    android: parentActivityName = "Название вашей родительской активности"

    01.11.2017

    8

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

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

    Обрабатываем кнопку "Назад"

       public boolean onSupportNavigateUp() {
        onBackPressed();
        return true;
    }
    
    18.01.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..