【问题标题】:Custom TextView with just one character that was entered last from keyboard自定义 TextView,仅包含最后从键盘输入的一个字符
【发布时间】:2013-07-16 09:11:25
【问题描述】:

好的,我想以某种方式执行以下操作。 在对话框中,我希望用户能够选择一个字母(只有字母)。进去之后,他应该就能看到了。如果用户对他的选择不满意,他应该可以简单地点击另一个字母。他现在应该会看到这封信,而不是之前的一封。

我想尽可能多地使用标准选项。 我想以某种方式自定义 TextView 以仅显示一个当前输入的字符。或者也许活动或片段可以以某种方式拦截来自键盘的输入,然后在每次输入时使用当前输入的字符编辑 textView。

谁能告诉我怎么做?

【问题讨论】:

  • 完全错过了那里的无限循环!请参阅我的编辑。我现在无法测试它。但逻辑似乎是合理的。

标签: android input keyboard textview


【解决方案1】:

班级成员

private MyTextWatcher mTextWatcher;
private EditText mEditText;

在适当的地方调用 setTextWatcher(),例如在 onCreate 中

public void setTextWatcher()
{
    mTextWatcher = new MyTextWatcher();
    mEditText.addTextChangedListener(mTextWatcher);
}

MyTextWatcher 类

public class MyTextWatcher implements TextWatcher
{

    @Override
    public void afterTextChanged(Editable s)
    {

        String text = mEditText.getText().toString();
        if (text.length() > 1)
        {
            mEditText.removeTextChangedListener(mTextWatcher);
            mEditText.setText(text.substring(1));
            Selection.setSelection(mEditText.getText(), 1);
            mEditText.addTextChangedListener(mTextWatcher);
        }
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after)
    {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before,
            int count)
    {

    }

}

【讨论】:

    【解决方案2】:

    您需要将文本更改侦听器附加到您的 EditText:

    这是一种解决方法:

    public class XYZ extends Activity {
    
    String toCompare = "";
    
    ....
    
    ....
    
    ....
    
    yourEditText.addTextChangedListener(new TextWatcher() {
    
        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void onTextChanged(final CharSequence s, int start, int before, int count) {
    
                        if (s.length() > 0 && !toCompare.equals(s.toString())) {
                                toCompare = String.valueOf(s.charAt(s.length() - 1));
                                yourEditText.setText(String.valueOf(s.charAt(s.length() - 1)));
                        }
    
        }
    
    });
    

    【讨论】:

    • 好吧,我认为这应该可行。但是我得到 Resource not found 异常 int setText 方法。
    • 你可以尝试用yourEditText.setText(String.valueOf(s.charAt(s.length() - 1)));替换yourEditText.setText(s.charAt(s.length() - 1));
    • stackoverflow.com/questions/17708838/… 你可以看到你的代码会有无限循环。
    • 不。只是更多的例外。 07-18 01:21:09.810: E/AndroidRuntime(1522): java.lang.StringIndexOutOfBoundsException: length=0;区域开始=0; regionLength=-1 07-18 01:21:09.810: E/AndroidRuntime(1522): 在 java.lang.AbstractStringBuilder.startEndAndLength(AbstractStringBuilder.java:216) 07-18 01:21:09.810: E/AndroidRuntime(1522) : 在 java.lang.AbstractStringBuilder.replace0(AbstractStringBuilder.java:446) 07-18 01:21:09.810: E/AndroidRuntime(1522): 在 java.lang.StringBuffer.replace(StringBuffer.java:682)
    • 做了一些改变。字符串toCompare 被初始化为“”。当用户输入一个字符时,检查(s.length() > 0 && !toCompare.equals(s.toString()) 评估为真。这将使用字符更新toCompare,然后设置EditText。一旦设置了EditText,就会调用 onTextChanged。但是这一次,(s.length() > 0 && !toCompare.equals(s.toString()) 的计算结果为 false。应用程序等待用户输入。
    猜你喜欢
    • 2013-04-25
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 2017-05-04
    • 2017-04-20
    • 1970-01-01
    相关资源
    最近更新 更多