Как спрятать клавиатуру.Системные сервисы не доступны для Активности до onCreate () - PullRequest
2 голосов
/ 29 июня 2019

Системные службы недоступны для Activity до onCreate ()

У меня есть класс диалога MyPersonalDialog (mContext: Context), и этот диалог содержит EditText.Я инициирую класс MyPersonalDialog, анализируя контекст там.val myPersonalDialog = MyPersonalDialog (this)

, а затем я показываю в диалоговом окне мой вызов myPersonalDialog.showMyDialog

этот класс:

class MyPersonalDialog(mContext: Context){

    fun showMyDialog(){
    val builder = AlertDialog.Builder(context)
    val layoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
    val view = layoutInflater.inflate(R.layout.dialog_edit_list_title, null)
    view.renameListTitle.requestFocus()
    val inputHelper = InputHelper(context)
    inputHelper.showDialogKeyboard()
    builder.setView(view)
    builder.setNegativeButton(R.string.cancel, { dialogInterface: DialogInterface, i: Int ->
        inputHelper.hideKeyboard(activity, view)
    })
    //some other code goes next
}

}

Когда пользователь нажимает кнопку NegativeButton, HideKeyboard начинает работать

class InputHelper(val context: Context){
fun hideKeyboard(activity: Activity, view: View) {
        val inputManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        inputManager.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}
}

Но появляется эта ошибка: java.lang.IllegalStateException: системные службы недоступны для Activity до onCreate ()

Как я могу исправить эту проблему?Я не понимаю, почему эта ошибка появляется, потому что класс MyPersonalDialog был инициирован после onCreate

Решение найдено:

class InputHelper(val context: Context){
fun showDialogKeyboard() {
    val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)
}

fun hideKeyboard(view: View) {
        val inputManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        inputManager.hideSoftInputFromWindow(view.getWindowToken(),0);
}}

Ответы [ 4 ]

1 голос
/ 29 июня 2019

попробуйте заменить fun hideKeyboard(activity: Activity, view: View) { val inputManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager inputManager.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS) } } в InputHelper

0 голосов
/ 29 июня 2019
 fun hideKeyboard(activity: Activity) {
        val imm = activity.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
        //Find the currently focused view, so we can grab the correct window token from it.
        var view = activity.currentFocus
        //If no view currently has focus, create a new one, just so we can grab a window token from it
        if (view == null) {
            view = View(activity)
        }
        imm.hideSoftInputFromWindow(view.windowToken, 0)
    }
0 голосов
/ 29 июня 2019
recyclerViewOfLists = RecyclerViewOfLists(cursor, this, MainActivity())

Вы не можете создавать экземпляры действий, просто вызывая конструктор - например, здесь вы создаете экземпляр нового MainActivity. Такие действия не инициализируются для чего-либо, для чего вам нужно действие, например, для доступа к системным службам или для иного использования в качестве Context.

Вместо создания нового экземпляра передайте ссылку на существующий с this, например,

recyclerViewOfLists = RecyclerViewOfLists(cursor, this, this)
0 голосов
/ 29 июня 2019

Добавьте это в свою активность в манифесте -

андроида: windowSoftInputMode = "stateHiddenAlways"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...