如何使用带有许多片段的onQueryTextChange

Mar*_*eal 9 android textchanged android-fragments searchview

我有很多片段,它们以2个标签布局显示,FragmentStatePagerAdapter在每个片段中都有一个Recycler视图,我想在应用栏中使用搜索栏来过滤结果.

首先,我这样做是使用onQueryTextChange listener在onCreateOptionsMenu它工作得很好用几个片段,但是当我加入了执行到其他片段(只是CTRL + C和Ctrl + V)也停止工作,没有结果甚至是用来工作片段我然后在这里读到,最好坚持onQueryTextChange listener in onPrepareOptionsMenu试图避免与invalidateOptionsMenu的问题,但我决定给一个尝试也工作,然后当我将方法添加到我所有的其他片段,但它再次失败,但它确实在一些片段上工作,奇怪的是这些片段恰好全部附加到同一个父片段,但是4个父片段的代码和调用它们的代码是相同的.

我已经阅读的另一种方法是creating an interface通过获取对当前片段的引用从我的主要活动中使用它然后id必须从我的viewpager获取当前显示的片段,我不知道是否有可能任何人都可以权衡这个为了我,

非常感谢

并感谢伟大的编辑大声笑

编辑 尝试接口方法无济于事,虽然我还是初学者,我确实需要找到附加的片段,并且使用fragmentstateviewpager它是不可能的,如果没有使用黑客,必须有一些理由为什么它适用于某些而不是其他的,有时候一点也不

编辑2

所以即时通讯仍然摆弄这个,我几乎没有回复所以让我的肉体这一点,所以我在主要活动中添加菜单布局,像这样

@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;
}
Run Code Online (Sandbox Code Playgroud)

然后从onPrepareOptionsMenu中的片段添加一个监听器,就像这样

@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);
}
Run Code Online (Sandbox Code Playgroud)

我呼唤setHasOptionsMenu(真)的片段onCreateView,这个完美的作品,但我通过有大约20个片段循环,当我加入这个到其他片段失败,要么什么都不做或使视图空白,或以罕见的情况下作品,但对我来说说我的代码是好的,也许它的生命周期的事情,我已经尝试了从碎片的onCreateOptionsMenu调用它,并取得相同的结果,而我用尽不是要求从onCreateOptions在MainActivity任何东西,除了充气菜单和允许片段使用调用搜索活动

SearchView searchView = (SearchView)menu.findItem
(R.id.action_search).getActionView();
SearchManager searchManager = (SearchManager) 
getActivity().getSystemService(getActivity().SEARCH_SERVICE);
searchView.setSearchableInfo(searchManager.getSearchableInfo
(getActivity().getComponentName())); 
Run Code Online (Sandbox Code Playgroud)

它再次起作用大约8个碎片,但我的20左右只会导致它落在它的剑上,有什么我不做的可以帮助

编辑3 好吧所以通过添加一些,检查它,添加更多,检查它,它似乎是我的父片段的问题所以我有主要活动4片段,每个片段持有一个片段状态寻呼机,每个片段包含7个左右的片段,如果我将查询侦听器的方法添加到第一个父片段中的前7个左右片段,它们都可以很好地工作,如果我然后将方法添加到第二个父节点中的下一组7个左右片段只有第二个父节点子片段工作,如果我然后退出我的应用程序并再次打开它只有第一个父母片段工作,将继续调查任何帮助表示我将很快发布我的父片段的代码.

编辑4 只是为我的主要活动添加我用于父片段和fragmentstatepager的代码

所以从我的主要活动中我设置了像这样的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的父母片段看起来像这样

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);
    }
}
}
Run Code Online (Sandbox Code Playgroud)

仍然在努力解决这个问题,我不能为我的生活找出原因,为什么它会在很多片段中起作用,直到我将它添加到下一个集合中,同样的代码与相同的代码一样,它必须只是初始化最后的片段要求它可以帮助我吗?谢谢你的帮助

Mar*_*eal 2

好的,我修复了它,所以问题是父fragmentstatepager将fragmentA +fragmentB加载到内存中,然后子fragmentstatepager加载自己的childfragmentA + childfragmentB,所以我们现在有2个父级和4个子级,从子级片段调用onPrepareOptionsMenu,所以第一个加载 childFragmentA(fragmentA 的子级),然后加载 childFragmentA(fragmentB 的子级)并窃取搜索视图,我对此的“修复”可能有点粗糙,我是自学的,我不太清楚如何管理内存或者如果保留引用等不好,我离题了,在父片段中我检查哪个片段是可见的

setMenuVisibility(final boolean visible)
Run Code Online (Sandbox Code Playgroud)

在那里我设置了一个公共静态布尔值并在我的子片段中检查它,它对我来说完美无缺,如上所述,这可能是一件可怕的事情,希望这里有人可以提供更好的解决方案

检查哪个父级可见

public static boolean tabFragOneVisible;

@Override
public void setUserVisibleHint(boolean isVisible){
    super.setUserVisibleHint(isVisible);
    if(!isVisible){
        tabFragOneVisible = false;
    }else{
        tabFragOneVisible = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

检查父级是否可见连接搜索视图

@Override
public void onPrepareOptionsMenu(Menu menu) {
    // need to check if fragment is visible
    if (tabFragOne.tabFragOneVisible) {
        SearchView searchView = (SearchView)
        menu.findItem(R.id.action_search).getActionView();
        SearchManager searchManager = (SearchManager) getActivity()
        .getSystemService(getActivity().SEARCH_SERVICE);
        searchView.setSearchableInfo(searchManager
        .getSearchableInfo(getActivity().getComponentName()));
        // 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;
            }

        });
    }
    else{

    }
    super.onPrepareOptionsMenu(menu);
}
Run Code Online (Sandbox Code Playgroud)