Android: нажатие на EditText в нижнем колонтитуле ListView открывает и закрывает клавиатуру, открывает и закрывает

#android #listview #editview

#Android #listview #editview

Вопрос:

Код очень прост. В верхнем колонтитуле есть EditText, а в нижнем колонтитуле — EditText, сделайте высоту элементов высоту верхнего колонтитула высоту нижнего колонтитула = высоту экрана, после того, как вы нажмете EditText в верхнем колонтитуле, затем щелкните EditText в нижнем колонтитуле, появится ошибка. Любой может помочь мне объяснить проблему, я буду очень признателен, спасибо.

 class MainActivity : AppCompatActivity() {
    @SuppressLint("ClickableViewAccessibility")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val listView = findViewById<ListView>(R.id.listView)
        listView.adapter = ArrayAdapter(this,
                android.R.layout.simple_list_item_1,
                arrayListOf("1", "2", "3", "4", "5", "6","1", "2", "3", "4", "5", "6"))
        val headerView = LayoutInflater.from(this).inflate(R.layout.header, listView, false)
        val etHeader = headerView.findViewById<EditText>(R.id.etComment)
        listView.addHeaderView(headerView)

        val footerView = LayoutInflater.from(this).inflate(R.layout.footer, listView, false)
        val etFooter = footerView.findViewById<EditText>(R.id.etComment)
        listView.addFooterView(footerView)

        etHeader.setOnFocusChangeListener { v, hasFocus ->
            Log.e("", "etHeader->setOnFocusChangeListener: $hasFocus")
        }
        etFooter.setOnFocusChangeListener { v, hasFocus ->
           Log.e("", "etFooter->setOnFocusChangeListener: $hasFocus")
        }

    }
}
 

Весь код здесь: https://github.com/tuchangwei/EditTextIssue .

Ответ №1:

Это проблема вытеснения фокуса. Добавьте следующий код.

  etFooter.setOnFocusChangeListener { v, hasFocus ->
        Log.e("", "etFooter->setOnFocusChangeListener: $hasFocus")
        if(hasFocus){
            etFooter.setFocusable(true)
            etFooter.setFocusableInTouchMode(true)
            etFooter.requestFocus()
            etFooter.findFocus()
            val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm.showSoftInput(etFooter, InputMethodManager.SHOW_FORCED);
        }
    }
 

Комментарии:

1. спасибо за ваш ответ, но это работает только один раз. Если вы нажмете кнопку «Назад», чтобы клавиатура исчезла, затем щелкните нижний колонтитул, чтобы отобразить клавиатуру, вопрос вернется.