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



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

  • RelativeLayout layout_height可以大于listPreferredItemHeight
  • 该图像是一个复选框
  • 有三个textview
  • 顶部和中间的textview可以有可见度设置为GONE

我想要的是:如果_label消失了,那么_message和_definition应该在布局中均匀加权。如果_label和_message没有了,则_definition应该居中。我尝试了几种高度,宽度,重力,layout_gravity的变化,我甚至试图用线性布局来解决这个问题(既作为整个布局,也只是包含垂直文本)。我能得到这个工作的唯一方法是,如果我设置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>

适配器getView代码使用xml从祝福的答案

@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;
}

Layout_gravity只能在线性布局中工作。当你想要你所有的textviews采取甚至高度,把它们在一个垂直方向的线性布局,并给予权重为1为所有的textviews。现在它们的高度都相等了

当你需要隐藏textview,只需设置他们的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;
}

最新更新