我试图创建一个基于smack库的聊天应用程序。我认为我的问题与这个库无关,因为logcat正确地发送和接收所有内容。我的问题是,当我收到一条消息时,它不会显示。以下是我用来显示文字的方法。
public void TextCreating(String message) {
Log.d("START", "Method Excution started.");
layout = (LinearLayout) findViewById(R.id.layoutLinear);
LayoutParams lparams = new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
tv = new TextView(this);
tv.setLayoutParams(lparams);
tv.setText(message);
tv.setTextColor(Color.WHITE);
Log.d("STARTED", "Text color OK.");
layout.addView(tv);
Log.d("STARTED", "Text didsplayed.");
}
这种代码的和平将作为收到的消息执行。那些收到的消息是通过一个名为PacketListener的监听器来处理的。这个接收部分工作正常。在这个监听器中,当我调用TextCreating方法时,它执行到tv.setTextColor(Color.WHITE);最后一行不会执行。这是什么原因?我怎么解决这个问题 ?在此先感谢:)
编辑:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Chat Room"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Chat History :" />
<LinearLayout
android:id="@+id/layoutLinear"
android:layout_width="fill_parent"
android:layout_height="250dp"
android:orientation="vertical"
android:background="#000000"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp" >
</LinearLayout>
<EditText
android:id="@+id/editTextMessage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:ems="10" >
<requestFocus />
</EditText>
<Button
android:id="@+id/buttonSend"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Send" />
</LinearLayout>
答案 0 :(得分:0)
以下是创建聊天框的替代解决方案。
其用途ListView
。在新message
到达时添加项目。
android:stackFromBottom
可以设置为true,使其与聊天框完全相同。默认情况下它也有滚动。
希望它有所帮助。
答案 1 :(得分:0)
Android SDK有一个示例聊天应用程序,通过蓝牙进行通信。 您可以查看代码。
它使用ListView
来显示对话
希望这个答案很有用:)
答案 2 :(得分:0)
我在设备上运行了你的代码并且没有发现它的问题。我已经对TextCreating(String.valueOf(System.currentTimeMillis()) + " next call\n");
进行了定时器调用,并且能够观察黑色LinearLayout中的文本
我看到的唯一问题是LinearLayout
不会滚动。因此,如果添加更多文本,则无法显示。
答案 3 :(得分:0)
首先感谢每个人的想法和帮助。我通过在代码中引入一个Handler来解决这个问题。我试图在我的UI线程中做所有事情。所以我修改了我的代码如下。
private Handler mHandler = new Handler();
public void TextCreating(final String message) {
mHandler.post(new Runnable() {
@Override
public void run() {
layout = (LinearLayout) findViewById(R.id.layoutLinear);
LayoutParams lparams = new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
tv = new TextView(MUCchat.this);
tv.setLayoutParams(lparams);
tv.append(message);
tv.setTextColor(Color.WHITE);
layout.addView(tv);
}
});
}
此链接帮助我了解了这一点。 Update textView from thread