TextView只更新一次

时间:2011-02-28 06:34:01

标签: android textview android-ui

我的Android应用程序出现了一个看似奇怪的问题。 无论我调用append还是setText,我的TextView都只会更新一次。

我的IME设置为"发送"听取如下按钮:

        sendText.setOnEditorActionListener(new OnEditorActionListener() {
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event){
            if(actionId == EditorInfo.IME_ACTION_SEND){
                try {
                    send();
                    scroller.post(new Runnable() {
                        @Override
                        public void run() {
                            scroller.fullScroll(ScrollView.FOCUS_DOWN);
                        }
                    });
                } catch (Exception e) {
                    Log.e("chat", e.toString());
                }
            }
            return true;
        }
    });

发送方法:

public void send(){
    final String message = sendText.getText().toString();
    final String ip = ipAddr.getText().toString();
    //rcvMsg.append("Me:  " + message + "\n");
    runOnUiThread(new Runnable(){
        public void run(){
            TextView rcv = (TextView)findViewById(R.id.rcvMsg);
            rcv.setText(rcv.getText()+"Me: "+message+"\n");
        }
    });
}

正如您所看到的,我在runOnUiThread中尝试了append和setText。这两个都只在第一次调用send()时更新textView。在随后的通话中,它不会改变。

但是!

如果我将应用程序放在后台(点击主页),然后重新启动它,TextView会有所有正确的文本。

我错过了什么?

3 个答案:

答案 0 :(得分:2)

我明白了 - 这是一个GUI问题..

我不小心将TextView(在scrollview中)的高度设置为精确值。显然,这导致fullScroll方法搞砸而不是完全向下滚动,因此添加的文本是不可见的。将TextView的高度设置为wrap_content解决了这个问题。

答案 1 :(得分:0)

在活动中setContentView之后放置以下代码行,然后从发送方法中删除

TextView rcv = (TextView)findViewById(R.id.rcvMsg);

将此行rcv.setText(rcv.getText()+"Me: "+message+"\n"); 更改为

rcv.setText(rcv.getText().toString()+"Me: "+message+"\n");
发送方法中的

答案 2 :(得分:0)

你不应该把

TextView rcv = (TextView)findViewById(R.id.rcvMsg);
rcv.setText(rcv.getText()+"Me: "+message+"\n");

在一个可运行的。你的代码看起来应该更像这样。

public void send(){

    TextView rcv = (TextView)findViewById(R.id.rcvMsg);
    rcv.setText(rcv.getText()+"Me: "+sendText.getText().toString()+"\n");

}

如果你使用ip变量以某种方式发送此消息,你可以在可运行的内部进行,但是在可运行的内部设置textarea是不可能的,因为两者在不同的线程上运行。