Android:选项卡和搜索栏
Android: Tabs and searchbars
我有两个标签,每个标签都有自己的搜索栏。
我在 onCreateOptionsMenu
中绑定了搜索栏。但是,搜索栏只有在我离开屏幕一次并 return 到屏幕时才有效(这意味着搜索栏需要一个生命周期才能做出反应)。我确认在创建 ViewPagerFragment 时 onCreateOptionsMenu 确实被调用了两次。
我是这样绑定的:
MenuItem searchItem = menu.findItem(R.id.search);
searchItem.setVisible(true);
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
...
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
...
return false;
}
});
我猜这个错误与选项卡有关。如何实现带标签的工作搜索栏(即 viewpager2)?
我在 onCreateOptionsMenu 上调用它:
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
// Call the above...
}
托管它们的 ViewPager 如下所示:
private void init(View view) {
ViewPager2 viewPager2 = view.findViewById(R.id.view_pager_fragment_view_pager);
TabLayout tabLayout = view.findViewById(R.id.tab_layout_fragment_view_pager);
viewPager2.setUserInputEnabled(true);
viewPager2.setAdapter(new ViewPagerFragmentAdapter(ViewPagerFragment.this));
viewPager2.setOffscreenPageLimit(5);
new TabLayoutMediator
(tabLayout, viewPager2,
(tab, position) -> tab.setText(titles[position])).attach();
}
我和 OP 一直在沟通,我们找到了解决方案。
首先每个片段都改为
public class MergedItemsFragment extends Fragment implements SearchView.OnQueryTextListener {
/// ------------------------------
/// SearchView.OnQueryTextListener
@Override
public boolean onQueryTextSubmit(String query) {
// ...
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
// ...
return false;
}
/// --------
/// Fragment
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_merged_items, container, false);
}
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
final MenuItem searchItem = menu.findItem(R.id.search);
final SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setOnQueryTextListener(this);
}
}
SearchView
通过使用应用程序 Activity. 中的 menu.xml 文件进行了膨胀
SearchView.OnQueryTextListener
由每个需要访问 SearchView
的 Fragment
实施
- 因为每次创建
Fragment
或随后进入视图(例如滑动)时都会调用 onCreateOptionsMenu()
; SearchView
的OnQueryTextListener
更新为对应的Fragment
- 最后,OP 的主要
Fragment
中有一行包含 ViewPager2
,已删除:viewPager2.setOffscreenPageLimit(5);
导致 [=24] 提供的每个 Fragment
=] 以在每次创建 Fragment
时实例化和变异 SearchView
的 OnQueryTextListener
。
删除该行确保只有在视图中的 Fragment
绑定到 Toolbar
的 SearchView
.
如果需要更多代码,我很乐意 post 我有什么,如果我想出一个使用 viewPager2.setOffscreenPageLimit(5);
的解决方案,即缓存,我会 post 那也是
我有两个标签,每个标签都有自己的搜索栏。
我在 onCreateOptionsMenu
中绑定了搜索栏。但是,搜索栏只有在我离开屏幕一次并 return 到屏幕时才有效(这意味着搜索栏需要一个生命周期才能做出反应)。我确认在创建 ViewPagerFragment 时 onCreateOptionsMenu 确实被调用了两次。
我是这样绑定的:
MenuItem searchItem = menu.findItem(R.id.search);
searchItem.setVisible(true);
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
...
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
...
return false;
}
});
我猜这个错误与选项卡有关。如何实现带标签的工作搜索栏(即 viewpager2)?
我在 onCreateOptionsMenu 上调用它:
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
// Call the above...
}
托管它们的 ViewPager 如下所示:
private void init(View view) {
ViewPager2 viewPager2 = view.findViewById(R.id.view_pager_fragment_view_pager);
TabLayout tabLayout = view.findViewById(R.id.tab_layout_fragment_view_pager);
viewPager2.setUserInputEnabled(true);
viewPager2.setAdapter(new ViewPagerFragmentAdapter(ViewPagerFragment.this));
viewPager2.setOffscreenPageLimit(5);
new TabLayoutMediator
(tabLayout, viewPager2,
(tab, position) -> tab.setText(titles[position])).attach();
}
我和 OP 一直在沟通,我们找到了解决方案。
首先每个片段都改为
public class MergedItemsFragment extends Fragment implements SearchView.OnQueryTextListener {
/// ------------------------------
/// SearchView.OnQueryTextListener
@Override
public boolean onQueryTextSubmit(String query) {
// ...
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
// ...
return false;
}
/// --------
/// Fragment
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_merged_items, container, false);
}
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
final MenuItem searchItem = menu.findItem(R.id.search);
final SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setOnQueryTextListener(this);
}
}
SearchView
通过使用应用程序 Activity. 中的 menu.xml 文件进行了膨胀
SearchView.OnQueryTextListener
由每个需要访问SearchView
的 - 因为每次创建
Fragment
或随后进入视图(例如滑动)时都会调用onCreateOptionsMenu()
;SearchView
的OnQueryTextListener
更新为对应的Fragment
- 最后,OP 的主要
Fragment
中有一行包含ViewPager2
,已删除:viewPager2.setOffscreenPageLimit(5);
导致 [=24] 提供的每个Fragment
=] 以在每次创建Fragment
时实例化和变异SearchView
的OnQueryTextListener
。 删除该行确保只有在视图中的Fragment
绑定到Toolbar
的SearchView
.
Fragment
实施
如果需要更多代码,我很乐意 post 我有什么,如果我想出一个使用 viewPager2.setOffscreenPageLimit(5);
的解决方案,即缓存,我会 post 那也是