2013-09-06 3 views
0

Im пытается установить гравитацию = «снизу» на LinearLayout, поэтому его дети. Представления стека внизу.Вертикальный LinearLayout гравитация не работает, как показано на рисунке

Проблема в том, что когда я проверяю его на Eclipse, это кажется прекрасным, но когда я запускаю AVD, он не работает. Это просто работает, как если бы гравитация была установлена ​​на вершину.

Вот мой код:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:padding="16dp" > 

<com.pepotegames.spotthedifferences.SquareImageView 
    android:id="@+id/picture" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:scaleType="centerCrop" /> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:gravity="bottom" 
    android:weightSum="4" > 

    <ImageView 
     android:id="@+id/stars" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:src="@drawable/stars" 
     android:background="#55000000" 
     android:adjustViewBounds="true" /> 

</LinearLayout> 

Вот как это выглядит в Eclipse, и как это должно работать:

http://i.imgur.com/ddHJK5S.png

EDIT: BTW мои SquareImageView его просто расширенный ImageView. Проблема не имеет к этому никакого отношения, я уже тестировал один и тот же макет с обычным ImageView и теми же результатами.

В случае, если вы хотите проверить это, вот это:

public class SquareImageView extends ImageView { 
public SquareImageView(Context context) { 
    super(context); 
} 

public SquareImageView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public SquareImageView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    setMeasuredDimension(getMeasuredWidth(), getMeasuredWidth()); 
} 
} 
+0

является FrameLayout обязательно для макета, если сейчас вы должны переключиться на RelativeLayout для лучшего выравнивания. –

+0

На самом деле это так, потому что мне нужны звезды для рендеринга над изображением. Здесь вы можете увидеть пример окончательного вида: http://puu.sh/4kKq9.jpg Этот макет используется внутри GridView –

ответ

0

Я не мог решить таким образом, это то, что я закончил делать

<com.pepotegames.spotthedifferences.SquareFrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:padding="7dp" > 

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@drawable/bg_container_rounded" > 

    <com.pepotegames.spotthedifferences.SquareImageView 
     android:id="@+id/picture" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:scaleType="centerCrop" /> 

    <com.pepotegames.spotthedifferences.QuarterImageView 
     android:id="@+id/stars" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_gravity="bottom" 
     android:background="@color/trans_mask_mid" /> 

</FrameLayout> 

Я сделал квадратное расположение корня, то я использовал другой пользовательский вид, расширенный ImageView, который получает уменьшенный до четверти своего родителя высоты

public class QuarterImageView extends ImageView { 
public QuarterImageView(Context context) { 
    super(context); 
} 

public QuarterImageView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public QuarterImageView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec,heightMeasureSpec); 
    setMeasuredDimension(getMeasuredWidth(),getMeasuredHeight()/4); 
}} 
0
  • пытаются использовать относительный макет вместо линейной компоновки

    <RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:weightSum="4" > 
    
    <ImageView 
        android:id="@+id/stars" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_alignParentBottom="true" 
        android:adjustViewBounds="true" 
        android:background="#55000000" 
        android:src="@drawable/ic_launcher" /></RelativeLayout> 
    
+0

Я думаю, что вы не можете использовать вес внутри RelativeLayout. Eclipse указывает «Недопустимый параметр макета в RelativeLayout: layout_weight. Я мог бы использовать RelativeLayout, если бы не пытался, чтобы звезды занимали 1/4 изображения, но это не тот случай. –

Смежные вопросы