Сделайте так, чтобы кнопки работали как клавиатура

У меня есть приложение, которое должно работать на планшете, и есть страница, где присутствует recyclerview, а в его строке есть 2 текста редактирования (с numberDecimal в качестве ввода), клавиатура по умолчанию не должна появляться, потому что она покрывает довольно большой часть экрана.

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

как я могу узнать, что если я нажму (кнопку "1"), например, он должен отобразить 1 в сфокусированном тексте редактирования в адаптере, и как, если я нажму кнопку "<" или ">", он должен знать предыдущее и следующее редактирование тексты

пожалуйста помоги

мой ответ основан на том, что я понял из вашего вопроса. У вас есть несколько кнопок и текст для редактирования. если кнопка нажата. вы должны отобразить данные, нажимаемые кнопкой, в тексте редактирования. 1. вы установили данные для каждой кнопки с их уважаемым текстом button1.setText("1"); [вот так] 2. если вы нажали button1 (его текст равен 1). Показать текст этой нажатой кнопки в редактируемом тексте в кнопке onClickListener () String pressed = button1.getText().toString(); edittext.setText(pressed);

Chethan Kumar 26.10.2018 09:44

текст редактирования находится в адаптере представления ресайклера, а кнопки - в действии

IntegratedDigitalSystems IDS 26.10.2018 10:02
1
2
84
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

  1. Intiliased the Adapter before clicking the buttons. because, required the instance of your Adapter to perform.
  2. 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
}

Теперь у вас есть сфокусированный зритель в вашей деятельности по вызову, вы можете поймать ключи, которые вам нужно уловить, возможно, все из них. Вы можете передать их, вам должно быть хорошо.

ПРИМЕЧАНИЕ*

Для записи: если вы используете современные методы, известные как привязка данных, тогда вы сможете просто обновить связываемую строку в своей модели, и она будет отображаться на экране без необходимости передавать ее. Вы также можете привязать фокус к выбранному и просто обновить выбранное логическое значение моделей. Есть более простые способы сделать это, если вы используете привязку. Но пока просто помогу вам, но не усложняю.

Это решение может нуждаться в доработке, я просто напечатал его здесь, так что может быть немного не так, но в основном должно помочь вам.

Удачного кодирования.

Другие вопросы по теме