在ViewPager中自动滚动TextView

时间:2014-08-31 16:47:06

标签: android textview

我想创建一个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}}

修好了。

2 个答案:

答案 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"

如下所示:https://stackoverflow.com/a/9707140/1318795