Je souhaite supprimer le focus et le texte de SearchView
dans onResume()
.
J'ai essayé searchView.clearFocus()
mais cela ne fonctionne pas.
Ceci est mon code XML:
<SearchView
Android:id="@+id/searchView"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignBottom="@+id/toolbar"
Android:layout_alignTop="@+id/toolbar"
Android:layout_centerVertical="true"
Android:layout_marginBottom="4dp"
Android:layout_marginTop="4dp"
Android:iconifiedByDefault="false"
Android:paddingLeft="16dp"
Android:paddingRight="16dp" />
Je souhaite supprimer le focus et le texte de
SearchView
dansonResume()
Pour ce faire, vous pouvez définir votre mise en page racine comme suitable avec l'attribut Android:focusableInTouchMode
et demander le focus sur cette View
dans onResume()
.
Par exemple:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/root_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
Android:focusableInTouchMode="true">
<SearchView
Android:id="@+id/search_view"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:iconifiedByDefault="false"/>
</LinearLayout>
Et puis dans votre Activity
:
private View rootView;
private SearchView searchView;
// ...
@Override
protected void onCreate(Bundle savedInstanceState) {
// ...
rootView = findViewById(R.id.root_layout);
searchView = (SearchView) findViewById(R.id.search_view);
}
@Override
protected void onResume() {
super.onResume();
searchView.setQuery("", false);
rootView.requestFocus();
}
en cours d’activité, accédez à la disposition parente, et à fragment
, faites également la même chose dans framelayout
. Ajoutez simplement cet attribut:
Android:focusableInTouchMode="true"
Utilisez cette ligne de code dans votre méthode onResume
if (searchView != null) {
searchView.setQuery("", false);
searchView.clearFocus();
searchView.onActionViewCollapsed();
}
Écrivez ce code dans onResume()
searchView.setText("");
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
La solution la plus simple (et je pense que la seule solution qui fonctionne à 100%) est de créer un nom invisible LinearLayout
. Ce LinearLayout
va capter l’attention du EditText
.
Pour ceux qui cherchent à se débarrasser de l’attention lorsque la Activity
est lancéeETla SearchView
est dans la Menu
, j’ai fait ces 3 choses, cela pourrait marcher avec seulement quelques-unes:
1.- Créez une classe parent de SearchView
. Appelons cela RafaSearchView
:
class RafaSearchView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0)
: SearchView(context, attrs, defStyleAttr) {
init {
setIconifiedByDefault(false)
}
}
2.- Obtenez le code XML où vous avez votre Toolbar
, et définissez touchable="false"
et focusableInTouchMode="true"
:
<androidx.appcompat.widget.Toolbar
Android:id="@+id/searchToolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:background="@color/white"
Android:focusable="false"
Android:focusableInTouchMode="true"
Android:theme="@style/ToolBarStyle"
app:popupTheme="@style/AppTheme.PopupOverlay" />
3.- Sur onCreateOptionsMenu(Menu)
lorsque je déclare ma RafaSearchView
, appelez:
searchView?.isIconified = false
searchView?.clearFocus()
Je venais de demander le focus à un autre groupe de vues et cela supprimait le focus de searchview.
Vous pouvez masquer manuellement le clavier dans la fonction onResume () en tant que:
InputMethodManager imm = (InputMethodManager) context.getSystemService(context.INPUT_METHOD_SERVICE);
View view = context.getCurrentFocus();
if (view == null) {
view = new View(context);
}
if (view != null) {
IBinder iBinder = view.getWindowToken();
imm.hideSoftInputFromWindow(iBinder, 0);
}