我需要在所需的单词上省略一个可能冗长的句子。例如在句子中:
你好,斯蒂芬霍金,你好吗?斯蒂芬霍金是一个动态文本,可以任意长。我想截断那个词而不是其他词:
Hello Ste ...,你好吗?
Android TextUtils提供了截断的枚举,但我也没有看到我的问题已解决。可以有另一种方式吗?我只知道要被截断的单词的位置。
答案 0 :(得分:2)
试试这个经过测试的工作解决方案
import android.app.Activity;
import android.os.Bundle;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.TextView;
public class MainActivity extends Activity {
TextView txtView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txtView = (TextView) findViewById(R.id.txtView);
txtView.setText("Hello Stephen Hawking, how are you doing ?Are you fine dude?");
doEllipsize(txtView, "Stephen Hawking");
}
public void doEllipsize(final TextView tv, final String word) {
ViewTreeObserver vto = tv.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@SuppressWarnings("deprecation")
@Override
public void onGlobalLayout() {
ViewTreeObserver obs = tv.getViewTreeObserver();
obs.removeGlobalOnLayoutListener(this);
if(tv.getLineCount()>1){
String replacedString = tv.getText().toString().replace(word, word.substring(0, 3)+"...");
tv.setText(replacedString);
}
}
});
}
}
<强>输出:强>
答案 1 :(得分:1)
此代码已全部用于您..
<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:padding="20dp">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello " />
<TextView
android:id="@+id/textView_Name"
android:layout_width="35dp"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/textView2"
android:layout_alignBottom="@+id/textView2"
android:layout_toRightOf="@+id/textView2"
android:ellipsize="end"
android:singleLine="true"
android:text="Stephen Hawking" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/textView_Name"
android:layout_alignBottom="@+id/textView_Name"
android:layout_toRightOf="@+id/textView_Name"
android:text=", " />
<TextView
android:id="@+id/textView_Other"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/textView3"
android:layout_toRightOf="@+id/textView3"
android:text="how are you doing ?" />
</RelativeLayout>
答案 2 :(得分:0)
在这种情况下,两个textview将提供一个简单而有效的解决方案。
1表示“Hello NameHere”,第二个表示其余文本。
可以为第一个指定所需的椭圆形。
最优化,所需输出的开销最小。
答案 3 :(得分:0)
要扩展user2450263的接受答案,这是一个例子。 正如我的评论所示,我使用layout_weight属性强制LinearLayout测量两次。如果没有那部分,如果正文被椭圆化,右边的单词将被推离屏幕。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<!-- Using a weight to force the LL to measure twice -->
<TextView
android:id="@+id/main_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ellipsize="end"
android:singleLine="true" />
<TextView
android:id="@+id/suffix"
android:layout_marginLeft="3dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
如果这对您不起作用,或者您需要在许多不同的地方执行此操作,您还可以创建自定义小部件。
这是你怎么做的。
自定义视图:
public class EllipsizedTextViewWithSuffix extends LinearLayout {
private TextView mainText, suffix;
public EllipsizedTextViewWithSuffix(Context context) {
this(context, null);
}
public EllipsizedTextViewWithSuffix(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public EllipsizedTextViewWithSuffix(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
inflate(context, R.layout.ellipsized_tv_with_suffix, this);
mainText = (TextView) findViewById(R.id.main_text);
suffix = (TextView) findViewById(R.id.suffix);
}
public void setText(String mainText, String suffix) {
this.mainText.setText(mainText);
this.suffix.setText(suffix);
}
}
布局文件( ellipsized_tv_with_suffix.xml ):
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal">
<!-- Using a weight to force the LL to measure twice -->
<TextView
android:id="@+id/main_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ellipsize="end"
android:singleLine="true" />
<TextView
android:id="@+id/suffix"
android:layout_marginLeft="3dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</merge>
然后使用它你只需要将它添加到另一个布局。
当然,请更换正确的包装名称。
<your.package.name.EllipsizedTextViewWithSuffix
android:id="@+id/ellipsized_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />