2012-11-21 7 views
6

Ich habe eine einfache Aktivität, die eine Tableiste enthält, um zwei Fragmente zu wechseln. Die beiden Fragmente sind ein listFragment und implementieren eine Suchansicht, um die Suche innerhalb des listfragments zu ermöglichen. Die Suchansicht wird immer in der Aktionsleiste über der Tableiste angezeigt.Separate Suche nach Fragmenten

Das Problem, das ich habe ist, dass die Eingabe der Suchansicht nicht zurückgesetzt wird, sobald ich die Registerkarte wechseln (zu anderen Fragment wechseln). Daher liest das zweite Fragment die Eingabe aus der Suchansicht und filtert das Listenfragment entsprechend, was tatsächlich die Eingabe liest, die ich eingegeben habe, als ich noch im ersten Fragment war.

Was ich will, ist die searchview zu einem separaten searchview für beide Fragmente. Gibt es einen Weg, dies zu erreichen?

Hier ist mein Code:

Aktivität

public class ActivityMainApp extends Activity implements ActionBar.TabListener { 

private FragmentManager fragmentManager = getFragmentManager(); 

@Override 
public void onCreate(Bundle icicle) { 

    super.onCreate(icicle); 
setContentView(R.layout.mainapp); 

    ActionBar actionBar = getActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    // Add tabs 
    ActionBar.Tab relatieTab = actionBar.newTab().setText("Relaties"); 
    ActionBar.Tab takenTab = actionBar.newTab().setText("Taken"); 
    //ActionBar.Tab urenTab = actionBar.newTab().setText("Uren"); 

    // Listeners 
    relatieTab.setTabListener(this); 
    takenTab.setTabListener(this); 

    // Tabs toevoegen aan actionbar 
actionBar.addTab(relatieTab); 
actionBar.addTab(takenTab); 

    // Create fragmentmanager to switch fragments 
    FragmentTransaction fragmentTransaction = this.fragmentManager.beginTransaction(); 
    Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_content); 

    if(fragment == null){ 
     FragmentTransaction ft = fragmentManager.beginTransaction(); 
     ft.add(R.id.fragment_content, new FragRelaties()); 
    } 

} 

public void onTabSelected(Tab tab, FragmentTransaction ft) { 

    FragmentTransaction fragmentTransaction = this.fragmentManager.beginTransaction(); 

    if(tab.getText().equals("Taken")){ 
     FragTaken fragment = new FragTaken(); 
     fragmentTransaction.replace(R.id.fragment_content, fragment); 
     fragmentTransaction.commit(); 
    } 

    if(tab.getText().equals("Relaties")){ 
     FragRelaties fragment = new FragRelaties(); 
     fragmentTransaction.replace(R.id.fragment_content, fragment); 
     fragmentTransaction.commit(); 
    } 

} 

public void onTabUnselected(Tab tab, FragmentTransaction ft) { 

} 

public void onTabReselected(Tab tab, FragmentTransaction ft) { 

} 

} 

Fragment eines

public class FragRelaties extends ListFragment implements SearchView.OnQueryTextListener { 

private LayoutInflater inflater; 
private ModelRelatie modelRelatie; 
private AdapterRelatie relatieAdapter; 
public ArrayList<Relatie> relaties; 

public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     this.inflater = inflater; 

     Activity activity = getActivity(); 
     final Context context = activity.getApplicationContext(); 

     setHasOptionsMenu(true); 


     new AsyncTask<Void, Void, ArrayList<Relatie>>(){ 

      protected ArrayList<Relatie> doInBackground(Void... params) { 

       // Get all my contacts 
       modelRelatie = ModelRelatie.instantiate(context); 
       ArrayList<Relatie> relaties = modelRelatie.getRelaties(); 

       return relaties; 

      } 
      protected void onPostExecute(ArrayList<Relatie> relaties) { 

       // Initial input of objects in the list 
       relatieAdapter = new AdapterRelatie(inflater.getContext(), R.layout.relatieslijstitem, relaties); 
       setListAdapter(relatieAdapter); 

      } 

     }.execute(); 

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

     return view; 

} 

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

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

      // Get the searchview 
    MenuItem zoekveld = menu.findItem(R.id.zoekveld_fragrelatie); 
    SearchView zoekview = (SearchView) zoekveld.getActionView(); 

    // Execute this when searching 
    zoekview.setOnQueryTextListener(this); 

    super.onCreateOptionsMenu(menu, inflater); 

} 

public void onListItemClick(ListView l, View v, int position, long id) { 
    // Things that happen when i click on an item in the list 
} 

public boolean onQueryTextSubmit(String query) { 
    return true; 
} 

public boolean onQueryTextChange(String zoekterm) { 

    Activity activity = getActivity(); 
    Context context = activity.getApplicationContext(); 

    // We start searching for the name entered 
    ModelRelatie modelRelatie = ModelRelatie.instantiate(context); 
    ArrayList<Relatie> relaties = modelRelatie.zoekRelatie(zoekterm); 

    // The returned objects are placed in the list 
    this.relatieAdapter = new AdapterRelatie(inflater.getContext(), R.layout.relatieslijstitem, relaties); 
    setListAdapter(relatieAdapter); 

    return true; 

} 

Fragment Zwei

public class FragTaken extends ListFragment implements SearchView.OnQueryTextListener { 

private LayoutInflater inflater; 
private AdapterTaak adapterTaak; 
private ModelTaken modelTaken; 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     this.inflater = inflater; 

     Activity activity = getActivity(); 
     final Context context = activity.getApplicationContext(); 

     setHasOptionsMenu(true); 

     this.modelTaken = ModelTaken.instantiate(context); 
     ArrayList<Taak> taken = modelTaken.getTaken(); 

     // Initial input for the list 
     adapterTaak = new AdapterTaak(inflater.getContext(), R.layout.takenlijstitem, taken); 
     setListAdapter(adapterTaak); 

     View view = inflater.inflate(R.layout.taken, container, false); 
     return view; 

} 

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

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

    // get the searview 
    MenuItem zoekveld = menu.findItem(R.id.zoekveld_fragtaken); 
    SearchView zoekview = (SearchView) zoekveld.getActionView(); 

    // Execute this when searching 
    zoekview.setOnQueryTextListener(this); 

    super.onCreateOptionsMenu(menu, inflater); 

} 

public boolean onQueryTextSubmit(String query) { 
    return true; 
} 

public boolean onQueryTextChange(String zoekterm) { 

    Activity activity = getActivity(); 
    Context context = activity.getApplicationContext(); 

    // Search the task by the inputed value 
    ModelTaken modelTaken = ModelTaken.instantiate(context); 
    ArrayList<Taak> taken = modelTaken.zoekTaak(zoekterm); 

    // Return the found items to the list 
    this.adapterTaak = new AdapterTaak(inflater.getContext(), R.layout.takenlijstitem, taken); 
    setListAdapter(adapterTaak); 

    return true; 

} 

} 

Beide Fragmente sind fast identisch mit Ausnahme des suchenden Teils.

+2

Stuck auf das gleiche Problem. Es ist eine ganze Weile, aber wenn Sie irgendeine Antwort gefunden haben, bitte posten Sie es. –

Antwort

10

Es ist schon eine Weile her, aber immer noch, wenn jemand das gleiche Problem findet, hier ist, wie ich das geschafft habe.

implementieren Nur onPrepareOptionsMenu() in jedem Ihrer Fragmente und Innere von ihm, rufen onQueryTextChange (""); übergibt "" als Abfragezeichenfolge.

+0

Wir haben schließlich die Idee, eine Suchansicht zu verwenden, fallen gelassen. Stattdessen haben wir unseren eigenen Editiertext direkt unterhalb der Statusleiste hinzugefügt, um ein ähnliches Ergebnis zu erzielen. Danke für die Erwiderung! – frank1fr

+1

Hallo, es scheint hilfreich zu sein, können Sie das bitte ausarbeiten. – Dilip

+0

dies funktioniert, danke –