我有两个这样的文字视图:
=======================
= TextView1 TextView2 =
=======================
我想检测文本视图何时太长,以便它们显示如下:
=======================
= TextView1 =
= TextView2 =
=======================
目前用于较长的文字,它显示如下:
=======================
= TextView1 Text =
= View2 =
=======================
我怎么能这样做,这样当文本很短时,文本视图是并排的,当它太长时,第二个文本视图不会被拆分而是移到第二行?
我在解决方案中创建单个textview并根据长度构建文本(文本1 +填充+文本2,如果短,文本1 +“\ n”+文本2,如果长)但我不喜欢这个解决方案
有没有办法检测第二个文本是否会被拆分,以便更改包含水平垂直垂直文本视图的布局方向?
更新
这是我的xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center">
<TextView
android:id="@+id/my_text_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:padding="10dp"
android:text="@string/text1"/>
<TextView
android:id="@+id/my_text_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginRight="5dp"/>
</LinearLayout>
答案 0 :(得分:1)
我找到了更好的解决方案。将我的文字视图更改为可自动恢复的文字视图(更多信息here)
此外,每个文本视图都在一个单独的布局中,以确保将两个文本视图的大小调整为相同的值。 我的xml看起来像这样:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/value_linear_layout"
android:gravity="center">
<LinearLayout
android:layout_width="wrap_content"
android:layout_weight="1"
android:layout_height="wrap_content">
<com.mihaela.view.AutoResizeTextView
android:id="@+id/my_text_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_weight="1"
android:layout_height="wrap_content">
<com.mihaela.view.AutoResizeTextView
android:id="@+id/my_text_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</LinearLayout>
我已经从 AutoResizeTextView 实现了 OnTextResizeListener 来执行此操作:
public class TextWidthResizeListener implements OnTextResizeListener {
@Override
public void onTextResize(TextView textView, float oldSize, float newSize) {
TextPaint paint = textView.getPaint();
if (paint.measureText(textView.getText().toString()) > (valueLinearLayout.getWidth() / 2)){
valueLinearLayout.setOrientation(LinearLayout.VERTICAL);
}
}
}
其中valueLinearLayout为:
valueLinearLayout = (LinearLayout)findViewById(R.id.value_linear_layout);
这个解决方案最适合我,因为文本视图的尺寸是并排的,直到最小尺寸。达到最小尺寸且文本仍然不适合时,文本视图将在另一个下方对齐。
此外,听众的这个想法也可以应用于不可调整大小的文本视图。 我将这个答案设置为正确答案。
答案 1 :(得分:0)
您应该使用单个多行TextView
并按如下方式设置文字:
mTextView.setText(text1+" "+text2);
或
mTextView.setText(text1+"\n"+text2);
取决于您的特殊需求。
编辑:您可以在html
中指定文字,然后使用Html.fromHtml(htmlString)
并在TextView
中显示此文字。
String text1 ="<font color=\"red\">This is some text!</font>"
String text2="<font color=\"blue\">This is some other text!</font>"
textView.setText(Html.fromHtml(text1+ "<br/>"+ text2);
答案 2 :(得分:0)
我对接受的答案略有不同。我没有以任何方式更改我的布局xml,并且没有使用onTextResize()
或AutoResizeTextView
,因为这对我的情况来说似乎有些过分。如果设备的语言设置导致使用长字符串,我需要将LinearLayout从水平方向切换到垂直方向。
<强>布局强>
<LinearLayout
android:id="@+id/customer_care_bottom_layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal"
android:layout_marginBottom="@dimen/lmargin_bottom_10">
<TextView
android:id="@+id/customer_care_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/CUSTOMER_CARE_TITLE" />
<TextView
android:id="@+id/customer_care_number_information"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/CUSTOMER_CARE_INFORMATION"/>
</LinearLayout>
<强>爪哇强>
private void setCustomerServiceLayoutOrientationBasedOnTextWidth() {
TextPaint paint = customer_care_number_text.getPaint();
TextView tvCustomerCareTitle = (TextView) findViewById(R.id.customer_care_title);
TextView tvCustomerCareInformation = (TextView) findViewById(R.id.customer_care_information);
int halfCustomerServiceLayoutWidth = getScreenWidth() / 2;
boolean isCustomerCareTitleTooLong = paint.measureText(tvCustomerCareTitle.getText().toString()) > customerServiceLayoutWidth;
boolean isCustomerCareInformationTooLong = paint.measureText(tvCustomerCareInformation.getText().toString) > customerServiceLayoutWidth;
if (isCustomerCareTitleTooLong || isCustomerCareInformationTooLong) {
LinearLayout llCustomerCareBottom = (LinearLayout) findViewById(R.id.customer_care_bottom_layout);
llCustomerCareBottom.setOrientation(LinearLayout.VERTICAL);
}
}
private int getScreenWidth() {
int screenWidth;Display display = getWindowManager().getDefaultDisplay();
if (Build.VERSION.SDK_INT < 13) {
screenWidth = display.getWidth();
} else {
Point point = new Point();
display.getSize(point);
screenWidth = point.x;
}
return screenWidth;
}