安卓用户界面:智能居中?

4

我有一个UI元素(单行文本),我想要它水平居中于整个设备,除非/直到它与给定视图组/布局中的其他UI元素发生碰撞。此时,我希望它在剩余空间中居中或尽可能靠近整体居中而不发生碰撞。[当最终没有足够的空间时,我想使用省略号。]

有没有办法仅使用标准Android布局来实现这一点?

目前,我通过代码调整布局约束来实现这一点,当视图组的宽度更改、文本更改或相关UI元素变得可见/不可见时。它可以正常工作,但我不能不去想,有些布局应该只是为了方便我做这件事。


为您的问题添加一个模拟图 - Pooya
“除非/直到它与给定视图组/布局中的其他UI元素发生碰撞” - 这不应该在编译时就可以知道吗?如果不能,因为那些其他UI元素的大小或其他方面会发生变化...我不确定是否有一种好的方法来实现您所需的规则,除了使用自定义的ViewGroup - CommonsWare
@commonsware 我认为 @rupps 的答案可以奏效,只需要将 Button 替换成 ViewGroup 并在运行时向该子 ViewGroup 插入更多的 View。你有什么想法? - kishu27
@CommonsWare 编译时无法确定文本大小长度(类似于浏览器中的网页标题)。 - Jess Holle
@Pooya 我们不妨通过一个例子来澄清。如果我只有一个文本视图和一个按钮,而按钮占据了屏幕宽度的33%(包括填充),并且位于视图的最右侧,则我希望文本相对于整个设备宽度居中 - 除非它(包括其填充)比屏幕的33%更宽,这样就会与按钮发生碰撞。在发生碰撞的情况下,文本可以在剩余的空间中居中(就像加权线性布局一样)。 - Jess Holle
1个回答

0
您可以像这样使用加权水平LinearLayout
<LinearLayout
   android:orientation="horizontal"
   android:layout_width="match_parent"
   android:layout_height="match_parent">

   <TextView
        android:gravity="center_horizontal"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="i am centered"
        android:ellipsize="end"
        />

    <Button
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="another widget"/>
     .
     .
     .
</LinearLayout>

TextViewwidth 0dpweight 1 将使用剩余的水平空间。

您可以向 LinearLayout 添加其他小部件,TextView 将始终占用剩余空间。

例如,如果将 Button 的可见性更改为 GONE,则会看到 TextView 将扩展以使用整个宽度。同样,如果在 LinearLayout 中编程添加新小部件,则 TextView 的可用空间将调整。

您还可以添加 ellipsize 选项来控制当文本不适合 TextView 大小时发生的情况。


这样做是将文本视图居中于按钮宽度计算后剩余的空间中,对吗?我需要的是将其居中于整个总体空间,除非它实际上与按钮发生碰撞。 - Jess Holle
哦...我明白了...那么据我所知,您需要以编程方式完成它。也许 CoordinatorLayout 加上 ButtonTextView 的行为可以帮助解决问题,或者像@Commonsware建议的那样,选用自定义 ViewGroup - rupps
所以我从RelativeLayout和一系列的监听器和重写中得到了我想要的东西。结果并不是一个通用的、可重用的组件,但这没关系。我只是真的希望有一个布局可以处理这样的复杂性而不需要额外的编码。 - Jess Holle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接