2014-07-18 2 views
4

다음과 같은 간단한 레이아웃을 고려하십시오.android : gravity android 사이의 충돌 해결 : layout_gravity

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="bottom" 
    android:orientation="vertical" > 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:layout_gravity="top" > 

     <Button 
      android:id="@+id/button1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Button" /> 

    </LinearLayout> 

</LinearLayout> 

외부LinearLayout은 그것의 아이들이 "바닥에 떨어"하고 싶은 것을 의미

android:gravity="bottom" 

을 가지고 있음을 지정합니다.

내측LinearLayout

android:layout_gravity="top" 

그것이 자체가 포위 레이아웃의 상단에 배치되도록 원하는 것을 의미 함을 지정. (android:layout_gravity을 지정하려면 분명히 XML 파일을 직접 편집해야합니다. 이클립스에서 그 속성에 도달하는 방법이없는 것 같습니다.)

어떻게 안드로이드는 이러한 충돌을 해결할 수 있습니까? 위의 예에서는 gravity 특성이 layout_gravity 특성보다 우선 함을 나타냅니다. 그것은 갈등이 일반적으로 어떻게 해결 되는가? LinearLayoutlayoutVertical() 방법을 살펴 복용

답변

1

, LinearLayout 자체의 gravity는 아이들이을 배치하는 방법을 결정하는 것이다.

각 어린이의 layout_gravity은 "다른 방향으로"(즉, 왼쪽 - 오른쪽) 배치에만 사용됩니다.

첫째 :

final int majorGravity = mGravity & Gravity.VERTICAL_GRAVITY_MASK; 
    final int minorGravity = mGravity & Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK; 

    switch (majorGravity) { 
     case Gravity.BOTTOM: 
      childTop = ... 
      break; 

     // ... same for CENTER_VERTICAL and TOP 
    } 

그런 다음 각 자녀 : layoutHorizontal()에 대한

for (int i = 0; i < count; i++) { 
     final View child = getVirtualChildAt(i); 

     final LinearLayout.LayoutParams lp = 
       (LinearLayout.LayoutParams) child.getLayoutParams(); 

     int gravity = lp.gravity; 
     if (gravity < 0) { 
      gravity = minorGravity; 
     } 

     final int layoutDirection = getLayoutDirection(); 
     final int absoluteGravity = Gravity.getAbsoluteGravity(gravity, layoutDirection); 
     switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) { 
      case Gravity.CENTER_HORIZONTAL: 
       childLeft = ... 
       break; 

      // ... same for RIGHT and LEFT 

과 동등.

또한 단지 의견이지만 android:layout_gravity일 수 있습니다.은 Java 코드에서 액세스 할 수 있습니다. LinearLayout.LayoutParams 클래스에있는 gravity field입니다 (하위보기의 LayoutParams으로 설정 됨).