2011-05-28 80 views
2

我有一個textview,其中我用兩種方式追加文本: 第一種方法:單擊按鈕並獲取EditText中的內容。Android不會向文本視圖中正確添加()文本

sendbutton.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       txview.append("Text: "+txedit.getText()+"\n"); 
       txedit.setText(""); 

} 
      }); 

這工作正常,當我點擊按鈕textview更新與新文本的視圖。

BUT

的第二種方式,我聽XMPP監聽器(asmack庫)和上recieving消息我將其追加到TextView的。

chat = xmpp.getChatManager().createChat(contactid[1], new MessageListener() { 
       public void processMessage(Chat chat, Message message) {  
        try { 
         chat.sendMessage(message.getBody()); 
        } catch (XMPPException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        }    txview.append("Text"+message.getFrom()+"\n"+message.getBody()+"\n");    }              } 
      );; 

的問題是,我收到消息,我知道它肯定(因爲我它重新發送到與chat.sendMessage(message.getBody())的用戶),BUT的TextView僅在我更改視圖或將應用程序置於後臺(單擊主頁按鈕)並將其重新放回到前臺後才顯示我的消息。

我試過 在每個視圖上調用invalidate(),根本不起作用。

是否有任何解決方案或其他方式來做我即將做的事情?

回答

8

通過執行以下技巧,您可以在GUI線程上實現發佈。 將您的上下文(活動或服務)傳遞給您的監聽器。聽衆內:

Handler h = new Handler(context.getMainLooper()); 

h.post(new Runnable() { 
    @Override 
    public void run() { 
     txview.append("Text"+message.getFrom()+"\n"+message.getBody()+"\n"); 
    } 
}); 
+0

感謝您的代碼,想檢查文檔,但你來到這裏有一個很好的答案。但我認爲生病無論如何讀取documentaion =) – artouiros 2011-05-28 06:46:27

+1

您也可以在GUI線程中創建Handler並將其傳遞給您的監聽器。但我從來沒有嘗試過。 – 2011-05-28 06:49:26

+0

textView.append(「text」); textView.postDelayed(null,0); – 2016-08-18 15:57:06

1

你確定在第二個例子中,在GUI線程上調用processMessage(Chat,Message)方法嗎?如果沒有,那就是你的問題。切勿觸摸非GUI線程的GUI。幾乎沒有GUI喜歡那樣。

+0

你會在這種情況下建議什麼? – artouiros 2011-05-28 05:03:46

+0

從GUI線程調用txcview.append。 – Hyperboreus 2011-05-28 05:07:09

+0

很難,因爲我需要在聽衆得到消息時調用append(),唯一的方法是在lsitener中調用 – artouiros 2011-05-28 05:16:36