Android TabPage Indicator 内容换行问题

9

我遇到了ViewPager的另一个问题,目前我的知识水平无法解决。

我有一个带有ViewPager的TabPageIndicator,在每个标签上,我都显示文本。它只是一个简单的textView:

<?xml version="1.0" encoding="utf-8"?>
<view xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    class="viewpagerindicator.TabPageIndicator$TabView" >

    <TextView
        android:id="@+id/vpi_tab_text"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:singleLine="true"
        android:ellipsize="marquee"
        android:gravity="center"
        android:paddingBottom="10dip"
        android:paddingLeft="8dip"
        android:paddingRight="8dip"
        android:paddingTop="10dip"
        android:textColor="@drawable/vpi_tab_text_color"
        android:typeface="serif" />

</view>

我希望选项卡中的文本始终为单行,始终为整个文本,不要省略号,不要换行,不要超过1行。用户需要能够完整阅读它...

但是我做不到,我尝试了不同的选项,仍然遇到一些问题-要么文本不止一行,但只显示第一行,要么只显示部分文本。

您是否经历过类似的情况?

感谢您的任何帮助。

编辑一:

我相信问题出在这里:

@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
final boolean lockedExpanded = widthMode == MeasureSpec.EXACTLY;
setFillViewport(lockedExpanded);
    final int childCount = mTabLayout.getChildCount();
    if (childCount > 1 && (widthMode == MeasureSpec.EXACTLY || widthMode == MeasureSpec.AT_MOST)) {
        if (childCount > 2) {
            mMaxTabWidth = (int) (MeasureSpec.getSize(widthMeasureSpec) * 0.4f);
        } else {
            mMaxTabWidth = MeasureSpec.getSize(widthMeasureSpec) / 2;
        }
    } else {
        mMaxTabWidth = -1;
    }

    final int oldWidth = getMeasuredWidth();
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    final int newWidth = getMeasuredWidth();

    if (lockedExpanded && oldWidth != newWidth) {
        // Recenter the tab display if we're at a new (scrollable) size.
        setCurrentItem(mSelectedTabIndex);
    }
 }

mMaxTabWidth...

5个回答

4
我认为问题很简单,我注释掉了这部分内容:
        @Override
        public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);

            // Re-measure if we went beyond our maximum size.
//          if (mParent.mMaxTabWidth > 0 && getMeasuredWidth() > mParent.mMaxTabWidth) {
//              super.onMeasure(MeasureSpec.makeMeasureSpec(mParent.mMaxTabWidth, MeasureSpec.EXACTLY), heightMeasureSpec);
//          }
        }

现在它按照我的意愿工作了...我一直看错了代码的位置。


1
我遇到了标签中文本被错误地省略的问题。我找到了一个解决方法这里, #227,使用了@larham的建议。以下是他所做的基本操作,但最好阅读他对所做操作以及原因的解释:
在TabPageIndicator.java中,替换以下内容:
mTabLayout.addView(tabView, new LinearLayout.LayoutParams(0, MATCH_PARENT, 1));

使用:

mTabLayout.addView(tabView, new LinearLayout.LayoutParams(WRAP_CONTENT, MATCH_PARENT, 1));

这对我解决了问题。

0

更新 ViewPageIndicator 库 :) 已正式修复 :)


你有类似的经历吗?任何帮助都将不胜感激。我曾经遇到过同样的问题,解决方法是从Git仓库中拉取最新版本。为什么不试试呢? - cV2

0

在宽度方面,我使用了Wrap content属性代替Layout weight = 1。在TabPageIndicator类中,将addTab(int,CharSequence,int)方法中的mTabLayout.addView替换为以下内容:

mTabLayout.addView(tabView, new LinearLayout.LayoutParams(WRAP_CONTENT,WRAP_CONTENT));


0

我曾经遇到过类似的问题,整个文本没有显示出来。 我通过减少左/右样式填充来解决了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接