当一个或多个可见性设置为GONE时,在RelativeLayout中垂直居中TextView

时间:2011-10-05 00:36:40

标签: android xml layout

我正在尝试创建一个包含4个项目的列表项目布局。它与示例here非常相似,但有一些主要区别:

  • RelativeLayout layout_height可能大于listPreferredItemHeight
  • 图片是CheckBox
  • 有三个TextViews
  • 顶部和中间TextView的可见性设置为GONE

我想要的是:如果_label消失了,那么_message和_definition应该在布局中均匀加权。如果_label和_message消失了,_definition应该居中。我尝试了几种高度,宽度,重力,layout_gravity的变化,我甚至试图用LinearLayout解决这个问题(两者都作为整个布局,只是为了包含垂直文本)。我能让它工作的唯一方法是将layout_height设置为listPreferredItemHeight,但只有两个文本视图适合。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:minHeight="?android:attr/listPreferredItemHeight">
    <CheckBox android:id="@+id/alarm_list_item_able" 
        android:text=""     
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="True"
        android:layout_alignParentLeft="True"
        android:layout_alignParentBottom="True"
        android:layout_centerVertical="True"
        android:focusable="false"
        android:layout_marginRight="6dp"
        android:onClick="onClick"
        />
    <TextView android:id="@+id/alarm_list_item_label" 
        android:text="Label place holder" 
        android:singleLine="True"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/alarm_list_item_able"
        android:layout_alignParentTop="True"
        android:gravity="center_vertical"
        />
    <TextView android:id="@+id/alarm_list_item_message" 
        android:text="Message place holder"
        android:singleLine="True"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"        
        android:layout_below="@id/alarm_list_item_label"
        android:layout_toRightOf="@id/alarm_list_item_able"
        android:layout_alignWithParentIfMissing="true"
        android:gravity="center_vertical"
        />          
    <TextView android:id="@+id/alarm_list_item_location" 
        android:singleLine="True"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"     
        android:layout_below="@id/alarm_list_item_message"
        android:layout_toRightOf="@id/alarm_list_item_able"
        android:layout_marginBottom="5dp"
        android:layout_alignWithParentIfMissing="true"
        android:layout_alignParentRight="true"
        android:paddingBottom="5dp"
        android:text="(0.000, 0.000) 0m"
        android:gravity="center_vertical"
        />
</RelativeLayout>

使用blessenm答案中的xml适配器getView代码

@Override
public View getView(int position, View convertView, ViewGroup parent){
    Log.d(Global.TAG,"Position "+position);
    View newView;
    if (convertView != null ) 
        newView = convertView; 
    else { 
        LayoutInflater layout = LayoutInflater.from(MyActivity.this); 
        newView = layout.inflate(R.layout.alarm_list_item, null); 
    }
    String tmp1 = "Place Holder Label"
    TextView label = (TextView)newView.findViewById(R.id.alarm_list_item_label);
    LayoutParams l = label.getLayoutParams();
    if (tmp1.matches("^\\s*$")){
        label.setLayoutParams(new LinearLayout.LayoutParams(l.width,l.height,0f));
    } else {
        label.setLayoutParams(new LinearLayout.LayoutParams(l.width,l.height,1f));
    }
    label.setText(tmp1)

    String tmp2 = "Place Holder Message"
    TextView message = (TextView)newView.findViewById(R.id.alarm_list_item_message);
    l = message.getLayoutParams();
    if (tmp2.matches("^\\s*$")){
        message.setLayoutParams(new LinearLayout.LayoutParams(l.width,l.height,0f));
    } else {
        message.setLayoutParams(new LinearLayout.LayoutParams(l.width,l.height,1f));
    }
    message.setText(tmp2);

    TextView location = (TextView)newView.findViewById(R.id.alarm_list_item_location);
    location.setText("location");

    return newView;
}

1 个答案:

答案 0 :(得分:3)

Layout_gravity仅适用于线性布局。如果您希望所有文本视图都采用均匀高度,请将它们放在具有垂直方向的线性布局中,并将权重设置为1以用于所有文本视图。所以现在他们所有人都会有同等的高度。

当您需要隐藏文本视图时,只需将其layout_weight设置为0,现在剩余的textview将占用完整的可用空间。如果你给textview gravity =“center”,文本将垂直和水平居中。

编辑:xml和getView方法

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content">
    <CheckBox android:id="@+id/alarm_list_item_able" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:focusable="false" 
        android:layout_marginRight="6dp"
        android:onClick="onClick" 
        android:layout_centerVertical="true"/>
    <LinearLayout android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/alarm_list_item_able" 
        android:orientation="vertical"
        android:layout_centerVertical="true">
        <TextView android:id="@+id/alarm_list_item_label" 
            android:text="Label place holder" 
            android:singleLine="True" 
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"/>
        <TextView android:id="@+id/alarm_list_item_message" 
            android:text="Message place holder"
            android:singleLine="True" 
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content" 
            android:layout_toRightOf="@id/alarm_list_item_able"
            android:layout_below="@id/alarm_list_item_label"/>
        <TextView android:id="@+id/alarm_list_item_location" 
            android:singleLine="True"
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            android:text="(0.000, 0.000) 0m" 
            android:layout_toRightOf="@id/alarm_list_item_able"
            android:layout_below="@id/alarm_list_item_message"/> 
    </LinearLayout> 
</RelativeLayout>

getview方法

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    if(convertView == null){
        convertView = inflater.inflate(R.layout.list, null);
        holder = new ViewHolder();
        holder.label = (TextView)convertView.findViewById(
                R.id.alarm_list_item_label);
        holder.msg   = (TextView)convertView.findViewById(
                R.id.alarm_list_item_message);
        holder.loc   = (TextView)convertView.findViewById(
                R.id.alarm_list_item_location);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    if(holder != null){
        if(data.get(position).mLabel.equals("")){
            LinearLayout.LayoutParams labelLp = new LinearLayout.LayoutParams(
                    LayoutParams.FILL_PARENT,0);
            if(!data.get(position).mMsg.equals("")) {                   
                holder.label.setLayoutParams(labelLp);                  
                holder.msg.setText(data.get(position).mMsg);                    
                holder.loc.setText(data.get(position).mLoc);
            } else {
                holder.label.setLayoutParams(labelLp);                  
                holder.msg.setLayoutParams(labelLp);                    
                holder.loc.setText(data.get(position).mLoc);
            }
        } else {
            holder.label.setText(data.get(position).mLabel);
            holder.msg.setText(data.get(position).mMsg);
            holder.loc.setText(data.get(position).mLoc);
        }
    }
    return convertView;
}