android – 片段的单独searchview

前端之家收集整理的这篇文章主要介绍了android – 片段的单独searchview前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个简单的活动,它包含一个tabbar来切换两个片段.这两个片段都是listFragment并实现了searchview,以便在listfragment中进行搜索.搜索视图始终显示标签栏上方的操作栏中.

我遇到的问题是,切换标签后,搜索视图的输入不会重置(转到其他片段).因此,第二个片段从searchview读取输入并相应地过滤listfragment,它实际上读取了我在片段1中时输入的输入.

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

这是我的代码

活动

  1. public class ActivityMainApp extends Activity implements ActionBar.TabListener {
  2.  
  3. private FragmentManager fragmentManager = getFragmentManager();
  4.  
  5. @Override
  6. public void onCreate(Bundle icicle) {
  7.  
  8. super.onCreate(icicle);
  9. setContentView(R.layout.mainapp);
  10.  
  11. ActionBar actionBar = getActionBar();
  12. actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
  13.  
  14. // Add tabs
  15. ActionBar.Tab relatieTab = actionBar.newTab().setText("Relaties");
  16. ActionBar.Tab takenTab = actionBar.newTab().setText("Taken");
  17. //ActionBar.Tab urenTab = actionBar.newTab().setText("Uren");
  18.  
  19. // Listeners
  20. relatieTab.setTabListener(this);
  21. takenTab.setTabListener(this);
  22.  
  23. // Tabs toevoegen aan actionbar
  24. actionBar.addTab(relatieTab);
  25. actionBar.addTab(takenTab);
  26.  
  27. // Create fragmentmanager to switch fragments
  28. FragmentTransaction fragmentTransaction = this.fragmentManager.beginTransaction();
  29. Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_content);
  30.  
  31. if(fragment == null){
  32. FragmentTransaction ft = fragmentManager.beginTransaction();
  33. ft.add(R.id.fragment_content,new FragRelaties());
  34. }
  35.  
  36. }
  37.  
  38. public void onTabSelected(Tab tab,FragmentTransaction ft) {
  39.  
  40. FragmentTransaction fragmentTransaction = this.fragmentManager.beginTransaction();
  41.  
  42. if(tab.getText().equals("Taken")){
  43. FragTaken fragment = new FragTaken();
  44. fragmentTransaction.replace(R.id.fragment_content,fragment);
  45. fragmentTransaction.commit();
  46. }
  47.  
  48. if(tab.getText().equals("Relaties")){
  49. FragRelaties fragment = new FragRelaties();
  50. fragmentTransaction.replace(R.id.fragment_content,fragment);
  51. fragmentTransaction.commit();
  52. }
  53.  
  54. }
  55.  
  56. public void onTabUnselected(Tab tab,FragmentTransaction ft) {
  57.  
  58. }
  59.  
  60. public void onTabReselected(Tab tab,FragmentTransaction ft) {
  61.  
  62. }
  63.  
  64. }

片段一

  1. public class FragRelaties extends ListFragment implements SearchView.OnQueryTextListener {
  2.  
  3. private LayoutInflater inflater;
  4. private ModelRelatie modelRelatie;
  5. private AdapterRelatie relatieAdapter;
  6. public ArrayList<Relatie> relaties;
  7.  
  8. public View onCreateView(final LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
  9.  
  10. this.inflater = inflater;
  11.  
  12. Activity activity = getActivity();
  13. final Context context = activity.getApplicationContext();
  14.  
  15. setHasOptionsMenu(true);
  16.  
  17.  
  18. new AsyncTask<Void,Void,ArrayList<Relatie>>(){
  19.  
  20. protected ArrayList<Relatie> doInBackground(Void... params) {
  21.  
  22. // Get all my contacts
  23. modelRelatie = ModelRelatie.instantiate(context);
  24. ArrayList<Relatie> relaties = modelRelatie.getRelaties();
  25.  
  26. return relaties;
  27.  
  28. }
  29. protected void onPostExecute(ArrayList<Relatie> relaties) {
  30.  
  31. // Initial input of objects in the list
  32. relatieAdapter = new AdapterRelatie(inflater.getContext(),R.layout.relatieslijstitem,relaties);
  33. setListAdapter(relatieAdapter);
  34.  
  35. }
  36.  
  37. }.execute();
  38.  
  39. View view = inflater.inflate(R.layout.relaties,container,false);
  40.  
  41. return view;
  42.  
  43. }
  44.  
  45. @Override
  46. public void onCreateOptionsMenu(final Menu menu,final MenuInflater inflater) {
  47.  
  48. inflater.inflate(R.menu.relatie_menu,menu);
  49.  
  50. // Get the searchview
  51. MenuItem zoekveld = menu.findItem(R.id.zoekveld_fragrelatie);
  52. SearchView zoekview = (SearchView) zoekveld.getActionView();
  53.  
  54. // Execute this when searching
  55. zoekview.setOnQueryTextListener(this);
  56.  
  57. super.onCreateOptionsMenu(menu,inflater);
  58.  
  59. }
  60.  
  61. public void onListItemClick(ListView l,View v,int position,long id) {
  62. // Things that happen when i click on an item in the list
  63. }
  64.  
  65. public boolean onQueryTextSubmit(String query) {
  66. return true;
  67. }
  68.  
  69. public boolean onQueryTextChange(String zoekterm) {
  70.  
  71. Activity activity = getActivity();
  72. Context context = activity.getApplicationContext();
  73.  
  74. // We start searching for the name entered
  75. ModelRelatie modelRelatie = ModelRelatie.instantiate(context);
  76. ArrayList<Relatie> relaties = modelRelatie.zoekRelatie(zoekterm);
  77.  
  78. // The returned objects are placed in the list
  79. this.relatieAdapter = new AdapterRelatie(inflater.getContext(),relaties);
  80. setListAdapter(relatieAdapter);
  81.  
  82. return true;
  83.  
  84. }

片段二

  1. public class FragTaken extends ListFragment implements SearchView.OnQueryTextListener {
  2.  
  3. private LayoutInflater inflater;
  4. private AdapterTaak adapterTaak;
  5. private ModelTaken modelTaken;
  6.  
  7. public View onCreateView(LayoutInflater inflater,Bundle savedInstanceState) {
  8.  
  9. this.inflater = inflater;
  10.  
  11. Activity activity = getActivity();
  12. final Context context = activity.getApplicationContext();
  13.  
  14. setHasOptionsMenu(true);
  15.  
  16. this.modelTaken = ModelTaken.instantiate(context);
  17. ArrayList<Taak> taken = modelTaken.getTaken();
  18.  
  19. // Initial input for the list
  20. adapterTaak = new AdapterTaak(inflater.getContext(),R.layout.takenlijstitem,taken);
  21. setListAdapter(adapterTaak);
  22.  
  23. View view = inflater.inflate(R.layout.taken,false);
  24. return view;
  25.  
  26. }
  27.  
  28. @Override
  29. public void onCreateOptionsMenu(final Menu menu,final MenuInflater inflater) {
  30.  
  31. inflater.inflate(R.menu.taken_menu,menu);
  32.  
  33. // get the searview
  34. MenuItem zoekveld = menu.findItem(R.id.zoekveld_fragtaken);
  35. SearchView zoekview = (SearchView) zoekveld.getActionView();
  36.  
  37. // Execute this when searching
  38. zoekview.setOnQueryTextListener(this);
  39.  
  40. super.onCreateOptionsMenu(menu,inflater);
  41.  
  42. }
  43.  
  44. public boolean onQueryTextSubmit(String query) {
  45. return true;
  46. }
  47.  
  48. public boolean onQueryTextChange(String zoekterm) {
  49.  
  50. Activity activity = getActivity();
  51. Context context = activity.getApplicationContext();
  52.  
  53. // Search the task by the inputed value
  54. ModelTaken modelTaken = ModelTaken.instantiate(context);
  55. ArrayList<Taak> taken = modelTaken.zoekTaak(zoekterm);
  56.  
  57. // Return the found items to the list
  58. this.adapterTaak = new AdapterTaak(inflater.getContext(),taken);
  59. setListAdapter(adapterTaak);
  60.  
  61. return true;
  62.  
  63. }
  64.  
  65. }

搜索部分外,两个片段几乎相同.

解决方法

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

只需在每个片段中实现onPrepareOptionsMenu()即可在里面,打电话onQueryTextChange( “”);传递“”作为查询字符串.

猜你在找的Android相关文章