Сделать кнопки функционировать как клавиатура - PullRequest
0 голосов
/ 26 октября 2018

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

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

Создайте метод, который вы вызываете один раз из 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,

Итак, последняя часть находится в адаптере.

// на bind View создать видодержатель, обычный наворот. Затем, когда у вас есть ваш 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
}

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

Примечание *

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

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

Счастливое кодирование.

0 голосов
/ 26 октября 2018
  1. Включение адаптера перед нажатием кнопок.потому что, требуется экземпляр вашего адаптера для выполнения.
  2. создайте метод add () в вашем адаптере
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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...