2016-11-13 94 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();