我的横向LinearLayout
包含TextView
,旁边有Spinner
。此LinearLayout
在LinearLayout
中包含的固定垂直RelativeLayout
中多次动态展示。
问题是,由于我从Theme.light
切换到Theme.holo.light
,TextView
的最后一行减少了一半。当动态文本很长并且跨越多行时会发生这种情况。
我已经能够通过向包含LinearLayout
和TextView
的水平Spinner
添加底部填充来解决此问题。
这不是一个修复,而是更多的黑客攻击。有人可以就如何正确解决这个问题给我一些建议吗?
我还读过其他一些问题,但似乎都没有帮助。
水平线性布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/textView1"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_marginRight="20dp"
android:text="TextView"/>
<Spinner
android:id="@+id/spinner1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
相对布局,其中布局在线性布局上以id ll2_7动态膨胀:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ScrollView
android:id="@+id/scrollView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/relLayoutButtonNext"
android:layout_below="@id/textView1" >
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingBottom="20dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="10dp" >
<TextView
android:id="@+id/textView10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="30dp"
android:text="2.7" />
<TextView
android:id="@+id/textView11"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:layout_toRightOf="@id/textView10"
android:text="@string/question2_7" />
<LinearLayout
android:id="@+id/ll2_7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView11"
android:layout_below="@+id/textView11"
android:orientation="vertical" android:layout_marginBottom="20dp">
</LinearLayout>
</RelativeLayout>
</ScrollView>
</RelativeLayout>
修改 以下是上面的完整布局xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/textView1"
style="@style/question_section_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="@string/question2_header" />
<RelativeLayout
android:id="@+id/relLayoutButtonNext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="@color/bottomBar"
android:paddingBottom="3dp"
android:paddingLeft="50dp"
android:paddingRight="50dp"
android:paddingTop="3dp" >
<Button
android:id="@+id/buttonNext"
android:layout_width="180dp"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:onClick="nextStep"
android:text="Next Section"
android:textSize="20sp" />
<Button
android:id="@+id/buttonPrevious"
android:layout_width="180dp"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:onClick="previousStep"
android:text="Previous Section"
android:textSize="20sp" />
</RelativeLayout>
<ScrollView
android:id="@+id/scrollView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/relLayoutButtonNext"
android:layout_below="@id/textView1" >
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingBottom="20dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="10dp" >
<TextView
android:id="@+id/textView10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="30dp"
android:text="2.7" />
<TextView
android:id="@+id/textView11"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:layout_toRightOf="@id/textView10"
android:text="@string/question2_7" />
<LinearLayout
android:id="@+id/ll2_7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView11"
android:layout_below="@+id/textView11"
android:orientation="vertical" android:layout_marginBottom="20dp">
</LinearLayout>
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView10"
android:layout_below="@+id/ll2_7"
android:text="2.8" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/ll2_7"
android:layout_toRightOf="@+id/textView10"
android:text="@string/question2_8" android:layout_marginBottom="10dp"/>
<LinearLayout
android:id="@+id/ll2_8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView3"
android:layout_below="@+id/textView3"
android:layout_marginBottom="20dp"
android:orientation="vertical" >
</LinearLayout>
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView2"
android:layout_below="@+id/ll2_8"
android:text="2.9" />
<TextView
android:id="@+id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/ll2_8"
android:layout_toRightOf="@+id/textView10"
android:text="@string/question2_9" android:layout_marginBottom="10dp"/>
<LinearLayout
android:id="@+id/ll2_9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView5"
android:layout_toRightOf="@+id/textView10"
android:orientation="vertical" android:layout_marginBottom="20dp">
</LinearLayout>
<TextView
android:id="@+id/textView6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView4"
android:layout_below="@+id/ll2_9"
android:text="2.10" />
<TextView
android:id="@+id/textView7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/ll2_9"
android:layout_toRightOf="@+id/textView10"
android:text="@string/question2_10" android:layout_marginBottom="10dp"/>
<LinearLayout
android:id="@+id/ll2_10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView7"
android:layout_marginBottom="20dp"
android:layout_toRightOf="@+id/textView10"
android:orientation="vertical" >
</LinearLayout>
<TextView
android:id="@+id/textView8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView6"
android:layout_below="@+id/ll2_10"
android:text="2.11" />
<TextView
android:id="@+id/textView9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/ll2_10"
android:layout_toRightOf="@+id/textView10"
android:text="@string/quesiton2_11" android:layout_marginBottom="10dp"/>
<LinearLayout
android:id="@+id/ll2_11"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView9"
android:layout_below="@+id/textView9"
android:orientation="vertical" android:layout_marginBottom="20dp">
</LinearLayout>
<TextView
android:id="@+id/textView12"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView8"
android:layout_below="@+id/ll2_11"
android:text="2.11.1" />
<TextView
android:id="@+id/textView13"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/ll2_11"
android:layout_toRightOf="@+id/textView10"
android:text="@string/question2_11_1" android:layout_marginBottom="10dp"/>
<LinearLayout
android:id="@+id/ll2_11_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView13"
android:layout_toRightOf="@+id/textView10"
android:orientation="vertical" android:layout_marginBottom="20dp">
</LinearLayout>
</RelativeLayout>
</ScrollView>
</RelativeLayout>
答案 0 :(得分:256)
在尝试了一百万种不同的事情后,我想我有答案。
我将LayoutGravity
应用于TextView项目:
android:layout_gravity="fill"
似乎解决了我遇到的所有裁剪问题。希望这可以帮助有同样问题的人。
答案 1 :(得分:40)
我遇到了截图中显示的相同截止问题。它是由水平LinearLayout
中的基线对齐引起的。由于字体大小不同,TextView
和Spinner
具有不同的基线。要解决此问题,需要通过设置来禁用布局的基线对齐:
android:baselineAligned="false"
或代码中:
layout.setBaselineAligned(false);
答案 2 :(得分:25)
我遇到了同样的问题,发现只需添加
android:includeFontPadding="false"
最后一行文字不再剪下它的下意。
答案 3 :(得分:9)
我通过添加
在文本后面添加了一些虚拟空间textView.setText(firstString+"\n");
我尝试了所有其他解决方案。但这是唯一适用于我的解决方案
答案 4 :(得分:5)
将有问题的textview放在framelayout中。我认为由于兄弟视图Spinner,文本视图的计算不正确。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<FrameLayout
android:layout_width="150dp"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView1"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_marginRight="20dp"
android:text="TextView"/>
</FrameLayout>
<Spinner
android:id="@+id/spinner1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
答案 5 :(得分:5)
我通过扩展TextView并添加如下自定义类来找到不同的解决方案:
public class AdaptingTextView extends TextView {
public AdaptingTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public AdaptingTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public AdaptingTextView(Context context) {
super(context);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
// set fitting lines to prevent cut text
int fittingLines = h / this.getLineHeight();
if (fittingLines > 0) {
this.setLines(fittingLines);
}
}
}
答案 6 :(得分:5)
发生这种情况时,您应该确保TextView
不会比它的容器大 -
如果TextView
设置为wrap_content
并且它的容器(或祖先容器)没有留出空间让TextView
成长,则可能会被遮挡。
如果不是这种情况,那么onMeasure()
的{{1}}有时也可能无法正确测量字母,非拉丁字符的尾部或文本的斜体效果。您可以通过为TextView
设置全局样式来更正此问题,以便在不需要更改整个代码库的情况下将其选中:
确保您的应用程序/活动使用如下自定义主题:
TextView
@Rynadt的答案对于进入上述阶段非常有帮助。在视图中设置文本的重力确保在某些设备上永远不会发生遮挡(文本在视图中正确拟合),在其他设备上使用sp值的填充帮助确保尾部等等被计算在内具有TextSize特定值。
答案 7 :(得分:4)
尝试删除android:paddingBottom =“20dp”
来自
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingBottom="20dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="10dp" >
答案 8 :(得分:4)
我的解决方案接近已接受的解决方案,但我必须将其更改为
android:layout_gravity="fill_vertical"
代替。否则其他行也会在随机位置添加换行符。例如,最大的行有4行,因此另一行从
更改 this is a testphrase
到
thi
s is
a testph
rase
答案 9 :(得分:3)
如果您遇到此问题且TextView
位于RelativeLayout
内,请尝试切换RelativeLayout
LinearLayout
。
这解决了我的问题
答案 10 :(得分:3)
答案 11 :(得分:3)
getViewTreeObserver().addOnGlobalLayoutListener
在回收站视图中不起作用。如果您使用的是回收商,请使用View.addOnLayoutChangeListener
:
我发现我在xml中为textView
定义的椭圆化并不总是被反映,因此我在重新分配text属性之前以编程方式设置它。这对我有用。
textView.addOnLayoutChangeListener(new OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom,
int oldLeft, int oldTop, int oldRight, int oldBottom) {
textView.removeOnLayoutChangeListener(this);
float lineHeight = textView.getLineHeight();
int maxLines = (int) (textView.getHeight() / lineHeight);
if (textView.getLineCount() != maxLines) {
textView.setLines(maxLines);
textView.setEllipsize(TextUtils.TruncateAt.END);
// Re-assign text to ensure ellipsize is performed correctly.
textView.setText(model.getText());
}
}
});
答案 12 :(得分:1)
我有同样的问题,而且非常讨厌。
只有阿拉伯文发生。
如果你将标签多行化并在字符串的末尾添加\n
,它会修复它,但问题是这个标签和它下面的对象之间会有很大的差距,由于这个字段现在在它下面有一个新的空行。
可以通过自定义控件来解决这个问题。但总的来说,这是一个令人烦恼的错误。
答案 13 :(得分:1)
我认为通过改变布局,你可以做的很少。正如我发现某些方法仅在某些情况下有效。我认为这取决于整个布局层次结构,并不是一个通用的解决方案。我还注意到,特别是当你想要设置为TextView的不同字体时会发生这种情况。
我经过实验和测试的确定镜头方法是,您可以在视图膨胀后在代码中设置字体属性。我假设你在assets / fonts文件夹中有一个你想要的字体。
例如片段:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.fragment_view, container, false);
TextView tv = (TextView)view.findViewById(R.id.text_view);
tv.setText("Insert text that needs to be displayed");
AssetManager assetManager = getContext().getAssets();
Typeface typeFace = Typeface.createFromAsset(assetManager, "Fonts/OpenSans-Light.ttf");
tv.setTypeface(typeFace , 0); // 0 is normal font
tv.setPadding(10, 0, 10, 0); // This is not mandatory
}
在活动中:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(Resource.Layout.main_activity);
TextView tv = (TextView)this.findViewById(R.id.text_view);
tv.setText("Insert text that needs to be displayed");
AssetManager assetManager = getContext().getAssets();
Typeface typeFace = Typeface.createFromAsset(assetManager, "Fonts/OpenSans-Light.ttf");
tv.setTypeface(typeFace , 0); // 0 is normal font
tv.setPadding(10, 0, 10, 0); // This is not mandatory
}
答案 14 :(得分:0)
对我来说,这种解决方案就像一个魅力。
我最外面的布局的高度和宽度是动态设置的,因此即使我在xml中设置了android:maxLines(对于不同的设备,其行为方式也不同),其中包含的TextView还是被切掉了文字。
尝试了不同的方法后,终于有了解决问题的解决方案。
Textview:
public class CustomTextView extends androidx.appcompat.widget.AppCompatTextView {
public CustomTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public CustomTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomTextView(Context context) {
super(context);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
// set fitting lines to prevent cut text
int fittingLines = h / this.getLineHeight();
if (fittingLines > 0) {
this.setLines(fittingLines);
this.setEllipsize(TextUtils.TruncateAt.END);
}
}
}
xml:
<com.myproject.android.customviews.CustomTextView
android:id="@+id/tv_partner_description"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="top"
android:textColor="@color/white"
android:textSize="@dimen/text_small_medium" />
答案 15 :(得分:0)
我遇到了同样的问题,找到了一个方便的解决方案。渲染后获得TextView的行数,并根据行数设置高度。这是代码。
TextView textView = (TextView) layout.findViewById(R.id.textView);
textView.setText(this.text);
textView.post(new Runnable() {
@Override
public void run() {
int linesCount = textView.getLineCount();
textView.setLines(linesCount);
}
});
答案 16 :(得分:0)
为特定语言创建主题,例如切断 textview 的 style-ar:
<style name="EnnodaCustomTextView" parent="Widget.AppCompat.TextView">
<item name="android:paddingTop">1dp</item>
<item name="android:paddingBottom">1dp</item>
</style>
将其应用到您的 AppTheme 中以反映整个应用程序以填充底部,如:
<item name="android:textViewStyle">@style/EnnodaCustomTextView</item>
注意:在默认styles.xml中创建相同的样式名称,没有用于填充的项目标签..(不需要额外的填充)
答案 17 :(得分:0)
在文本视图的底部添加填充:
android:paddingBottom="24dp"
答案 18 :(得分:0)
我知道这太晚了,但这对我来说就像魅力一样。
将此代码添加到您的textview
android:ellipsize="marquee"
android:layout_weight="1"
答案 19 :(得分:0)
最佳解决方法是在视图底部添加所需高度的虚拟视图(即,这将添加填充本身)。
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp" >
<View
android:layout_width="match_parent"
android:layout_height="30dp"/>
</TableRow>
就像在我的情况下,我在视图的底部添加了一个表行。希望这可以帮助别人。
答案 20 :(得分:-1)
我终于修好了!
我尝试将String添加到TextView in Service 中,然后调用scrollTo(),最后一行被切断!
scrollTo()应调用&#34; Runnable&#34;,如:
private ScrollView mScrollView;
public void scrollToBottom()
{
mScrollView = (ScrollView) findViewById(R.id.debug_textview_scrollview);
mScrollView.post(new Runnable()
{
public void run()
{
mScrollView.fullScroll(View.FOCUS_DOWN);
}
});
}
我认为是因为在服务中调用scrollTo()的部分,TextView的更新还没有准备好。