2016-11-13 8 views
2

핸들 클래스를 사용하여 TextView의 텍스트를 업데이트하는 데 바보 같은 문제가 있습니다. Google지도에서 사용자 정의 정보 창을 설정하고 있습니다. '상태'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(),하지만 아무것도 작동하는 것. 솔루션이 정말 분명할지 모르지만 나는 그것을 볼 수 없습니다.

미리 도움을 주셔서 감사합니다.

편집

여기 내가 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> 

솔루션

나는 위의 코드에서 주석 및 *** 서명 명령을 호출하여 내 창을 새로 고쳐.

+0

당신은 주 스레드에서 UI 요소를 업데이트해야합니다. runOnUiThread()를 시도했을 때 사용한 코드를 표시하십시오. – HelloSadness

+0

'R.layout.my_layout'을 게시 하시겠습니까? – clownba0t

+0

레이아웃 xml? textView라는 이름이 작동하고 있기 때문에 업데이트 메커니즘과 아무 관련이 없습니다. 아마도 매핑에 문제가있을 수 있습니다! –

답변

0

getInfoContents()에서 반환 된보기를 업데이트하려고 시도 했으므로 라이브보기가 아닌 것처럼 작동합니다 (this 참조). 호출 작동 할 수

뭔가 :

status.invalidate(); 
+0

status.invalidate()가 작동하지 않지만 사용자의 anwser를 올바른 것으로 표시했습니다. 내보기에 대해 설명하지 "라이브" – tensa11

1

이 안드로이드 메시지를 사용하여 OS 인 사실에서왔다. 따라서 메시지를 읽고 메시지의 순서에 따라 작업을 수행하는 OS의 일부가 있습니다. 텍스트 뷰의 텍스트를 새로 고침

이 방법에 의해 수행됩니다 : 당신의 setText() 코드를 수행 할 때 메시지를 준비하고 ""가 텍스트 뷰를 새로 고침하십시오 "그에게하는 OS로 보내

우리는 할 수 있습니다. 10 글자를 친구에게 보낼 수 있다고 말하는 설명을 간소화하지만 동시에 10 글자를 보내더라도 같은 시간에 도착하지 않을 수도 있습니다 ...

그리고 여기에 해당합니다 : for 안드로이드, 사용자 인터페이스에 대한 메시지는 "우선 순위"메시지가 아니지만 응용 프로그램 코드는 우선 순위가 높음 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); 

: 안드로이드는 "새로 고침의 setText"를 읽을

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

이 과정을 "느린"하는 한 정도로되지 않은 100 밀리 초에 의해 당신이 코드의 실행을 지연하지만 한 정도로되는 것 메시지.

0

는이 작업을 수행해야합니다

status.setText("Some text"); 
    status.invalidate(); 
    status.requestLayout(); 
관련 문제