2016-11-13 6 views
2

ハンドラークラスを使用してTextViewのテキストを更新するのは愚かな問題があります。私はGoogle MapsでカスタムInfoウィンドウを設定しています。 「状態」TextViewだけでその内容を更新し、画面上で視覚的に更新されていない状態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「名前」は、正常に更新されます。私はrunOnUiThread()を無効にしようとしましたが、何も動作していないようです。解決策は本当に明白かもしれないが、私はそれを見ない。

ご協力いただきありがとうございます。

EDIT

は、ここで私は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

私は上記のコードで***とコメントして署名したコマンドを呼び出すことで、私のウィンドウをリフレッシュします。

+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()あなたのコードを実行するときにメッセージを準備し、「「のTextViewを更新してください」彼に伝えるためにOSに送信

たちができます。友人に10通の手紙を送ることができるという説明を簡素化しますが、同時に10通の手紙を送っても、同時に到着しないかもしれません...

ここにはそうです:for Androidの場合、ユーザーインターフェイスのメッセージは「優先」メッセージではありませんが、アプリケーションコードの優先順位は高くなります setText()を実行すると、メッセージは送信されますが、OSはsetText )あなた一人巨大なコードアクションを形成します。 OSがあなたのコードを実行し、コードのこの巨大な部分が終了したときにだけ、OSは "ああ、まあ、私は手紙を受け取ったかもしれない"と言って、彼は "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); 

:Androidは「リフレッシュのsetTextを」読むこと

public Runnable Call_Huge_Code() 
{ 
    return new Runnable() 
    { 
     public void run() 
     { 
      // here your code... 
     } 
    }; 
} 

これは、プロセスを「遅い」にenoughtされていない100ミリ秒によってあなたのコードの実行を遅らせるが、enoughtあるだろうメッセージ。

0

あなたはこれを実行する必要があります。

status.setText("Some text"); 
    status.invalidate(); 
    status.requestLayout(); 
関連する問題