Kotlinで簡単なAndroidアプリを作成しようとしています。レイアウトにEditTextとButtonがあります。編集フィールドに書き込み、Buttonをクリックした後、仮想キーボード。
人気の質問があります閉じる/隠すAndroidソフトキーボード Javaですが、私が理解している限り、Kotlinの代替バージョンがあるはずです。
Viktorの回答を少し改善できると思います。常にビューにアタッチされていることに基づいて、コンテキストがあります。コンテキストがある場合はInputMethodManagerがあります
fun View.hideKeyboard() {
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(windowToken, 0)
}
この場合、コンテキストは自動的にビューのコンテキストを意味します。どう思いますか?
アクティビティ、フラグメント内で次のユーティリティ機能を使用して、ソフトキーボードを非表示にします。
(*)最新のKotlinバージョンの更新
fun Fragment.hideKeyboard() {
view?.let { activity?.hideKeyboard(it) }
}
fun Activity.hideKeyboard() {
hideKeyboard(if (currentFocus == null) View(this) else currentFocus)
}
fun Context.hideKeyboard(view: View) {
val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
}
古い答え:
fun Fragment.hideKeyboard() {
activity.hideKeyboard(view)
}
fun Activity.hideKeyboard() {
hideKeyboard(if (currentFocus == null) View(this) else currentFocus)
}
fun Context.hideKeyboard(view: View) {
val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
}
これにより、ダイアログフラグメントやアクティビティなどのコードに関係なくキーボードが閉じられます。
アクティビティ/フラグメントの使用法:
hideKeyboard()
アクティビティでこのメソッドをオーバーライドするだけです。子フラグメントでも自動的に機能します.....
Javaの場合
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (getCurrentFocus() != null) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
return super.dispatchTouchEvent(ev);
}
In Kotlin
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
if (currentFocus != null) {
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(currentFocus!!.windowToken, 0)
}
return super.dispatchTouchEvent(ev)
}
それがあなたのために働くなら投票してください....ありがとう.....
Peterのソリューションは、Viewクラスの機能を拡張することで問題をきれいに解決します。別の方法として、Activityクラスの機能を拡張し、キーボード自体を非表示にする操作を、View自体ではなくViewのコンテナにバインドする方法があります。
fun Activity.hideKeyboard() {
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(findViewById(Android.R.id.content).getWindowToken(), 0);
}
Utilsという名前のオブジェクトクラスを作成します。
object Utils {
fun hideSoftKeyBoard(context: Context, view: View) {
try {
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm?.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
} catch (e: Exception) {
// TODO: handle exception
e.printStackTrace()
}
}
}
このメソッドは、ソフト入力キーボードを非表示にする任意のクラスで使用できます。 BaseActivity
でこれを使用しています。
ここで、ビューは、レイアウトで使用するビューです。
Utils.hideSoftKeyBoard(this@BaseActivity, view )
ここで私のために働いた答えを見つけました: http://programminget.blogspot.com/2017/08/how-to-close-Android-soft-keyboard.html
val inputManager:InputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputManager.hideSoftInputFromWindow(currentFocus.windowToken, InputMethodManager.SHOW_FORCED)
Ankoを使用して生活を楽にすることができるので、次のようになります。
inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
または、拡張機能を作成することをお勧めします。
fun View.hideKeyboard(inputMethodManager: InputMethodManager) {
inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
}
次のように呼び出します:
view?.hideKeyboard(activity.inputMethodManager)
これはAPI 26でうまく機能します。
val view: View = if (currentFocus == null) View(this) else currentFocus
val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
以下のコードから使用できます。次のフラグメントに以下のコードを記述します。
private val myLayout = ViewTreeObserver.OnGlobalLayoutListener {
yourTextView.isCursorVisible = KeyboardTool.isSoftKeyboardShown(myRelativeLayout.rootView)
}
次に、onViewCreated
のfragment
で:
......
super.onViewCreated(view, savedInstanceState)
myRelativeLayout.viewTreeObserver.addOnGlobalLayoutListener(myLayout)
......
onDestroyView
でも使用:
override fun onDestroyView() {
super.onDestroyView()
myRelativeLayout.viewTreeObserver.removeOnGlobalLayoutListener(myLayout)
}
そして:
object KeyboardTool {
fun isSoftKeyboardShown(rootView: View): Boolean {
val softKeyboardHeight = 100
val rect = Rect()
rootView.getWindowVisibleDisplayFrame(rect)
val dm = rootView.resources.displayMetrics
val heightDiff = rootView.bottom - rect.bottom
return heightDiff > softKeyboardHeight * dm.density
}
}
Kotlin for Fragmentでの私のソリューションを次に示します。ボタンのsetOnClickListener
内に配置します。
val imm = context?.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager?
imm!!.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0)
アクティビティまたはフラグメントで、次のような関数を作成します。
fun View.hideKeyboard() {
val inputManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputManager.hideSoftInputFromWindow(windowToken, 0)
}
このアクティビティまたはフラグメントに関連するXMLファイルにyour_button_id
というIDを持つボタンがあるとします。そのため、ボタンクリックイベントで:
your_button_id.setOnClickListener{
it.hideKeyboard()
}