自定义字体导致我的动态ViewPager的OnMeasure切断文本行

时间:2017-08-29 14:53:24

标签: android android-layout android-viewpager onmeasure

因此,在某些情况下,我的自定义TextView会切断最后一行文本。我正在使用自定义字体。它似乎只是切断了最后一个字。我将自定义文本视图更改为常规文本视图,这会强制我的文本视图使用标准字体而不是自定义文本视图,并且突然调整大小。

理论问题:在使用DDMS工具查看我的视图周围的布局大小并比较自定义字体版本与常规字体版本时,看起来它正确地测量了字符的高度 - 如果它没有它会在我更大的自定义字体上切掉部分y,g和p。但是它没有正确地猜测我的较大字体占用的行数,并测量行数,就像它是较小的非自定义字体一样。因此,当一个字符串以一个两个字母的单词结尾时,它就在包装的边缘,它不认为它需要包裹到下一行并将其剪掉。

ViewPager内部的布局,其中包含问题子CustomTextView:

<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@{carouselViewModel.carouselBackgroundColor}"
    android:orientation="vertical">

    <com.snip.custom.views.CustomTextView
        android:id="@+id/text"
        style="@style/irrelevant"
        android:text="@{carouselViewModel.text}"/>

    <android.support.design.widget.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="-17dp"
        android:layout_gravity="top"
        android:layout_below="@id/text"
        app:tabBackground="@drawable/dot_tab_selector"
        app:tabGravity="center"
        app:tabIndicatorHeight="0dp"
        app:tabPaddingEnd="5dp"
        app:tabPaddingStart="5dp"
        app:viewPager="@{{viewPager}}" />

    <com.snip.custom.views.CustomViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:clipToPadding="false"
        android:paddingEnd="20dp"
        android:paddingStart="20dp"
        android:layout_below="@id/tab_layout"
        app:currentItem="@{carouselViewModel.carouselCurrentItemSubject}"
        app:setOffscreenPageLimit="@{carouselViewModel.carouselOffscreenPageLimitSubject}"
        app:itemView="@{carouselViewModel.carouselItemViewSelector}"
        app:items="@{carouselViewModel.carouselItems}"
        app:onAdapterChangeListener="@{carouselViewModel.carouselAdapterChangeSubject}"
        app:onPageChangeListener="@{carouselViewModel.carouselPageChangeSubject}"/>

</RelativeLayout>

无聊的ViewPager:

{{1}}

我的布局文件:

{{1}}

1 个答案:

答案 0 :(得分:0)

看起来我需要更多代码来正确测量孩子,因为他们不知道他们的布局参数。所以我通过应用父widthMeasureSpec重新测量它们。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int height = 0;
    for (int i = 0; i < getChildCount(); i++) {
        View child = getChildAt(i);
        child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
        int h = child.getMeasuredHeight();
        if (h > height){
            height = h;
        }
        height = Math.max(child.getMeasuredHeight(), measureViewHeight(child, widthMeasureSpec));
    }

    heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

private int measureViewHeight(View view, int widthMeasuredSpec) {
    view.measure(getChildMeasureSpec(widthMeasuredSpec,
            getPaddingLeft() + getPaddingRight(),
            view.getLayoutParams().width),
            MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
    return view.getMeasuredHeight();
}