使用SearchView时如何处理ActionBar的图标可见性

时间:2017-06-15 22:33:49

标签: android searchview android-actionbar-compat

嗯,我想要的是:

  • 使用所有项目初始化ActionBar,但" searchSettings";
  • 除外
  • 单击“搜索”图标时,将显示searchSettings,其余图标将消失;
  • 当关闭搜索EditText(按设备的后退按钮或ActionBar的后退按钮)时,ActionBar将返回其原始状态(所有图标都显示,除了" searchSettings")。 / LI>

我的实际代码如下:

(我已导入android.support.v7.widget.SearchView而不是android.widget.SearchView。当我使用android.widget.SearchView时,此功能正常,但其他事情并非如此

private MenuItem searchIteam, searchSettings;
private SearchView searchView;

@Override
public boolean onCreateOptionsMenu(final Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_main, menuMain);
    searchItem = menu.findItem(R.id.search);
    searchSettings = menu.findItem(R.id.action_searchSettings);
    searchView = (SearchView)MenuItemCompat.getActionView(item);
    searchSettings.setVisible(false); // hide searchSettings Item when Menu is created

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            (...)

            return false;
        }
    });

    // Detect SearchView icon clicks
    searchView.setOnSearchClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            setItemsVisibility(menuMain, item, false);
            searchSettings.setVisible(true);
        }
    });
    // Detect SearchView close
    searchView.setOnCloseListener(new SearchView.OnCloseListener() {
        @Override
        public boolean onClose() {
            supportInvalidateOptionsMenu(); //shouldn't this reload the Action Bar as it was when onCreate?
            return true;
        }
    });

    return super.onCreateOptionsMenu(menu);

}

private void setItemsVisibility(Menu menu, MenuItem exception, boolean visible) {
    for (int i=0; i<menu.size(); ++i) {
        MenuItem item = menu.getItem(i);
        if (item != exception) item.setVisible(visible);
    }
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    if (id == android.R.id.home) {
        onBackPressed();
    }

    return super.onOptionsItemSelected(item);
}

@Override
public void onBackPressed() {
    supportInvalidadeOptionsMenu();
    super.onBackPressed();
}

当我按下&#34;返回&#34;此代码不起作用。第一次,它只关闭搜索的EditText,图标不会改变。如果我再次按下,活动会升级,但我可以看到图标作为开始(在我按下&#34;第一次回来&#34;第一次)之前得到它们在活动结束前一会儿...

---编辑---

目前,如果我点击Search ActionBar Icon,然后开始按&#34; Back Button&#34;反复发生以下情况:

  • 第一次按下:键盘隐藏,但搜索EditText仍处于打开状态;
  • 第二次按下:搜索结束(搜索EditText关闭,显示正常活动的内容);
  • 第三次按下:活动结束。

然后,出于测试目的,我这样做了:

boolean pressed1, pressed2, pressed3;

searchView.setOnSearchClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            pressed1 = false;
            pressed2 = false;
            pressed3 = false;
            setItemsVisibility(menuMain, item, false);
            searchSettings.setVisible(true);
        }
    });

@Override
public void onBackPressed() {
    if (!pressed1) {
        pressed1 = true;
    }
    else if(!pressed2) {
        pressed2 = true;
    }
    else if(!pressed3) {
        pressed3 = true;
        supportInvalidateOptionsMenu();
    }
    else {
        super.onBackPressed();
    }
}

现在,会发生什么:

  • 第一次按下:键盘隐藏,但搜索EditText仍处于打开状态;
  • 第二次按下:搜索结束(搜索EditText关闭,显示正常活动的内容);
  • 第三次紧迫:没有任何反应;
  • 第4次按压:没有任何反应;
  • 第五次按下:ActionBar按我的意愿重新加载;
  • 第6次按下:活动关闭;

---编辑2 ---

然后我改变了这个:

@Override
public void onBackPressed() {
    if (!pressed1) {
        pressed1 = true;
        onBackPressed();
    }
    else if(!pressed2){
        pressed2 = true;
        onBackPressed();
    }
    else if(!pressed3){
        pressed3 = true;
        supportInvalidateOptionsMenu();
    }
    else {
        super.onBackPressed();
    }
}

现在发生的事情是:

  • 第一次按下:键盘隐藏,但搜索EditText仍处于打开状态;
  • 第二次按下:搜索结束(搜索EditText关闭,显示正常活动的内容);
  • 第3次按下:ActionBar按我的意愿重新加载;
  • 第4次按下:活动关闭;

---编辑3 ---(解决方案)---

我想方法setOnSearchClickListenersetOnCloseListener来自android.widget.SearchView ...我已经导入了android.support.v7.widget.SearchView,我已经改变了它们到:

MenuItemCompat.setOnActionExpandListener(searchItem,
            new MenuItemCompat.OnActionExpandListener() {
                @Override
                public boolean onMenuItemActionExpand(MenuItem menuItem) {
                    setItemsVisibility(menu, searchItem, false);
                    return true;
                }
                @Override
                public boolean onMenuItemActionCollapse(MenuItem menuItem) {
                    supportInvalidateOptionsMenu();
                    return true;
                }
            });

现在工作得很好(:

1 个答案:

答案 0 :(得分:0)

我希望我能帮到你:第一次按BACK键时,键盘会被隐藏。第二次按BACK,应用程序退出。

如果是这种情况,那么一切正常。因为这是super.onBackPressed()应该做的。如果显示键盘,它会尝试隐藏键盘。如果没有,它将尝试前一个活动。如果没有,它将退出应用程序。

所以你需要做的是使用onBackPressed()方法。基本上,如果你确定应该做什么,你不一定需要调用超级方法。

@Override
public void onBackPressed() {
    if ( isSearching) {
        supportInvalidadeOptionsMenu();
        isSearching = false;     
    } else {
        super.onBackPressed();
    }
}

所以现在,当你从不按BACK按钮时,活动将检查是否正在搜索,并决定重新渲染操作栏或照常执行其正常操作。

您需要添加一些逻辑来设置布尔标志isSearching,例如,单击搜索时将isSearching设置为true。

我不确定supportInvalidadeOptionsMenu()是否会重置您的操作栏。无论如何,您可以改为调整每个视图的可见性。