我的应用中有这个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>
答案 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);
}}