具有拉伸复合可绘制对象的固定宽度 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的主要内容,如果未能解决你的问题,请参考以下文章
如何使用复合可绘制对象而不是包含 ImageView 和 TextView 的 LinearLayout