我想创建一个LinearLayout
,其中包含两个TextView
:标签和数据占位符。由于数据可以任意长,我想将第二个TextView
的大小限制为一行,如果数据不适合视图,则自动水平滚动。
此外,我希望在运行时计算第二个TextView
的宽度,以便它可以填充父容器的70%并与其右侧对齐。
到目前为止,这就是我所拥有的:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:id="@+id/ll_denunciante" >
<TextView
android:id="@+id/txtv_label_denunciante"
android:layout_width="0px"
android:layout_height="wrap_content"
android:layout_weight="0.3"
android:gravity="left"
android:text="@string/txtv_label_denunciante" />
<TextView
android:id="@+id/txtv_data_denunciante"
android:layout_width="0px"
android:layout_height="wrap_content"
android:layout_weight="0.7"
android:gravity="right"
android:maxLines="1"
android:ellipsize="marquee"
android:scrollHorizontally="true"
android:marqueeRepeatLimit="marquee_forever"
android:text="@string/txtv_no_data" />
</LinearLayout>
但文字只是被切断了。它不是椭圆化的,自动滚动不起作用。 添加
android:focusable="true"
android:focusableInTouchMode="true"
无法解决问题。
this问题的答案也无济于事。
如果使用较少的代码完成所需的结果,或者使用RelativeLayout
无法使用LinearLayout
,我很乐意接受使用TextView
的答案。
修改
将第二个<TextView
android:id="@+id/txtv_data_denunciante"
android:layout_width="0px"
android:layout_height="wrap_content"
android:layout_weight="0.7"
android:ellipsize="marquee"
android:gravity="right"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:text="@string/txtv_no_data" />
更改为:
txtvDataDenunciante.setSelected(true);
并添加
{{1}}
修好了。
答案 0 :(得分:1)
我尝试过这种方式并且有效。将第二个TextView替换为下面的一个。以下是所附屏幕截图中的结果。
<TextView
android:id="@+id/txtv_data_denunciante"
android:layout_width="0px"
android:layout_height="wrap_content"
android:layout_weight="0.7"
android:ellipsize="marquee"
android:gravity="right"
android:focusable="true"
android:focusableInTouchMode="true"
android:scrollHorizontally="true"
android:marqueeRepeatLimit="marquee_forever"
android:maxLines="1"
android:singleLine="true"
android:freezesText="true"
android:text="@string/txtv_no_data"
android:selectAllOnFocus="true" />
编辑:如果XML属性不适用于您的情况,则问题在于关注焦点。在某些情况下,父母布局或其他一些人将注意力集中在他们自己身上。因此,您需要在RunTime上自己获得特定View元素的焦点。为此,您可以将TextView设置为选中。
yourTextView.setSelected(true);
答案 1 :(得分:0)
如果它在ListView中,问题是TextView无法获得焦点。 更改TextView以使用此文件:
public class AutoScrollingTextView extends TextView {
public AutoScrollingTextView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}
public AutoScrollingTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public AutoScrollingTextView(Context context) {
super(context);
}
@Override
protected void onFocusChanged(boolean focused, int direction,
Rect previouslyFocusedRect) {
if (focused) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
}
}
@Override
public void onWindowFocusChanged(boolean focused) {
if (focused) {
super.onWindowFocusChanged(focused);
}
}
@Override
public boolean isFocused() {
return true;
}
}
使用以下参数:
android:scrollHorizontally="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"