Событие onKeyDown () не вызывается, когда в DialogFragment - PullRequest
0 голосов
/ 23 ноября 2018

Я фиксирую ключевые события (с внешней клавиатуры) в моем приложении.Я использую onKeyDown() метод из Activity.В моем приложении я переключаюсь между разными фрагментами.Если я нахожусь в нормальном Fragment, то при нажатии кнопок активируется onKeyDown() Activity.Но когда я использую DialogFragment в качестве диалога, нажатие кнопки больше не вызывает Activity's onKeyDown () `.

Вот пример кода:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    fun onClick(view: View) {
// a) Key Event works if adding it via a fragment transaction by my own
//        val fragment = MyDialogFragment.newInstance()
//        val fragmentTransaction = supportFragmentManager.beginTransaction()
//        fragmentTransaction.add(R.id.fr_container, fragment, fragment.javaClass.name)
//        fragmentTransaction.commit()

// b) Key Event doesn't work if showing as a dialog
        val fragment = MyDialogFragment.newInstance()
        fragment.show(supportFragmentManager, fragment.javaClass.name)

    }

    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        Log.i(javaClass.name, "onKeyDown() keyCode: $keyCode")
        return true
    }
}

И мойдва фрагмента:

class MyNormalFragment : Fragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_my_normal, container, false)
    }
}


class MyDialogFragment : DialogFragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_my_dialog, container, false)
    }

    companion object {
        fun newInstance() = MyDialogFragment()
    }
}

Как только я позвоню a) show(), чтобы открыть MyDialogFragment, ключевые события больше не фиксируются.Но если я открою MyDialogFragment b) с помощью пользовательской транзакции фрагментов, то ключевые события все равно будут захвачены, но мой фрагмент больше не будет отображаться как диалог.

Что у меня естьсделать, чтобы событие также срабатывало при отображении моего диалогового окна?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Ridcully ответ правильный.Я просто хотел опубликовать то, что я изменил, внутри MyDialogFragment, чтобы продолжать захват ключевых событий:

class MyDialogFragment : DialogFragment() {
    private val keyEventListener = DialogInterface.OnKeyListener { dialog, keyCode, event ->
        Log.i(javaClass.name, "onKey() keyCode: $keyCode")
        true
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        dialog.setOnKeyListener(keyEventListener)
        return inflater.inflate(R.layout.fragment_my_dialog, container, false)
    }

    override fun onDestroyView() {
        dialog.setOnKeyListener(null)
        super.onDestroyView()
    }

    companion object {
        fun newInstance() = MyDialogFragment()
    }
}
0 голосов
/ 23 ноября 2018

Диалог отображается в / как отдельное окно, поэтому ваша активность больше не фокусируется на нажатиях клавиш.Однако в Dialog есть собственный метод onKeyDown, так что вы можете использовать его.

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