Android开发每次都需要按一个退格键或者回车才能显示出我edittext控件里面的内容

本文讨论了使用TextWatcher实现EditText输入内容实时显示的问题,解决了需要按退格键或回车才能显示输入内容的困扰,提供了同步显示输入内容的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于setOnKeyListener 

[复制链接]
   

4

主题

0

好友

89

积分

No.1 开发小菜鸟

Rank: 1

升级  89%

精华
0
帖子
11
e币
62 元
跳转到指定楼层
楼主
  发表于 2010-12-15 09:03:32  | 只看该作者  | 倒序浏览
0
追windows8应用浪潮
做一个实时显示EditText输入内容的例子
为什么用下面的代码执行时,每次都需要按一个退格键或者回车才能显示出我edittext控件里面的内容,却不是我想象中的输一个符号就显示一个符号呢?
        mEditText01.setOnKeyListener(new EditText.OnKeyListener()
        {
                @Override
                public boolean onKey(View arg0, int arg1, KeyEvent arg2)
                {
                        mTextView01.setText(mEditText01.getText());
                        return false;
                }
        }
        );
 
   

1

主题

5

好友

3124

积分

No.6 江湖开发者

Rank: 6Rank: 6

升级  4.13%

精华
0
帖子
548
e币
2009 元
沙发
  发表于 2010-12-15 09:25:57  | 只看该作者
用这个类TextWatcher
系统说我的个性签名的字符数超过80
 
   

4

主题

0

好友

89

积分

No.1 开发小菜鸟

Rank: 1

升级  89%

精华
0
帖子
11
e币
62 元
板凳
  发表于 2010-12-15 09:44:45  | 只看该作者
谢谢2楼 自己回答一下
真正实现同步的方法如下:
public class myAct extends Activity {
    private TextView mTextView01;
    private EditText mEditText01;
        /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mTextView01 = (TextView) findViewById(R.id.myTextView);
        mEditText01 = (EditText) findViewById(R.id.myEditText);        
        /*Real synchronization*/
        mEditText01.addTextChangedListener(mTextWatcher);
    }
    
    TextWatcher mTextWatcher = new TextWatcher()
    {
            @Override
            public void afterTextChanged(Editable s)
        {}
            
            @Override
            public void beforeTextChanged(CharSequence s,int start,
                        int count, int after)
        {}
            
            @Override
            public void onTextChanged(CharSequence s, int start,
                        int before, int count)
        {
                mTextView01.setText(mEditText01.getText());
        }
    };

<think>嗯,用户想了解binary模式下按退格键显示"BS"的原因以及如何解决这个问题。从ta的补充说明里能看ta已经注意到键盘字符映射和校对集的概念(引用1和引用3),还特别提到binary模式——这应该就是关键线索。用户提到的引用1其实是个C语言关键字列表,乍看无关,但其中"char"类型和"ASCII"概念可能暗示ta在编程时遇到这个问题。引用3提到二进制比较(bin)时区分物理字节值,正好对应binary模式的核心特征。用户真正需要的可能是理解底层机制并解决现实操作中的显示异常。关于退格键显示BS的原因,要从三层面解释:ASCII编码层面(退格符的二进制值08hex),终端模拟层面(binary模式会禁用控制符转义),开发环境层面(C语言中char类型直接存储ASCII值)。解决方法则需区分使用场景:普通用户应该关闭文件传输工具的二进制模式;开发者则需要检查接收端的控制符处理逻辑,比如在接收数据后主动替换\x08为可显示字符。用户可能实际在用FTP工具或串口调试时遇到这个问题,特别是传输文本文件时。ta没明说但或许在疑惑:为什么同样的操作在不同模式下表现不同?这就要强调二进制模式的意义——它放弃了终端智能解释功能,以换取字节级精确传输。这个解释需要同时现在回答里。</think> 在 **binary 模式** 下按退格键显示 **BS** 的原因及解决方法如下: --- ### **原因分析** 1. **ASCII 控制符的原始输** 在二进制模式下,输入/输设备不解释控制字符: - 退格键对应 ASCII 编码 `0x08`(十六进制),其字符名为 **BS**(Backspace)[^2]。 - 普通文本模式会自动将 `0x08` 解释为删除操作,但**二进制模式**会直接输其字符名 `BS`。 2. **终端处理的差异** 二进制模式(如校对集中的 `bin` 方式[^3])以原始字节流处理数据,不会转换控制符。此时: ``` 用户按键 → 生成字节码 0x08 → 二进制模式直接显示 'BS' ``` 3. **应用场景的特殊性** 常见于以下情况: - 串口调试工具(如 SecureCRT 的二进制传输模式) - 终端模拟器(如 Linux `cat -v` 命令) - 编程中未过滤控制符的文本处理(如 Python 读取串口数据) --- ### **解决方法** #### 方法 1:切换终端模式(通用) - **关闭二进制传输模式**:在终端工具中找到传输模式设置(如 *File Transfer → Binary*),改为 **ASCII 模式**。 - **示例操作(Tera Term)**: ```plaintext Setup → Terminal → 取消勾选 "Receive data in binary format" ``` #### 方法 2:过滤控制符(编程场景) 在代码中替换 `BS` 字符: ```python # Python 示例:过滤退格符 data = serial_port.read().replace(b'\x08', b'') print(data.decode('utf-8')) ``` #### 方法 3:使用显示转换工具 - **Linux/macOS**:通过 `cat -v` 转换控制符: ```bash cat -v yourfile.txt # 将显示 ^H 代替 BS ``` - **Windows PowerShell**:使用正则替换: ```powershell Get-Content yourfile.txt | % { $_ -replace '\x08', '[BS]' } ``` #### 方法 4:修改终端配置 某些终端需手动设置键盘映射: 1. 找到键盘设置(如 PuTTY: *Connection → Keyboard*) 2. 将 **Backspace** 的键值改为 **Control-H** 或 **ASCII 127**(DEL) --- ### **根本原理总结** | 模式 | 退格键处理方式 | 显示结果 | |-------------|-------------------------------|----------| | **文本模式** | 解释为删除指令 | 无显示 | | **二进制模式**| 输原始 ASCII 值 `0x08` | BS | > ⚠️ **注意**:若需长期使用二进制模式(如传输非文本文件),建议忽略控制符显示,因其不影响文件完整性[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值