2016-11-13 92 views
2

我有一个愚蠢的问题,使用处理程序类更新TextView中的文本。我在Google地图中设置了自定义信息窗口。TextView不更新

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“名”正常更新,而“状态” 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> 

SOLUTION

我通过调用上面的代码注释,并与***签署命令刷新我的窗口。我要感谢“clownba0t”

+0

你应该在主线程中更新UI元素。显示你说你尝试runOnUiThread()时使用的代码。 – HelloSadness

+0

你介意发布'R.layout.my_layout'吗? – clownba0t

+0

你的布局xml?由于名称textView正在工作,它可能与更新机制无关,所以映射可能有问题! –

回答

0

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

东西可能工作在呼唤:

status.invalidate(); 
+0

status.invalidate()不工作,但我标记你的anwser是正确的,因为你解释了我的观点不是“现场” – tensa11

1

这来自于事实,Android是使用消息的OS。所以有一部分OS根据消息的顺序读取消息并执行操作。

刷新在TextView的文本是通过这种方式完成的:当您执行的setText()你的代码编写消息,并将其发送到OS告诉他“请刷新TextView的””

我们能。简化解释说你可以给朋友发10封信,但即使你同时发送10封信,也许他们不会在同一时间到达...

在这里,情况是这样的:for Android,用户界面的消息不是“优先”消息,但是应用代码具有高优先级 所以当你执行setText()时,消息被发送,但操作系统不会读取它,因为setText )你每个形成巨大的代码行动。所以操作系统运行你的代码,只有当这段代码完成后,操作系统会说“哦,好吧,也许我收到了一封信”,他打开信函找到“请刷新textView”并执行它。 因此...在你之后的一段巨大的代码。

如何解决? 您必须将您的巨大代码放入处理程序中。

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毫秒这是不足够多,你的代码的执行,以“慢”的过程,但它是足够多的Android阅读“刷新的setText”信息。

0

你需要这样做:

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