【问题标题】:Two searchviews showed up when switching tabs切换标签时出现两个搜索视图
【发布时间】:2019-02-21 05:09:55
【问题描述】:

您好,我正在尝试将“搜索”功能添加到我的多个标签片段中。它在一个选项卡上运行良好,我能够搜索和过滤数据没问题。所以我对其他标签使用相同的代码,但是,现在操作栏显示两个搜索图标而不是一个。我尝试了许多不同的方法,方法是在切换选项卡时在分离/附加操作期间隐藏搜索视图,但仍然会弹出两个搜索图标。其中一个搜索图标适用于我当前的标签,而另一个则不适用。

这是我的代码:

upcoming_event_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
        android:id="@+id/action_upcoming_event_search"
        android:title="search event"
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="always"/>
</menu>

past_event_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
        android:id="@+id/action_past_event_search"
        android:title="search event"
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="always"/>
</menu>

片段 1:

public class EventTabUpcoming extends Fragment implements SearchView.OnQueryTextListener {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    final View view = inflater.inflate(R.layout.event_tab_upcoming, container, false);

    RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.listUpcomingEvent);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL));

    recyclerView.setAdapter(sectionAdapter);

    setHasOptionsMenu(true);

    return view;
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.upcoming_event_menu, menu);
    MenuItem item = menu.findItem(R.id.action_upcoming_event_search);

    searchView = (SearchView) MenuItemCompat.getActionView(item);
    searchView.setOnQueryTextListener(this);
}

@Override
public boolean onQueryTextChange(String searchText) {
    Log.d(logTag, "EventTabUpcoming -> onQueryTextChange w/ searchText: " + searchText);
    for (Section section : sectionAdapter.getCopyOfSectionsMap().values()) {
        if (section instanceof FilterableEventSection) {
            ((FilterableEventSection) section).filter(searchText);
        }
    }

    sectionAdapter.notifyDataSetChanged();
    return true;
}

@Override
public boolean onQueryTextSubmit(String query) {
    return false;
}

@Override
public void onDetach() {
    super.onDetach();
    Log.d(logTag, "onDetach is called");

    if (searchView != null) {
        searchView.clearFocus();
        searchView.setVisibility(View.GONE);
    }

}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    Log.d(logTag, "onAttach is called");

    if (searchView != null) {
        searchView.setVisibility(View.VISIBLE);
    }


}

Fragment 2 是从 Fragment 1 克隆出来的,只是现在的视图是:

final View view = inflater.inflate(R.layout.event_tab_past, container, false);

菜单是

inflater.inflate(R.menu.past_event_menu, menu);

请告诉我应该如何解决这个问题。

【问题讨论】:

标签: android searchview


【解决方案1】:

这是我的解决方案:

我没有在两个选项卡的活动中膨胀菜单,而是只在 viewpager 活动中膨胀菜单,并且在每个选项卡片段的 onCreateOptionMenu 中,我得到了 searchview 和 setQueryTextListener。

ViewPager 活动:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);

    /**
     * Inflate menu with searchview item
     */
    inflater.inflate(R.menu.event_menu, menu);
}

标签 1

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

    # get the searchview and set listener
    MenuItem item = menu.findItem(R.id.action_event_search);
    searchView = (SearchView) MenuItemCompat.getActionView(item);
    searchView.setOnQueryTextListener(this);
}

标签 2

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

    # get the searchview and set listener
    MenuItem item = menu.findItem(R.id.action_event_search);
    searchView = (SearchView) MenuItemCompat.getActionView(item);
    searchView.setOnQueryTextListener(this);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多