长按按钮可更改文字

时间:2017-07-01 08:00:29

标签: android button keyboard

我的应用中有几个按钮,上面有单个字符编号(例如' 1',' 2',' 3',... )。实际上,当用户点击按钮时,该按钮上的文字会从数字变为字母(例如' A',' B'或' C&#39 ; ...)并且如果用户再次单击它将更改回来。这一切都运作良好,因为字符和数字基本上是硬编程到应用程序,但我想让用户输入' custom'通过长按单击显示在按钮上的字符。例如,代替第一个按钮仅显示' 1'或者' A'我希望用户能够长按按钮并选择说' X'从键盘然后按钮显示此值。

我已经做了很多关于如何执行此操作的搜索,但我遇到的所有示例都是指为EditText而不是Button(或TextView)读取输入。我试图使用" InputMethodManager"正如Developer Docs(以及许多其他地方)所讨论的那样,但我并不真正理解它应该如何使用,只需将示例代码复制到我的onLongClick(...)& #39;方法不起作用,无论如何也可能不是正确的方法。

我能找到的最有前途的导演可能是Possbile to long press button and change its text in Android,其中包含评论:

  

您无法将光标放在按钮上。您可以在按钮后面放置一个edittext,当长按该按钮时,您可以使按钮不可见,然后聚焦Edittext。在edittext的onFocusChanged()中的edittext中输入文本后,再次出现按钮,然后将文本从edittext设置为按钮

虽然这个细节在细节上有点短暂,但这听起来很有希望。

因为我已经扩展了常规Button类来处理我的要求所以我可以在我的' CustomButton'中添加一个虚拟的EditText。如果能让我通过。

如果这里的任何值都是我用虚拟EditText捕获键盘输入的微弱尝试:

private class MyLongClickListener implements View.OnLongClickListener {
    @Override
    public boolean onLongClick(final View view) {
        final CustomButton button = (CustomButton) view;

        EditText editText = button.getEditText();

        if (editText.requestFocus()) {
            InputMethodManager imm = (InputMethodManager)
                    getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
        }

        return true;
    }
}

但是执行只是在showSoftInput中直接击中而退出方法而没有显示任何内容,当然也没有机会输入一个角色。

实现这一目标的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

我会这样做。

创建包含ButtonEditText的自定义视图。

public class MyView extends RelativeLayout {


public MyView(Context context, AttributeSet attrs) {
    super(context, attrs);
    addViews();
}

public MyView(Context context) {
    super(context);
    addViews();
}

private void addViews() {
    View view = inflate(getContext(), R.layout.my_layout, null);
    addView(view);
}
}

my_layout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/editText"
    android:layout_gravity="center_horizontal"
    android:visibility="gone"
    android:singleLine="true"/>

<TextView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:text="Some Text"
    android:id="@+id/textView"
    android:layout_gravity="center_horizontal"
    android:textAlignment="center"
    android:textStyle="bold"
    android:textSize="30sp" />

</RelativeLayout>

并像这样更改onLongClickListener

 private class MyLongClickListener implements View.OnLongClickListener {
  EditText editText;
  TextView textView ;
 @Override
        public boolean onLongClick(View view) {
            editText =(EditText) view.findViewById(R.id.editText);
            textView =(TextView) view.findViewById(R.id.textView);
            editText.bringToFront();
            textView.setVisibility(View.INVISIBLE);
            editText.setVisibility(View.VISIBLE);
            if (editText.requestFocus()) {
                InputMethodManager imm = (InputMethodManager)
                        getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);

            }
            textView.setText(editText.getText().toString());
            editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
                @Override
                public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                    if(actionId== EditorInfo.IME_ACTION_DONE){
                        editText.setVisibility(View.INVISIBLE);
                        textView.bringToFront();
                        textView.setVisibility(View.VISIBLE);
                        textView.setText(editText.getText().toString());
                    }
                    return false;
                }
            });

            return true;
        }
}

希望这有帮助。