2012-12-02 3 views
1

레이아웃 xml에 GONE으로 설정된 LinearLayout (A)이 있습니다. 내가 원하는 것은 버튼 (B)을 클릭하면 LinearLayout (A)가 VISIBLE으로 설정되고 부모 레이아웃의 높이를 업데이트하는 것입니다. LinearLayout (A)를 가시로 설정하고 높이를 가져 왔지만 부모 레이아웃의 높이를 직접 업데이트하지 못했습니다. 현재 코드의 문제는 부모 레이아웃이 다른 UI 이벤트가 트리거 된 후에 만 ​​자체 레이아웃을 업데이트한다는 것입니다 (예 : 회 전자 드롭 다운 메뉴가 열리거나 소프트 키보드가 표시됨 등). 내가 정말로 원하는 것은 부모 레이아웃이 버튼 (B)이 클릭 된 직후에 업데이트된다는 것입니다.다른 이벤트가 트리거 될 때까지 레이아웃 높이가 업데이트되지 않습니다.

여기 내 코드입니다.

@Override 
public void onClick(View v) { 
    if(v==buttonB) { 
     ShowLinearLayoutA(); 
    } 
} 

private ViewTreeObserver vto; 

private void ShowLinearLayoutA() { 
    LinearLayoutA.setVisibility(View.VISIBLE); 
    if (vto == null) { 
     vto = LinearLayoutA.getViewTreeObserver(); 
     vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       ParentLayout.getLayoutParams().height=LinearLayoutA.getHeight(); 
       ParentLayout.invalidate(); 
      } 
     }); 
    } 
} 

내가 뭘 잘못 했니?

실례합니다. 미리 감사드립니다.

편집 1 : 나는 runOnUiThread를 사용하여 시도하지만

작동하지 않습니다 내 편집 코드

private void ShowLinearLayoutA() { 
    LinearLayoutA.setVisibility(View.VISIBLE); 
    if (vto == null) { 
     vto = LinearLayoutA.getViewTreeObserver(); 
     vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       ParentLayout.getLayoutParams().height=LinearLayoutA.getHeight(); 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         ParentLayout.invalidate(); 
        } 
       }); 
      } 
     }); 
    } 
} 

편집 2 :

나는이 방법을 시도하고 포기했다. 대신 애니메이션을 사용하여 작동 시켰습니다. 감사합니다 :)

답변

0

나는이 방법을 시도했다. 대신 애니메이션을 사용하여 작동 시켰습니다. 고마워요 :)

+0

어떤 애니메이션을 사용했는데 동일한 문제가 있습니다. 너비와 높이를 업데이트하고 싶습니다. 알려주십시오. – Ravi

+0

그 애니메이션을 사용하는 방법을 알려주세요. webview 매개 변수를 seeting하고 있지만 높이 매개 변수가 업데이트되지 않습니다. – Ravi

+0

문제를 이해할 수 없지만 애니메이션을 확장하는 클래스를 만들고 해당 클래스에서 뷰의 높이/너비를 변경하십시오. 어쩌면 새로운 질문을 만들어야 자신을 분명히하고 다른 사람들로부터 더 나은 답변을 얻을 수 있습니다. – JrL

0

전화

LinearLayoutA.invalidate() 
+1

답변 해 주셔서 감사합니다. 나는 그것을 시도했지만 작동하지 않습니다. – JrL

1

당신이 잘못 스레드에서 UI 작업을 수행하고 있습니다. .., ..와 같은 UiThread에서 UI 작업을 수행하십시오.

private void ShowLinearLayoutA() { 
    YourActivity.this.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      LinearLayoutA.setVisibility(View.VISIBLE); 
     } 
    }); 

if (vto == null) { 
    vto = LinearLayoutA.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      YourActivity.this.runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        ParentLayout.getLayoutParams().height=LinearLayoutA.getHeight(); 
        ParentLayout.invalidate(); 
       } 
      }); 
     } 
    }); 
} 
} 
+0

답변 해 주셔서 감사합니다. 나는 그것을 시도했지만 작동하지 않습니다. 내 편집을 참조하십시오 :) – JrL

+0

runOnUI로 YourActivity.this를 추가하십시오. 내 게시물을 편집했습니다. 토포가있는 나의 오래된 게시물에 대해 죄송합니다 – user1690588

+0

고마워요. runOnUiThread 앞에 MyActivity.this를 추가하려고했지만 여전히 작동하지 않습니다. 나는 심지어 runOnUiThread 내부의 모든 레이아웃을 무효화하려고 시도했다. – JrL

0

나는 이것이 정말로 오래된 질문이지만 나는 그것이 대답이없는 것 같아요. 나는 똑같은 문제를 겪었고 요점은 런타임에 변경되기 전에 높이를 업데이트하려고 시도한다는 것입니다. 간단한 지연된 작업이 해결책 일 수 있습니다.

_layout.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      _layout.setBackgroundDrawable(backgroundImage); 
     } 
    }, 100); // delayed for 0.1 sec 
+0

감사합니다. 나를 위해 작동 추가 listView.requestLayout(); (나는 목록의 레이아웃 높이를 변경해야한다). – DmitryKanunnikoff

관련 문제