Tabhost Android et RechercheVoir la question de la mise au point
-
21-12-2019 - |
Question
J'ai un problème vraiment étrange.J'ai un pager avec des fragments.L'un des fragments est le fragment de messages.Dans ce fragment, j'ai un fragmentTabhost avec trois fragments d'onglets.Dans la barre d'action, j'ai une recherche de recherche.Lorsque je souhaite rechercher quelque chose et je commence à écrire la chaîne de requête, le centre de la vue de recherche est supprimé de celui-ci et est défini sur le premier onglet du Tabhost.De cette façon, je ne peux pas écrire la chaîne de requête.Cela ne se produit que lorsque je suis près du mode de fragment.Par exemple: si je suis assez loin (1 page), la recherche fonctionne bien.
Quelqu'un peut-il me dire quel pourrait être le problème?
Voici une photo:
MessagesFragment:
public class MessagesFragment extends Fragment {
private FragmentTabHost tabHost;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
this.tabHost = new FragmentTabHost(this.getActivity());
this.tabHost.setup(this.getActivity(), this.getChildFragmentManager(), container.getId());
TabSpec tabSpecForAllMessages = this.tabHost.newTabSpec("all").setIndicator("ALL");
this.tabHost.addTab(tabSpecForAllMessages, AllMessagesFragment.class, null);
TabSpec tabSpecForSentMessages = this.tabHost.newTabSpec("sent").setIndicator("SENT");
this.tabHost.addTab(tabSpecForSentMessages, SentMessagesFragment.class, null);
TabSpec tabSpecForReceivedMessages = this.tabHost.newTabSpec("received").setIndicator("RECEIVED");
this.tabHost.addTab(tabSpecForReceivedMessages, ReceivedMessagesFragment.class, null);
return this.tabHost;
}
@Override
public void onDestroyView() {
super.onDestroyView();
this.tabHost = null;
}
}
La mise en page d'onglet Hôte:
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TabWidget
android:id="@android:id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</TabWidget>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>
</LinearLayout>
</TabHost>
Le menu Barre d'action-Éléments:
<?xml version="1.0" encoding="utf-8"?>
<item
android:id="@+id/menu_item_search"
android:actionViewClass="android.widget.SearchView"
android:icon="@drawable/ic_action_search"
android:showAsAction="collapseActionView|ifRoom"
android:title="@string/title_search" />
<item
android:id="@+id/menu_item_home"
android:icon="@drawable/ic_action_home"
android:showAsAction="always"
android:title="@string/title_home" />
Le gestionnaire d'événements ONCREATEOPTIONSMENU:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = this.getMenuInflater();
inflater.inflate(R.menu.options_menu, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView =
(SearchView) menu.findItem(R.id.menu_item_search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(this
.getComponentName()));
return true;
}
La solution
Essayez Ajouter la méthode
@Override
public boolean onQueryTextChange(String text) {
if(searchView!=null)
searchView.requestFocusFromTouch();
return true;
}
SearchView doit être Init SearchView Rechercherview;
My OncreateOptionsMenu Méthode:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.only_search, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
searchView.requestFocusFromTouch();
return true;
}
});
}
Ça a fonctionné pour moi!
Autres conseils
Je suis également confronté au même problème et j'ai résolu ceci en écrivant l'auditeur à la vue comme celle-ci ..
searchView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
searchView.requestFocusFromTouch();
return true;
}
});