2013-06-08 2 views
1

조언이 필요합니다 ...이보기의 크기에 따라 레이아웃이 다른 맞춤보기 그룹을 만들고 싶습니다.Android : 크기에 따라 맞춤 레이아웃을 만드는 방법

예 :

두보기 :

  • 보기 A : 수직의 LinearLayout을 지향하고 200 연장 내 사용자 정의보기 : 아이 뷰 적어도 50dp 높이
  • 보기 B입니다 dp 고도

내가 원하는 것 :

  1. 내가보기 B에 2보기 A를 삽입 할 때 :
    • 를 내가 100 (DP)이 두 뷰 A를 스트레칭합니다. 따라서 B는 2 명의 자녀가있는 일반적인 선형 레이아웃이됩니다.
  2. 내가보기 B에 5 조회수 A를 삽입 :
    • 내가 B.에이 스크롤 뷰 안에있을 것입니다 모든 5 뷰를 스크롤 뷰를 추가 할 그들이 50 DP 높이가 될 것이다.

보통, 나는 생성자 내 사용자 정의보기에 뷰를 추가 할 수 있습니다. 그러나 나는 여기에서 그것을 할 수 없다. 왜냐하면 나는 생성자에서 B의 높이를 알지 못하기 때문이다. 나는 단지 A의 높이만 알고 있습니다. 그래서 콜백 메서드를 사용해야하는 조언을 해주십시오. B 높이가 알려지면이 높이에 따라 모든 자식 뷰를 추가 할 수 있습니다.

가 대단히 감사합니다

아니면 다른 방법을 알고 있다면 ... 알려 주시기 바랍니다 ...!

+1

B 높이가 const 인 경우 아동 A의 일반적인 높이를 확인하십시오. 집계 된 높이가 더 많으면 200 (또는 4+ 뷰)가됩니다. B에서 ScrollView를 만들고 A 뷰를 밀어 넣은 다음 ScrollView의 레이아웃 매개 변수를 프로그래밍 방식으로 match_parent로 설정합니다. 그렇지 않으면 (A가 단지 1-3을 보는 경우) - layout_weight 매개 변수를 1로 설정하십시오. – Archinamon

+0

그것이 내가 원하는 것입니다. 그러나 값 200이 언제 알려 지는지, 즉 어떤 메소드를 오버라이드할지 모릅니다. B의 높이는 const 높이가 아니며 화면 크기에 따라 다릅니다. 내가 쓴대로 :이 값은 생성자에서 알 수 없습니다 ... 답장을 보내 주셔서 감사합니다 ... – Bhiefer

답변

2

모든 뷰를 스크롤 뷰에있는 세로 선형 레이아웃에 넣는 것이 좋습니다. 또는 레이아웃 및 scrollView 대신 단일 listView를 사용하는 것이 더 좋습니다.

이유는 화면의 사용 가능한 공간과보기의 크기에 따라 필요한 경우 자동으로 스크롤을 처리하기 때문입니다.

+0

불행히도, 이것은 바람직한 동작이 아닙니다. scrollview가 필요하지 않을 때 하위 뷰를 늘리고 싶습니다. 내부 뷰의 집계 크기가 작을 때 가중치를 사용하고 크기가 클 때 스크롤보기를 사용합니다. 그리고 나는 listview 나 간단한 scrollview로 어떻게 그것이 가능한지 모른다. 그리고 btw.내 레이아웃보다 조금 더 복잡한 레이아웃이 될 것입니다. 그것은 여러 열이있는 테이블 레이아웃이 될 것입니다. 그래서 listview를 사용하고 싶지 않습니다. – Bhiefer

+0

하지만 안드로이드는 많은 화면 해상도와 밀도를 지원합니다. 필요한 레이아웃을 사용할 수 있도록 다른 구성을 처리하는 방법을 생각해야합니다. 가중치를 사용하는 경우에도보기에 내용이 표시 될 충분한 공간이 있는지 확인해야합니다. 어떻게 할거 니? –

+0

나는 그것을 알고 있습니다 ... 이것이 제가이 커스텀 레이아웃을 사용하고자하는 이유입니다. 화면/해상도가 충분히 크거나 장치 dpi를 낮은 값으로 변경하면 내용이 작아서 전체 화면이 아닌 경우 내용이 작아 보이지만 (화면의 일부만 차지함) ... 원하는대로 그것을 사용하여 스트레칭. 반면에 화면이 작 으면 scrollview를 사용해야합니다. 그리고이 두 상황을 어떻게 구분할 것입니까? 그게 내가 여기서 물어 보는 것입니다 :) getHeight() 메서드로 높이를 얻고 싶고이 값에 따라 레이아웃을 선택하십시오. 하지만 난 어떤 View 메서드를 모르겠다. – Bhiefer

0

이 코드를 사용하면 기본 레이아웃의 실제 높이를 얻을 수 있습니다. 그런 다음 if-else 또는 switch-case 블록에서 해당 높이를 사용하여 필요한 조건을 확인할 수 있습니다.

public int getLayoutSize() { 
// Get the layout id 
    final LinearLayout root = (LinearLayout) findViewById(R.id.mainroot); 
    final AtomicInteger layoutHeight = new AtomicInteger(); 

    root.post(new Runnable() { 
    public void run() { 
     Rect rect = new Rect(); 
     Window win = getWindow(); // Get the Window 
       win.getDecorView().getWindowVisibleDisplayFrame(rect); 

       // Get the height of Status Bar 
       int statusBarHeight = rect.top; 

       // Get the height occupied by the decoration contents 
       int contentViewTop = win.findViewById(Window.ID_ANDROID_CONTENT).getTop(); 

       // Calculate titleBarHeight by deducting statusBarHeight from contentViewTop 
       int titleBarHeight = contentViewTop - statusBarHeight; 
       Log.i("MY", "titleHeight = " + titleBarHeight + " statusHeight = " + statusBarHeight + " contentViewTop = " + contentViewTop); 

       // By now we got the height of titleBar & statusBar 
       // Now lets get the screen size 
       DisplayMetrics metrics = new DisplayMetrics(); 
       getWindowManager().getDefaultDisplay().getMetrics(metrics); 
       int screenHeight = metrics.heightPixels; 
       int screenWidth = metrics.widthPixels; 
       Log.i("MY", "Actual Screen Height = " + screenHeight + " Width = " + screenWidth); 

       // Now calculate the height that our layout can be set 
       // If you know that your application doesn't have statusBar added, then don't add here also. Same applies to application bar also 
       layoutHeight.set(screenHeight - (titleBarHeight + statusBarHeight)); 
       Log.i("MY", "Layout Height = " + layoutHeight); 

      // Lastly, set the height of the layout  
      FrameLayout.LayoutParams rootParams = (FrameLayout.LayoutParams)root.getLayoutParams(); 
      rootParams.height = layoutHeight.get(); 
      root.setLayoutParams(rootParams); 
     } 
    }); 

return layoutHeight.get(); 
} 
관련 문제