我在使用处理程序类更新TextView
中的文本时遇到了一个愚蠢的问题。我在Google地图中设置了自定义信息窗口。
mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
@Override
public View getInfoWindow(Marker marker) {
return null;
}
@Override
public View getInfoContents(final Marker marker) {
//setting marker as final***
View v = getLayoutInflater().inflate(R.layout.my_layout, null);
TextView name = (TextView) v.findViewById(R.id.name);
final TextView status = (TextView) v.findViewById(R.id.status);
for(MyItem mi : myItems){
if(mi.getName().equals(marker.getTitle())){
name.setText(mi.getName()); //This one updates normaly
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//this one sets the text, but doesnt update on UI
status.setText("Text");
//Here I call my update text function
updateTv(status, "Text");
//Refreshing the window***
marker.showInfoWindow();
}
}, 5000);
break;
}
}
return v;
}
});
}
TextView
"姓名"正在更新,而" status" TextView
仅更新其内容,而不是在屏幕上直观更新。我尝试过无效runOnUiThread()
,但似乎没有任何效果。我知道解决方案可能非常明显,但我没有看到它。
提前感谢您的帮助!
修改
这是我尝试runOnUiThread()的方式。
public void updateTv(final TextView tv, final String s){
runOnUiThread(new Runnable() {
@Override
public void run() {
tv.setText(s);
tv.invalidate();
}
});
}
我的XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Large Text"
android:id="@+id/name"
android:layout_gravity="center"
android:gravity="center_horizontal"
android:padding="10dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="..."
android:id="@+id/status"
android:gravity="center_horizontal"/>
</LinearLayout>
解
我通过在上面的代码中调用用***评论和签名的命令来刷新我的窗口。我要感谢&#34; clownba0t&#34;
答案 0 :(得分:1)
这是因为Android是一个使用消息的操作系统。因此,操作系统的一部分会根据消息中的顺序读取消息并执行操作。
刷新TextView中的文本是通过以下方式完成的:当您执行setText()时,您的代码会准备一条消息并将其发送到操作系统,告诉他&#34;请刷新textView&#34;&#34;
我们可以简化说明你可以给朋友发10封信,但即使你同时寄10封信,也许他们不会同时到达......
在这里,情况就是这样:对于Android,用户界面的消息不是&#34;优先级&#34;消息。但App Code具有高优先级。 因此,当您执行setText()时,会发送消息,但操作系统不会在setText()执行巨大的代码操作后将其读取为。所以操作系统会运行你的代码,只有当这段巨大的代码完成时,操作系统会说“噢,好吧,也许我收到了一封信&#34;”,他打开信件发现&#34;请刷新textView& #34;并做到了。 所以...在你的大量代码之后。
如何解决? 您必须将大量代码放在处理程序中。
TextView tmp_id_top_msg = (TextView) findViewById(R.id.text_top_clavier);
tmp_id_top_msg.setText("message to display");
Handler handler_spend_time;
handler_spend_time = new Handler();
handler_spend_time.postDelayed(Call_Huge_Code(), 100);
然后:
public Runnable Call_Huge_Code()
{
return new Runnable()
{
public void run()
{
// here your code...
}
};
}
这将使你的代码执行延迟100毫秒,这是不应该的。&#34;慢&#34;这个过程,但Android应该阅读&#34;刷新setText&#34;消息。
答案 1 :(得分:0)
答案 2 :(得分:0)
你需要这样做:
status.setText("Some text");
status.invalidate();
status.requestLayout();