gpt4 book ai didi

android - 如何将 onQueryTextChange 与许多 fragment 一起使用

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:38:03 27 4
gpt4 key购买 nike

我有许多 fragment ,它们使用 FragmentStatePagerAdapter 在 2 个选项卡布局中显示在每个 fragment 中都有一个 Recycler View ,我想使用应用栏中的搜索栏来过滤结果。

首先我使用 onQueryTextChange listener在 onCreateOptionsMenu 中,它与几个 fragment 一起工作得很好,但是当我将实现添加到其他 fragment (只是 ctrl+c 和 ctrl+v)时,它停止工作,即使在曾经工作的 fragment 上也没有结果我然后阅读 here最好坚持onQueryTextChange listener in onPrepareOptionsMenu为了避免 invalidateOptionsMenu 出现问题,但我决定尝试一下,它也有效,然后当我将方法添加到我的所有其他 fragment 时,它再次失败,但它确实适用于少数 fragment ,奇怪的是这些发生在都附加到同一个父 fragment ,但 4 个父 fragment 的代码和调用它们的代码是相同的。

我读过的另一种解决方法是creating an interface并通过获取对当前 fragment 的引用从我的主要 Activity 中使用它,但随后 id 必须从我的 viewpager 中获取当前显示的 fragment ,我不知道这是可能的,任何人都可以为我权衡一下,

非常感谢

感谢您的精彩编辑哈哈

编辑
尽管我仍然是初学者,但尝试了界面方法无济于事,但我确实需要找到附加的 fragment ,并且使用 fragmentstateviewpager 不使用黑客是不可能的,必须有某种原因为什么它在某些方面有效,而在其他方面无效,有时不根本

编辑 2

所以我还在摆弄这个,我几乎没有回复,所以让我们充实一下,所以我像这样在主要 Activity 中添加菜单布局

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.dashboard, menu);
SearchView searchView =
(SearchView)menu.findItem(R.id.action_search).getActionView();
SearchManager searchManager = (SearchManager)
getSystemService(SEARCH_SERVICE);

searchView.setSearchableInfo(searchManager
.getSearchableInfo(getComponentName()));

return true;
}

然后像这样从 onPrepareOptionsMenu 的 fragment 中添加一个监听器
@Override
public void onPrepareOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
//in this instance we wont as it will create a duplicate

SearchView searchView = (SearchView)
menu.findItem(R.id.action_search).getActionView();
searchView.setOnQueryTextListener(null);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}

@Override
public boolean onQueryTextChange(String newText) {

showResults(newText);

return false;
}

});

super.onPrepareOptionsMenu(menu);
}

我已经在 fragment 的 onCreateView 中调用了 setHasOptionsMenu(true),这很有效,但是我有大约 20 个 fragment 要循环通过,当我将它添加到其他 fragment 时它失败了,它要么什么都不做,要么使 View 空白或在极少数情况下工作,但对我来说,我的代码没问题,也许它是一个生命周期的东西,我尝试从 fragment 的 onCreateOptionsMenu 调用它并取得了相同的结果,我尝试不从 onCreateOptions 中的 MainActivity 调用任何东西,除了膨胀菜单和允许 fragment 使用调用搜索 Activity
SearchView searchView = (SearchView)menu.findItem
(R.id.action_search).getActionView();
SearchManager searchManager = (SearchManager)
getActivity().getSystemService(getActivity().SEARCH_SERVICE);
searchView.setSearchableInfo(searchManager.getSearchableInfo
(getActivity().getComponentName()));

这又可以产生大约 8 个 fragment ,但我的 20 个左右只是让它落在剑上,我没有做些什么可以帮助

编辑 3
好的,所以通过添加一些,检查,添加更多,检查,这似乎是我的父 fragment 的问题,所以我有主要 Activity 4 个 fragment ,每个 fragment 都有一个 fragment 状态寻呼机,如果我添加,每个 fragment 都包含 7 个左右的 fragment 查询监听器的方法到第一个父 fragment 中的前 7 个左右的 fragment 它们都工作得很好,如果我然后将这些方法添加到第二个父 fragment 中的下一组 7 个左右的 fragment 中,那么只有第二个父 fragment 的子 fragment 起作用,如果我然后退出我的应用程序并再次打开它,只有第一个 parent fragment 可以工作,我会继续调查任何帮助,感谢我很快就会在这里发布我的 parent fragment 的代码。

编辑 4
只是要从我的主要 Activity 中添加我用于父 fragment 和 fragment 状态页面的代码

所以从我的主要 Activity 中,我像这样设置了 fragmentstatepager
    private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new
ViewPagerAdapter(getSupportFragmentManager());
adapter.addFrag(new sentenceMakers(), "QUICKS");
adapter.addFrag(new tabFragOne(), "NOUNS");
adapter.addFrag(new tabFragTwo(), "VERBS");
adapter.addFrag(new tabFragThree(), "OBJECTS");
viewPager.setAdapter(adapter);

}

class ViewPagerAdapter extends FragmentStatePagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();

public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}

@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}

@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
//do nothing here! no call to super.restoreState(arg0, arg1);
}
@Override
public int getCount() {
return mFragmentList.size();
}

public void addFrag(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}

@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}

我的父 fragment 看起来像这样
public class sentenceMakers extends Fragment{

public ImageView imageView;
private ViewPager viewPager;
public static TabLayout tabLayout;

public sentenceMakers() {
// Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState){
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate
(R.layout.tab_frag_one, container, false);
// Inflate the layout for this fragment
//setRetainInstance(true);
viewPager = (ViewPager) rootView.findViewById(R.id.viewpager);
setupViewPager(viewPager);
tabLayout = (TabLayout) rootView.findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
setupTabIcons();

return rootView;

}
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);

}

private void setupTabIcons() {
TextView tabZero2 = (TextView)
LayoutInflater.from(getActivity()).inflate(R.layout.custom_tab, null);
tabZero2.setText("FAVOURITES");
//tabOne.setGravity(View.TEXT_ALIGNMENT_CENTER);
tabZero2.setCompoundDrawablesWithIntrinsicBounds(0,
R.drawable.ic_star_white_24dp, 0, 0);
tabLayout.getTabAt(0).setCustomView(tabZero2);

TextView tabZero = (TextView)
LayoutInflater.from(getActivity()).inflate(R.layout.custom_tab, null);
tabZero.setText("FREQUENTS");
//tabOne.setGravity(View.TEXT_ALIGNMENT_CENTER);
tabZero.setCompoundDrawablesWithIntrinsicBounds(0,
R.drawable.ic_people_outline_white_24dp, 0, 0);
tabLayout.getTabAt(1).setCustomView(tabZero);

TextView tabOne = (TextView)
LayoutInflater.from(getActivity()).inflate(R.layout.custom_tab, null);
tabOne.setText("PRONOUNS");
//tabOne.setGravity(View.TEXT_ALIGNMENT_CENTER);
tabOne.setCompoundDrawablesWithIntrinsicBounds(0,
R.drawable.ic_accessibility_white_24dp, 0, 0);
tabLayout.getTabAt(2).setCustomView(tabOne);

TextView tabTwo = (TextView)
LayoutInflater.from(getActivity()).inflate(R.layout.custom_tab, null);
tabTwo.setText("CONJUCTIONS");
tabTwo.setCompoundDrawablesWithIntrinsicBounds(0,
R.drawable.ic_add_white_24dp, 0, 0);
tabLayout.getTabAt(3).setCustomView(tabTwo);

TextView tabThree = (TextView)
LayoutInflater.from(getActivity()).inflate(R.layout.custom_tab, null);
tabThree.setText("ADJECTIVES");
tabThree.setCompoundDrawablesWithIntrinsicBounds(0,
R.drawable.ic_favorite_border_white_24dp, 0, 0);
tabLayout.getTabAt(4).setCustomView(tabThree);

tabLayout.getTabAt(0).getCustomView().setSelected(true);
}

private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new
ViewPagerAdapter(getChildFragmentManager());
adapter.addFrag(new favouriteCards(), "FAVOURITES");
adapter.addFrag(new predictedCards(), "FREQUENTS");
adapter.addFrag(new pronouns(), "PRONOUNS");
adapter.addFrag(new conjuctions(), "CONJUNCTIONS");
adapter.addFrag(new Others(), "ADJECTIVES");
viewPager.setAdapter(adapter);
}

class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();

public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}

@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}

@Override
public int getCount() {
return mFragmentList.size();
}

public void addFrag(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
}
}

仍在为此苦苦挣扎,我一生都无法弄清楚为什么它会在很多 fragment 中起作用,直到我将其添加到下一组中,它具有相同的代码,它必须只是初始化最后的 fragment 要求它有人可以在这里帮助我吗?
谢谢你的帮助

最佳答案

基本上,使用 Fragment 时必须牢记一件事:不要保留对您的 fragment 的引用 :只需创建它们并添加到您的布局中,或提供给您的 ViewPager,然后使用其他方法来检索它们,例如 FragmentManager.findFragmentBy...

也就是说,你的代码应该是(让我用两个 fragment 来简化):

主要 Activity

private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new MyViewPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(adapter);
}

class MyViewPagerAdapter extends FragmentStatePagerAdapter {

public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}

@Override
public Fragment getItem(int position) {
switch(position) {
case 0:
return new sentenceMakers();
case 1:
return new tabFragOne();
// add here fragments for any other position
}
}

@Override
public int getCount() {
return 2;
}

@Override
public CharSequence getPageTitle(int position) {
switch(position) {
case 0:
return "QUICKS";
case 1:
return "NOUNS";
// add here titles for any other position
}
}
}

造句者

您必须在您的 sentenceMakers Fragment 中使用的代码与前一个非常相似,但是您必须使用子 fragmentManager(就像您在代码中所做的那样),并且再次,不要将您的 fragment 保存在列表中,让系统在需要时创建它们。

关于android - 如何将 onQueryTextChange 与许多 fragment 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39937968/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com