具有拉伸复合可绘制对象的固定宽度 TextView

Posted

技术标签:

【中文标题】具有拉伸复合可绘制对象的固定宽度 TextView【英文标题】:Fixed-width TextView with stretched compound drawable 【发布时间】:2013-01-27 21:39:05 【问题描述】:

我正在尝试实现以下布局:固定宽度的 TextView 与其父级的左侧对齐,其中的文本与该 TextView 的右侧对齐(这就是为什么固定宽度,可以用其他方式完成吗?) 其余的父级填充了一个可绘制的(简单的线)。像这样:

这是一个 ListView,包含 2 种类型的行,行的布局非常简单 - 带有 TextView 和 ImageView 的 LinearLayout(如果需要,我可以稍后发布确切的代码)。而且我收到一个警告,它可以用具有复合可绘制对象的单个 TextView 替换。

我完全支持优化,所以我真的很努力地听从了这个建议。不幸的是,我无法得到相同的结果 - 该行要么被限制为 TextView 的宽度,要么文本与 ListItem 的右侧对齐,现在到固定位置。

我错过了什么吗?

编辑: 显然这实际上是不可能的,因为还有一些其他的复杂性(drawable 现在是一个 level-list drawable,它并不总是一条线,有时它有一个不固定的我必须设置的高度)我将保持原样 - 线性布局,包含一个 TextView 和一个 ImageView。

【问题讨论】:

你可以发布布局吗? github.com/aragaer/jtt_android/blob/master/res/layout/… 【参考方案1】:

我不认为你缺少任何东西。 TextView 复合可绘制功能不是非常可定制的,通常不值得您花时间试图让它们看起来正确。一些 lint 警告有点过分和过早。

【讨论】:

【参考方案2】:

lint 所指的优化更适合用于固定大小的图像。在您的情况下,该行必须拉伸屏幕长度的其余部分,因此它不是可以使用具有复合可绘制的文本视图来完成的。这种 lint 警告更多的是一个建议,而不是必须做的事情,并且通过仅检查只有 textview 和 imageview 的线性布局而不是检查图像视图中需要去的内容来检测。如果你已经让它按照你的方式工作,我认为你应该不管它。

【讨论】:

【参考方案3】:

您的视图由此创建 -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/time"
        android:layout_
        android:layout_
        android:layout_gravity="left"
        android:gravity="right"
        android:layout_marginRight="5dp" />

    <ImageView
        android:layout_gravity="center"
        android:id="@+id/border"
        android:layout_
        android:layout_
        android:src="?attr/item_boundary" />

</LinearLayout>

【讨论】:

差别不大 - 我问我怎样才能摆脱整个布局,只留下一个文本视图。 如果您想摆脱整个布局,那么您可以使用 Button 并创建一个可绘制对象作为您的“?attr/item_boundary”并将该可绘制对象设置在按钮中。从此,您可以在一个按钮中设置文本和图像。像这样 - schemas.android.com/apk/res/android" android:layout_ android:layout_ > 不幸的是没有工作 - 宽度仅限于布局宽度,文本完全适合它。如果 drawable 具有固定宽度,它可能会起作用,但在必须拉伸时不起作用。【参考方案4】:

仅使用标准 TextView 无法实现此目的。如果您真的想减少查看次数,您可以创建自定义 TextView 类,将 layoutWidth 设置为 matchParent 并从文本端到右边框画线。但这不值得去做。一些额外的视图不会减慢您的列表。

【讨论】:

【参考方案5】:

我不确定您是否能够实现您真正想要的,但是您可以将您发布的链接中的线性布局更改为如下内容:

    <RelativeLayout
        android:id="@+id/relTrial"
        android:layout_
        android:layout_>
    <TextView 
        android:id="@+id/txtTime"
        android:layout_
        android:layout_
        android:gravity="right"
        android:text="12:45 AM"
        android:layout_alignParentLeft="true"/>
    <LinearLayout 
        android:id="@+id/lnrSep"
        android:layout_
        android:layout_
        android:gravity="bottom"
        android:layout_marginLeft="5dp"  
        android:layout_marginRight="5dp"          
        android:layout_centerVertical="true"
        android:orientation="horizontal"
        android:background="@android:color/darker_gray"
        android:layout_toRightOf="@+id/txtTime"
        android:layout_alignParentRight="true"></LinearLayout>
    </RelativeLayout>

这样时间文本虽然在左侧,但会右对齐,并且该行也可见。

希望对您有所帮助。

【讨论】:

这和我现在用的差不多——LinearLayout被RelativeLayout取代,ImageView被LinearLayout取代。不确定是否有任何显着差异。【参考方案6】:

如果我没听错,你想为列表视图项添加底部边框吗? 试试这个怎么样:

android:drawableBottom="@drawable/line"

【讨论】:

不,该行是单独列表项的一部分 - 连同时间。

以上是关于具有拉伸复合可绘制对象的固定宽度 TextView的主要内容,如果未能解决你的问题,请参考以下文章

使用复合可绘制对象在 TextView 中设置实际文本填充

如何在 TextView 中将文本与其复合可绘制对象对齐?

仅为 TextView 复合可绘制对象实现 onClick

如何使用复合可绘制对象而不是包含 ImageView 和 TextView 的 LinearLayout

如何在xml中设置复合可绘制文本视图的高度和宽度? [关闭]

如何将复合可绘制对象放在文本视图的左上角