2012-10-13 5 views
7

자주 변경되는 값을 표시하는 표를 만들고 있습니다. 이 때문에 내용을 변경하면 자동 렌더링되는 TextView를 사용하고 있습니다 (Auto Scale TextView Text to Fit within Bounds). 크기 조정이 발생하지만, 내가 원하는대로 내가 HierarchyViewer 레이아웃 표시와 활동을 검토 할 때보기가 제대로크기 조정 후보기 구성

layout after resize

건이며, 레이아웃하지 않습니다.

layout after hierarchyviewer

내 생각 엔 HierarchyViewer가 호출 requestLayout() 또는보기에() 무효화,하지만 성공하지 것을 시도한 것입니다. 이 코드는 주 활동에서 영향을주지 않고 호출됩니다.

new Handler().postDelayed(new Runnable() {    
      @Override 
      public void run() { 
       getWindow().getDecorView().requestLayout(); 
       getWindow().getDecorView().invalidate(); 
      } 
      }, 5000); 

크기를 조정 한 후에도보기가 무효화되었습니다.

TextView의 중력이 가운데로 설정되어 있고 크기가 조정되지 않으면 괜찮아 보입니다.

모든 힌트를 환영합니다. 미리 감사드립니다.

+0

데코보기가 아닌 부모보기에서 레이아웃을 요청 했습니까? – DeeV

+0

장식보기가보기 트리의 부모 노드가 아닌가? 뷰에서 레이아웃을 요청하면 모든 자식이 레이아웃을 요청하게됩니다. 어쨌든, 나는 많은 것을 시도한 것처럼 그것을 시도했다고 말하고 싶지만, 나는 당신의 제안을 시도 할 때 다시보고 할 것이다. requestLayout 문서를 view.View에 인용하면 "이 뷰의 레이아웃을 무효화 한 무언가가 변경되면이를 호출합니다. 그러면 뷰 트리의 레이아웃 단계가 예약됩니다." – Maragues

+0

하지만 코드에 문제가있는 것은 아닙니다. requestLayout() 레이아웃은 부모 뷰와 그 자식이지만, 앱에서 직접 제어하는 ​​뷰에서만 호출 했으므로 이는 단순한 생각입니다. – DeeV

답변

2

는 내가 텍스트 뷰의 부모 중 한 onLayout 무시하고 생성자에서 생성 된 처리기를 사용하여 그것을 해결

public class CellView extends LinearLayout{ 
    public CellView(Context context) { 
    super(context); 

    mHandler = new Handler(); 

    View.inflate(context, R.layout.cellview, this); 
    } 

@Override 
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
    if(changed){ 
     mHandler.post(new Runnable() {   
     @Override 
     public void run() { 
      requestLayout(); 
     } 
     }); 
    } 

    super.onLayout(changed, left, top, right, bottom); 
    } 

가 작동하지 않았다 그래도 나는, 텍스트 뷰의 onLayout 내부 requestLayout를 호출 시도했다, 난 왜 그런지 모르겠다. Observer를 통해 값이 업데이트 되었기 때문에 발생할 수 있지만 UI 스레드에서 onTextChanged 수신기가 발생해야합니다. 다른 사람에게 제공되기를 바랍니다.

0

here과 같이 runOnUiThread을 사용하여 UI 스레드에서 타이머 코드를 실행해야 할 수 있습니다.

+0

그는 UI 스레드에서 Handler를 생성한다고 가정하고 UI 스레드에서 실행 중입니다. – DeeV

+0

나중에 확인해 보겠습니다 (지금 당장은 작동하지 않음). UI 스레드 외부에서 해당 코드를 실행하면 예외가 발생할 것이라고 말하고 싶지만 UI 스레드 외부에서 Handler를 만들 수 있습니다. – Maragues

2

way에서이 작동하는 방식은보기에서 호출 될 때 자체적으로 레이아웃 통과와 모든 자식을 예약하는 것입니다. 보기가 이동하거나 크기가 조정될 때마다 여백, 여백 또는 내용이 변경 될 때마다 바람직합니다.

getDecorView()의 설명서는 정확히 무엇이 제공되는지에 대해서는 명확하지 않습니다. 그러나, website에 대한 설명서 당 : 다양한 윈도우 특성 처음으로이 함수를 호출 "에 잠금이"된 setContentView (보기, android.view.ViewGroup.LayoutParams)에 설명 된대로 것을

참고.

이렇게하면 getDecorView()이 검색하는보기에 특별한 것이 있다고 생각합니다. 아마도 당신은 requestLayout()을 통과 할 때보기의 레이아웃을 영구적으로 변경하지 않을 것입니다.

This is apparently the proper way to get the root view of your entire activity.

그러나, 효율성을 이유로, 나는 당신이 가능하게 할 수있는 가장 낮은 아이 requestLayout()를 호출하는 것이 좋습니다. 전에 말했듯이, 뷰의 레이아웃 패스를 스케쥴하고 그것은 자식입니다. 최상위보기에서 레이아웃 패스를 수행하는 경우 장소에 남아있는보기가 포함 된 모든 것을 다시 작성해야합니다.

+0

아이디어 (Narcís와 DeeV) 덕분에, requestLayout에 대한 좋은 연구와 시간에 감사드립니다. tho는 제 특정 문제를 해결할 때 제가 선택한 대답으로 유지할 것입니다. 미래에 사용자가 귀하의 투표에 투표한다면, 나는 당신에게 투표 할 것입니다. – Maragues