单独的搜索视图以获取片段



我有一个简单的活动,它包含一个选项卡栏来切换两个片段。这两个片段都是 listFragment,并实现搜索视图以使在列表片段中进行搜索成为可能。搜索视图始终显示在选项卡栏上方的操作栏中。

遇到的问题是,一旦我切换选项卡(转到其他片段),搜索视图的输入就不会重置。因此,第二个片段从搜索视图中读取输入并相应地过滤列表片段,这实际上读取了我还在片段一中时输入的输入。

我想要的是搜索视图是两个片段的单独搜索视图。有没有办法实现这一目标?

这是我的代码:

活动

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) {
}
}

片段一

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;
}

片段二

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;
}
}

除了搜索部分外,两个片段几乎相同。

已经有一段时间了,但如果有人发现同样的问题,这是我设法做到这一点的方法.

只需在每个片段中实现 onPrepareOptionsMenu() 和在里面,打电话onQueryTextChange("); 将 " 作为查询字符串传递。

相关内容

  • 没有找到相关文章

最新更新