У меня есть приложение, которое должно работать на планшете, и есть страница, где присутствует recyclerview, а в его строке есть 2 текста редактирования (с numberDecimal в качестве ввода), клавиатура по умолчанию не должна появляться, потому что она покрывает довольно большой часть экрана.
Я создал кнопки в действии, которые действуют как кнопки клавиатуры, однако проблема в том, как заставить кнопку из действия взаимодействовать с текстами редактирования в адаптере.
как я могу узнать, что если я нажму (кнопку "1"), например, он должен отобразить 1 в сфокусированном тексте редактирования в адаптере, и как, если я нажму кнопку "<" или ">", он должен знать предыдущее и следующее редактирование тексты
пожалуйста помоги
текст редактирования находится в адаптере представления ресайклера, а кнопки - в действии
- Intiliased the Adapter before clicking the buttons. because, required the instance of your Adapter to perform.
- create a method add() in your Adapter
ArrayList<String> dataList = new ArrayList<>();
public void add(String element) {
dataList.add(element);
notifyItemInserted(dataList.size() - 1);//this will update the recyclerview with data inserted
}
с помощью нажатия кнопки вызовите этот метод с помощью экземпляра адаптера
yourAdapter.add(btn1.getText().toString());
Я приведу пример на Котлине, я предполагаю, что это то, что вы используете. Таким образом, вы можете просто переопределить обработку ключей в родительском классе, например:
Создайте метод, который вы вызываете один раз из onCreate, например:
fun keydown_onClick(){
try{
myActivity.setOnKeyListener { _, keyCode, event ->
if (keyCode == android.view.KeyEvent.KEYS_YOU_CARE_ABOUT) {
//handle it
if (activeViewHolder != null){
var displayText = activeViewHolder.yourEditText.text
keyPressedChar = (char)event.getUnicodeChar()+""
//if it's a special key you care about, then handle it in a when statement or if and pass to your adapter if needed to go to next row for example.
displayText += keyPressedChar
activeViewHolder.yourEditText.text = displayText
}
return@setOnKeyListener true//we've processed it
} else
return@setOnKeyListener false// pass on to be processed as normal
}
}catch (ex: Exception){
A35Log.e(mClassTag, "Error handling onkeydown listener: ${ex.message}")
}
}
Следующее, как вы с этим справляетесь. хорошо, вы должны отслеживать активную строку. Вы можете сделать это, создав обратный вызов в своей деятельности, который получает уведомление, когда выбирается другая строка или получает фокус.
interface IFocusChangeListener {
fun onNewItemFocused(holder: MyApdaterViewHolder, item: DataItem, index: Int)
}
Это будет передано в ваш адаптер и использовано для возврата к вашему классу активности.
// в действии
var activeViewHolder: MyAdapterViewHolder? = null
var activeIndex: Int? = null
var activeItem: DataItem? = null
fun onNewItemFocused(holder: MyAdapterViewHolder, item: DataItem, index: Int){
activeViewHolder = holder
activeIndex = index
activeItem = item
}
// теперь в событии нажатия клавиши вы просто передаете значение в editText в activeViewHolder,
Итак, последняя деталь находится в адаптере.
// при привязке View создать View holder, обычное раздувание. Затем, когда у вас есть editText, вы просто добавляете.
var item = currentDataItem
var index = currentDataItemIndex
var viewHolder = currentViewHolder //from onBind
viewHolder.setOnFocusChangeListener(object: View.OnFocusChangeListener{
override fun onFocusChange(v: View?, hasFocus: Boolean) {
if (hasFocus){
mFocusListener?.onNewItemFocused(viewHolder, item, index)
}
}
})
// в адаптере может также понадобиться
fun onNextEditTextClicked(item: DataItem, index: Int){
//get next data Item by index + 1 if exist and get it's viewholder.editText and set focus to it, this will automatically trigger the focus event back to the activity
}
fun onPreviousEditTextClicked(item: DataItem, index: Int){
//get next data Item by index - 1 if exist and get it's viewholder.editText and set focus to it, this will automatically trigger the focus event back to the activity
}
Теперь у вас есть сфокусированный зритель в вашей деятельности по вызову, вы можете поймать ключи, которые вам нужно уловить, возможно, все из них. Вы можете передать их, вам должно быть хорошо.
ПРИМЕЧАНИЕ*
Для записи: если вы используете современные методы, известные как привязка данных, тогда вы сможете просто обновить связываемую строку в своей модели, и она будет отображаться на экране без необходимости передавать ее. Вы также можете привязать фокус к выбранному и просто обновить выбранное логическое значение моделей. Есть более простые способы сделать это, если вы используете привязку. Но пока просто помогу вам, но не усложняю.
Это решение может нуждаться в доработке, я просто напечатал его здесь, так что может быть немного не так, но в основном должно помочь вам.
Удачного кодирования.
мой ответ основан на том, что я понял из вашего вопроса. У вас есть несколько кнопок и текст для редактирования. если кнопка нажата. вы должны отобразить данные, нажимаемые кнопкой, в тексте редактирования. 1. вы установили данные для каждой кнопки с их уважаемым текстом
button1.setText("1");
[вот так] 2. если вы нажали button1 (его текст равен 1). Показать текст этой нажатой кнопки в редактируемом тексте в кнопке onClickListener ()String pressed = button1.getText().toString(); edittext.setText(pressed);