在单行为true的textview上调用setmovementmethod时,文本不可见

时间:2015-04-17 08:49:20

标签: android textview

我的应用中有这个textView,singleLine设置为true

当我在其上调用setMovementMethod(LinkMovementMethod.getInstance())并设置一些阿拉伯语或乌尔都语文本时,文字不可见。虽然textview是可见的(我已经通过在其背景上应用颜色来检查。

我尝试使用maxlines=1而不是修复可见性问题的单行,但是我的文本很长,textview中的文本变得可滚动而不是椭圆化。

我做错了吗?有没有办法在maxlines=1

的情况下使文本椭圆化而不是滚动

感谢任何帮助。

编辑1.添加示例代码:

JAVA

package com.example.invisibletextsample;

import android.app.Activity;
import android.os.Bundle;
import android.text.method.LinkMovementMethod;
import android.text.util.Linkify;
import android.widget.TextView;


public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView mTextView = (TextView)findViewById(R.id.tv1);
        String mString = "9876543210 دمية النص";
        mTextView.setText(mString);
        Linkify.addLinks(mTextView, Linkify.PHONE_NUMBERS);
        mTextView.setMovementMethod(LinkMovementMethod.getInstance());
    }
}

XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.invisibletextsample.MainActivity" >

    <TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="25sp"
        android:background="@android:color/holo_red_light"
        android:singleLine="true"
        android:ellipsize="end" />

</RelativeLayout>

4 个答案:

答案 0 :(得分:1)

您限制TextView在使用

约束时可以采用的最大行数
singleLine = "true" ==> text should be only on line long

maxlines ="1" ==> maximum lines taken by TextView should be only 1 line

从xml中删除此行,您的文字应该显示得很好。并尝试将textview置于ScrollView下,如果测试真的很大,您可以将其滚动

答案 1 :(得分:0)

添加属性android:scrollBars。试试吧。

android:maxLines="3"
android:scrollBars="vertical"

答案 2 :(得分:0)

我遇到同样的问题,我认为LinkMovementMethod与singleLine冲突。如果同时为文本视图设置LinkMovementMethod和singleLine = true,则在触摸文本之前不会显示该文本。

最后,我用一种黑客的方式。在目标textview下设置另一个textview,设置singleLine = true,显示相同的文本,但不要设置setMovementMethod。为目标textview设置onTouchListener,触摸后,将显示目标textview文本,然后隐藏此textview。

示例代码:

<强> XML

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp">

        <TextView
            android:id="@+id/tv_content_hacky"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:ellipsize="end"
            android:gravity="center_horizontal"
            android:paddingLeft="8dp"
            android:paddingRight="8dp"
            android:text="TestContent"/>

        <TextView
            android:id="@+id/tv_content"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:ellipsize="end"
            android:gravity="center_horizontal"
            android:paddingLeft="8dp"
            android:paddingRight="8dp"
            android:text="TestContent"/>

    </RelativeLayout>

Java代码

    tvContent.setMovementMethod(LinkMovementMethod.getInstance());

    tvContent.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            tvContentHacky.setVisibility(View.GONE);
            return false;
        }
    });

答案 3 :(得分:0)

我遇到了同样的问题。

所以我不需要 setMovementMethod

扩展TextView,接管MovementMethod。

public class EllipsizeSpannableTextView extends TextView {

private Spannable spannable;

public EllipsizeSpannableTextView(Context context) {
    super(context);
}

public EllipsizeSpannableTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public EllipsizeSpannableTextView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

@Override
public void setText(CharSequence text, BufferType type) {
    super.setText(text, type);
    if (text instanceof Spannable) {
        spannable = (Spannable) text;
    }
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (spannable == null) {
        return super.onTouchEvent(event);
    }
    int action = event.getAction();

    if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) {
        int x = (int) event.getX();
        int y = (int) event.getY();

        x -= getTotalPaddingLeft();
        y -= getTotalPaddingTop();

        x += getScrollX();
        y += getScrollY();

        Layout layout = getLayout();
        int line = layout.getLineForVertical(y);
        int off = layout.getOffsetForHorizontal(line, x);

        ClickableSpan[] links = spannable.getSpans(off, off, ClickableSpan.class);

        if (links.length != 0) {
            ClickableSpan link = links[0];
            if (action == MotionEvent.ACTION_UP) {
                link.onClick(this);
            } else if (action == MotionEvent.ACTION_DOWN) {
                Selection.setSelection(spannable, spannable.getSpanStart(link),
                    spannable.getSpanEnd(link));
            }
            return true;
        } else {
            Selection.removeSelection(spannable);
        }
    }
    return super.onTouchEvent(event);
}}