使按钮像键盘一样起作用

时间:2018-10-26 07:24:50

标签: java android android-recyclerview kotlin

我有一个应在平板电脑上运行的应用程序,并且存在一个页面,其中存在一个recyclerview,并且其行项中有2个编辑文本(以numberDecimal作为输入),默认键盘不会出现,因为它覆盖了屏幕的很大一部分。

我在活动中创建了按钮,使其像键盘按钮一样工作,但是问题是如何使活动中的按钮与适配器中的编辑文本进行通信。

我怎么知道,如果我按下(按钮“ 1”),例如它应该在适配器的焦点编辑文本中显示1,以及如果我按下“ <”或“>”按钮,它应该知道前一个和下一个修改文字

请帮助

2 个答案:

答案 0 :(得分:0)

  
      
  1. 在单击按钮之前对适配器进行了初始化。因为,需要您的适配器实例才能执行。
  2.   
  3. 在适配器中创建方法add()
  4.   
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
}

从您的按钮中单击Adapter实例调用此方法

yourAdapter.add(btn1.getText().toString());

答案 1 :(得分:0)

我将在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
}

///现在,在按键事件中,您只需将值传递给activeViewHolder中的editText,

所以最后一块在适配器中。

//在绑定视图上 创建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
}

现在,您在通话活动中拥有了重点突出的查看者,您可以捕获自己想捕获的键,可能是所有键。您可以将它们传递过来,您应该会很好。

注意*

为记录起见,如果您使用的是现代实践(也称为数据绑定),那么您应该能够只更新模型中的可绑定字符串,并且该字符串将显示在屏幕上而无需传递它。您还可以将焦点绑定到选定对象上,然后仅更新模型的选定布尔值。如果使用绑定,则有更清洁的方法来执行此操作。但是现在,只是帮助您而不会使其复杂化。

这个解决方案可能需要调整,我只是在这里输入了它,所以可能有点问题,但是应该可以帮助您解决问题。

快乐编码。