onResume()
のSearchView
からフォーカスとテキストを削除したい。
searchView.clearFocus()
を試しましたが、機能していません。
これは私の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" />
onResume()
のSearchView
からフォーカスとテキストを削除したい
これを実現するには、ルートレイアウトを_Android:focusableInTouchMode
_属性でフォーカス可能に設定し、onResume()
のView
にフォーカスを要求できます。
例えば:
_<?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>
_
そして、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();
}
_
アクティビティ中は親レイアウトに移動し、fragment
でもframelayout
でも同じことを行います。この属性を追加するだけです:
Android:focusableInTouchMode="true"
OnResumeメソッドでこのコード行を使用します
if (searchView != null) {
searchView.setQuery("", false);
searchView.clearFocus();
searchView.onActionViewCollapsed();
}
onResume()
にこのコードを書く
searchView.setText("");
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
searchView.clearFocus();
のonResume()
だけが私のケースを助けました
SearchViewウィジェットで、追加するだけです
Android:focusable="false"
完全なウィジェットコード
<Android.support.v7.widget.SearchView
Android:id="@+id/your_search_view_id"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
app:iconifiedByDefault="false"
app:queryHint="Search something..."
Android:focusable="false" />
最も単純な(そして私が思うに、唯一の100%動作する)ソリューションは、目に見えないLinearLayout
を作成することです。このLinearLayout
は、EditText
からフォーカスを取得します。
Activity
が開始されたときにフォーカスを取り除こうとしている人のために[〜#〜] and [〜#〜] the SearchView
はMenu
、私はこれらの3つのことをしました、それはほんのいくつかでうまくいくかもしれません:
1.- SearchView
の親クラスを作成します。それをRafaSearchView
と呼びましょう:
_class RafaSearchView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0)
: SearchView(context, attrs, defStyleAttr) {
init {
setIconifiedByDefault(false)
}
}
_
2.- Toolbar
があるxmlを取得し、_touchable="false"
_および_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.- onCreateOptionsMenu(Menu)
でRafaSearchView
を宣言しているとき、以下を呼び出します:
_ searchView?.isIconified = false
searchView?.clearFocus()
_
他のビューグループにフォーカスを要求しただけで、searchviewからフォーカスが削除されました。
OnResume()関数でキーボードを手動で非表示にするには、次のようにします。
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);
}