обнаружение нажатия кнопки «Назад» на панели действий - (OnOptionsItemSelected не вызывается при нажатии кнопки «Назад» на панели действий)

У меня есть панель действий, содержащая searchview. Когда пользователь нажимает кнопку поиска и сворачивает представление поиска, на панели действий отображается кнопка «Назад» с левой стороны.

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

Как мы можем определить, когда пользователь нажимает эту кнопку «Назад»?

Изменить

основываясь на ответе, я проверил свой OnOptionsItemSelected, но он тоже не звонит. Это код моего OnOptionsItemSelected:

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    if (item != null && id == android.R.id.home) {
        if (mNavigationDrawerFragment.isDrawerOpen(Gravity.RIGHT)) {
            mNavigationDrawerFragment.closeDrawer(Gravity.RIGHT);
        } else {
            mNavigationDrawerFragment.openDrawer(Gravity.RIGHT);

        }
        return true;
    }
    if (id == R.id.action_search) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

person Husein Behboudi Rad    schedule 15.10.2014    source источник


Ответы (5)


Поместите это в метод onCreateOptionsMenu:

MenuItemCompat.setOnActionExpandListener(menu.findItem(R.id.action_search), new MenuItemCompat.OnActionExpandListener() {
    @Override
    public boolean onMenuItemActionExpand(MenuItem item) {

        return true;
    }

    @Override
    public boolean onMenuItemActionCollapse(MenuItem item) {

        //DO SOMETHING WHEN THE SEARCHVIEW IS CLOSING

        return true;
    }
});
person Lisandro Lopez    schedule 20.04.2015
comment
Теперь это устарело - person iBEK; 15.11.2017
comment
попробуйте это MenuItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() { @ Override public boolean onMenuItemActionExpand(MenuItem item) { return true; } @ Override public boolean onMenuItemActionCollapse(MenuItem item) { return true; } }); developer.android.com/reference/android/view/ - person anoo_radha; 05.02.2018

Вы должны добавить метаданные в файл manifest.xml, для которого вы хотите это сделать.

Нравиться

<activity
        android:name=".Example"
        android:label="@string/Example"
        android:theme="Theme.AppCompat.Light">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".MainActivity" />
    </activity>

и ваш код должен быть таким, как в примере

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 .......
         getActionBar().setDisplayHomeAsUpEnabled(true);

......
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        // Respond to the action bar's Up/Home button
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
    }
    return super.onOptionsItemSelected(item);
}
person massaimara98    schedule 15.10.2014
comment
пожалуйста, смотрите прикрепленное изображение. Я хочу обнаружить нажатие кнопки «Назад», когда отображается представление поиска. Я думаю, что код, который вы прикрепили, работает, когда открывается новое действие, а не когда открыто представление поиска. - person Husein Behboudi Rad; 19.10.2014

Просто переопределите метод ниже.

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
            case android.R.id.home:
             //do whatever you want to do here.

            }
            return true;
    }
person Avtar Guleria    schedule 15.10.2014
comment
Я переопределил его, но он не срабатывает, когда я нажимаю кнопку «Назад». - person Husein Behboudi Rad; 15.10.2014
comment
Добавьте ниже строку actionBar.setHomeButtonEnabled(true); - person Avtar Guleria; 15.10.2014
comment
Кроме того, добавьте actionBar.setDisplayHomeAsUpEnabled(true); - person Avtar Guleria; 15.10.2014
comment
Он включен, потому что, когда я нажимаю кнопку «Назад», он работает и закрывает представление поиска, но onOptionsItemSelected не срабатывает. В любом случае, я установил эту строку в методе onCreate(), но она все равно не срабатывает. - person Husein Behboudi Rad; 15.10.2014

Попробуйте следующее: вместо использования onOptionsItemSelected для обнаружения изменения поиска используйте OnQueryTextListener. Затем onQueryTextChanged будет вызываться с помощью кнопки «Назад» (и в любое другое время, когда текст запроса изменяется).

Когда вы настраиваете свое меню, назначьте слушателя searchView. onQueryTextChange будет вызываться всякий раз, когда изменяются критерии поиска (при любом нажатии клавиатуры, кроме кнопки поиска), и он будет вызываться с пустой строкой при нажатии кнопки «Назад». OnQueryTextSubmit будет вызываться при нажатии кнопки поиска на клавиатуре.

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.main, menu);

    final SearchView searchView = (SearchView)menu.findItem(R.id.action_search).getActionView();
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String s) {
            Log.i(TAG,"onQueryTextSubmit: " + s);
            searchView.clearFocus();
            return true;
        }

        @Override
        public boolean onQueryTextChange(String s) {
            Log.i(TAG,"onQueryTextChange: " + s);
            FragmentManager fragmentManager = getSupportFragmentManager();
            Fragment fragment = fragmentManager.findFragmentByTag(currentFragmentTag);
            if (fragment.getClass().getName().startsWith("com.mydomain.myapp.mainactivity.MyFragment")) {
                if (s.isEmpty()) {
                    ((SingleICPListFragment)fragment).clearSearchCriteria();
                } else {
                    ((SingleICPListFragment) fragment).applySearchCriteria(s);
                }
            }
            return true;
        }
    });

    SearchManager searchManager = (SearchManager)getSystemService(Context.SEARCH_SERVICE);
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

    return true;
}
person Eric Rowe    schedule 06.04.2015