TextView未更新

时间:2016-11-13 11:39:43

标签: java android google-maps textview

我在使用处理程序类更新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;

3 个答案:

答案 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)

因此,您尝试在从getInfoContents()返回后更新视图,但这不是实时视图,请参阅this

可能有用的东西是:

status.invalidate();

答案 2 :(得分:0)

你需要这样做:

    status.setText("Some text");
    status.invalidate();
    status.requestLayout();