我有一个简单的活动,它包含一个tabbar来切换两个片段.这两个片段都是listFragment并实现了searchview,以便在listfragment中进行搜索.搜索视图始终显示在标签栏上方的操作栏中.
我遇到的问题是,切换标签后,搜索视图的输入不会重置(转到其他片段).因此,第二个片段从searchview读取输入并相应地过滤listfragment,它实际上读取了我在片段1中时输入的输入.
我想要的是searchview是两个片段的单独搜索视图.有没有办法实现这个目标?
这是我的代码:
活动
- 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(),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,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,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(),taken);
- setListAdapter(adapterTaak);
- return true;
- }
- }
除搜索部分外,两个片段几乎相同.
解决方法
已经有一段时间了,但如果有人发现同样的问题,
这是我如何设法做到这一点.
这是我如何设法做到这一点.
只需在每个片段中实现onPrepareOptionsMenu()即可在里面,打电话onQueryTextChange( “”);传递“”作为查询字符串.