草庐IT

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

coder 2024-06-30 原文

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

  • RelativeLayout layout_height 可能大于 listPreferredItemHeight
  • 图像是一个复选框
  • 有3个TextView
  • 顶部和中间的 TextView 可以将可见性设置为 GONE

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

<?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>

Adapter getView 代码使用 blessenm 的回答中的 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 只能在线性布局中使用。当您希望所有 TextView 的高度相同时,将它们放在垂直方向的线性布局中,并将所有 TextView 的权重设置为 1。所以现在所有这些都将处于相同的高度。

当您需要隐藏 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>

获取 View 方法

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

关于android - 当一个或多个可见性设置为 GONE 时,在 RelativeLayout 中垂直居中 TextView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7655557/

有关android - 当一个或多个可见性设置为 GONE 时,在 RelativeLayout 中垂直居中 TextView的更多相关文章

  1. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  2. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  3. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  4. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  5. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  6. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  7. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  8. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

  9. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

  10. ruby - 即时确定方法的可见性 - 2

    我正在编写一个方法,它将在一个类中定义一个实例方法;类似于attr_accessor:classFoocustom_method(:foo)end我通过将custom_method函数添加到Module模块并使用define_method定义方法来实现它,效果很好。但我无法弄清楚如何考虑类(class)的可见性属性。例如,在下面的类中classFoocustom_method(:foo)privatecustom_method(:bar)end第一个生成的方法(foo)必须是公共(public)的,第二个(bar)必须是私有(private)的。我怎么做?或者,如何找到调用我的cust

随机推荐