TextView обновляется только один раз - PullRequest
0 голосов
/ 28 февраля 2011

У меня странная проблема с моим приложением для 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");
        }
    });
}

Как видите, я попытался добавить и setText в runOnUiThread. Оба они обновляют textView только при первом вызове send (). При последующих вызовах оно не меняется.

Но!

Если я помещу приложение в фоновый режим (нажмите «Домой»), а затем перезапущу его, в TextView будет весь нужный текст.

Что мне не хватает?

Ответы [ 3 ]

2 голосов
/ 28 февраля 2011

Я понял - это проблема с графическим интерфейсом ..

Я случайно установил высоту TextView (внутри прокрутки) на точное значение.По-видимому, это привело к тому, что метод fullScroll испортился, а не прокрутился вниз полностью, поэтому добавленный текст был невидимым.Установка высоты TextView в wrap_content решила проблему.

0 голосов
/ 28 февраля 2011

Не следует ставить

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, то вы сделаете это внутри исполняемого файла, но установить текстовое поле внутри исполняемого файла невозможно, так какдва работают в разных потоках.

0 голосов
/ 28 февраля 2011

Поставьте ниже строку кода после setContentView в вашей активности и удалите из метода отправки

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

Измените эту строку rcv.setText(rcv.getText()+"Me: "+message+"\n"); на

rcv.setText(rcv.getText().toString()+"Me: "+message+"\n");

в методе отправки

...