2017-08-07 4 views
0

J'ai 3 fragments dans un TabLayout comme on le voit ici http://imgur.com/a/Z9dTQSearchView cesse de fonctionner lorsque la patte de commutateur

Chaque fois que je démarre l'application, il ouvre l'onglet de l'explorateur, et je peux passer à l'onglet de recherche et le SearchView fonctionne parfaitement. Si je passe à explorer et revenir à la recherche, cela fonctionne toujours.

Mon champ de recherche n'utilise pas d'activité de recherche, mais recherche à la place avec un écouteur onQueryTextChange. Ci-dessous le SearchView est un LinearLayout avec 30 TextViews dont le texte est changé par la recherche.

Cependant, si je passe à l'onglet quiz et que je reviens à la recherche, le texte SearchView reste, mais les TextViews sont réinitialisés à leurs valeurs par défaut de "gone", comme ceci: http://imgur.com/a/L4RvE. Essayer de chercher maintenant en utilisant le SearchView ne fonctionne pas.

Il semble que le passage à l'onglet quiz dégonfle ma disposition de recherche, et lorsque je change de format, cela gonfle la structure de recherche mais n'instancie pas correctement le SearchView. Lorsque j'essaie de rechercher à nouveau, OnQueryTextChange n'est pas appelé. Je n'arrive pas à comprendre pourquoi ça fait ça.

Le problème a commencé lorsque j'ai ajouté un SearchView à QuizLayout.xml et ajouté du code pour un second SearchView au onCreateOptionsMenu dans MainActivity pour l'onglet Quiz. Cependant, même après avoir commenté et vérifié que tous les identifiants étaient corrects, le problème persiste.

Ci-dessous est mon code, avec un code (sans doute) non pertinent omis.

Mon SearchFragment:

package com.example.ryans45attcdie.chess; 

public class SearchFragment extends Fragment { 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.search_fragment, container, false); 

     return v; 
    } 

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

     searchLayout = 
     (LinearLayout)getView().findViewById(R.id.searchLayoutS); 
    } 
} 

Mon QuizFragment: (vide pour le débogage)

public class QuizFragment extends Fragment {} 

Mon MainActivity:

public class MainActivity extends AppCompatActivity { 

TextView sname1;//(etc.) 

ArrayList<TextView> masterNameListS; 

List<Fragment> fragments = new Vector<>(); 
ArrayList<String> listItems = new ArrayList<String>(); 
ArrayAdapter<String> adapter; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //set up fragments in tabs 

    fragments.add(Fragment.instantiate(this, QuizFragment.class.getName())); 
    fragments.add(Fragment.instantiate(this, 
    ExplorerFragment.class.getName())); 
    fragments.add(Fragment.instantiate(this, 
    SearchFragment.class.getName())); 

    PagerAdaptor adaptor = new PagerAdaptor(getSupportFragmentManager(), 
    fragments); 
    ViewPager pager = (ViewPager) findViewById(R.id.viewPager); 
    pager.setAdapter(adaptor); 

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 
    tabLayout.setupWithViewPager(pager); 

    tabLayout.getTabAt(0).setText("QUIZ"); 
    tabLayout.getTabAt(1).setText("EXPLORE"); 
    tabLayout.getTabAt(2).setText("SEARCH"); 

    adapter = new ArrayAdapter<String>(getApplicationContext(), 
    android.R.layout.list_content, listItems); 

    pager.setCurrentItem(1); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    sname1 = (TextView) findViewById(R.id.sname1); //(etc.) 

    final ArrayList<TextView> masterNameListS = new ArrayList<>(); 

    masterNameListS.add(sname1); //(etc.) 

    // Get the SearchView and set the searchable configuration 
    SearchManager searchManagerS = (SearchManager) 
    getSystemService(Context.SEARCH_SERVICE); 

    SearchView searchViewS = (SearchView) findViewById(R.id.searchViewS); 

    // Assumes current activity is the searchable activity 
    ComponentName cnS = new ComponentName(this, SearchableActivity.class); 
    searchViewS.setSearchableInfo(searchManagerS.getSearchableInfo(cnS)); 
    searchViewS.setIconifiedByDefault(false); // Do not iconify the widget; 
    expand it by default 
    searchViewS.setOnQueryTextListener(new SearchView.OnQueryTextListener() 
    { 

     @Override 
     public boolean onQueryTextSubmit(String s) { 
      return true; 
     } 

     @Override 
     public boolean onQueryTextChange(String s) { 

      //parse search string and set TextView texts here 

      return true; 

     } 

    }); 
    return true; 
    } 

    @Override 
public booleafn onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

Et PagerAdapter:

package com.example.ryans45attcdie.chess; 

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.view.WindowManager; 

import java.util.List; 

public class PagerAdaptor extends FragmentPagerAdapter { 

    private List<Fragment> fragments; 

    public PagerAdaptor(FragmentManager fm, List<Fragment> fragments) { 
     super(fm); 

     this.fragments = fragments; 
} 
@Override 
public Fragment getItem(int i) { 
    return fragments.get(i); 
} 
@Override 
public int getCount() { 
    return fragments.size(); 
    } 
} 

Mon fichier QuizLayout.xml est vide. My SearchLayout.xml crée tous les TextView sans texte et Visibility.GONE.

Merci beaucoup pour les gars d'aide,

Stephen

Répondre

0

résolu le problème :)

Le problème était que ViewPager garde, par défaut, un seul onglet hors écran dans la mémoire. Parce que mon onglet de l'explorateur a été ouvert en premier, cela a été stocké dans la mémoire. Lorsque je suis passé de la recherche au quiz, mon ViewPager a décidé de supprimer l'onglet de recherche et de conserver l'onglet de l'explorateur. Pour résoudre ce problème, placez your_View_Pager_here.setOffscreenPageLimit(number_to_store); dans votre méthode MainActivity onCreate.