在Android 6的Horizo​​ntalScrollView中,onMeasure返回widthMeasureSpec = 0

时间:2019-02-25 20:47:44

标签: android

我认为我的问题与此有关:widthMeasureSpec is 0 when in HorizontalScrollView 长话短说,我正在尝试创建一个自定义的水平滚动视图。在某个时候,我要压倒一切

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)

尽管在Android> = 7上工作正常,但在Android <= 6中,widthMeasureSpec的值为0。 measureChild的代码在API 23和24之间进行了更改:

在API 23中:

childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);

在API 24中:

final int childWidthMeasureSpec = MeasureSpec.makeSafeMeasureSpec(
                Math.max(0, MeasureSpec.getSize(parentWidthMeasureSpec) - horizontalPadding),
MeasureSpec.UNSPECIFIED);

我尝试使用吸气剂从父视图中获取宽度,但是由于某些调用获得了正确的宽度,它无法按预期工作。我还尝试覆盖父级中的measureChild并将最新代码放在其中,但是没有运气:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    measureChild(getTouchInterceptTextView(), widthMeasureSpec, heightMeasureSpec);
}

@Override
protected void measureChild(View child, int parentWidthMeasureSpec,
                            int parentHeightMeasureSpec) {
    ViewGroup.LayoutParams lp = child.getLayoutParams();

    final int horizontalPadding = getPaddingLeft() + getPaddingRight();
    final int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
            Math.max(0, MeasureSpec.getSize(parentWidthMeasureSpec) - horizontalPadding),
            MeasureSpec.UNSPECIFIED);

    final int childHeightMeasureSpec = getChildMeasureSpec(parentHeightMeasureSpec,
            getPaddingTop() + getPaddingBottom(), lp.height);
    child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
}

我的整个文件在这里:https://github.com/AdrienPoupa/VinylMusicPlayer/commit/ba0dfae7dd03771f3625b8393927986aad552e2a

重要的部分是:

<com.poupa.vinylmusicplayer.views.TouchInterceptHorizontalScrollView
                    android:id="@+id/title_scrollview"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content">

                    <com.poupa.vinylmusicplayer.views.AutoTruncateTextView
                        android:id="@+id/title"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:fontFamily="sans-serif"
                        android:textAppearance="@style/TextAppearance.AppCompat.Subhead" />

</com.poupa.vinylmusicplayer.views.TouchInterceptHorizontalScrollView>

onMeasure函数位于AutoTruncateTextView中。我可以在TouchInterceptHorizo​​ntalScrollView中获得度量,但这似乎无济于事。我试图在XML中为android:fillViewport =“ true”添加TouchInterceptHorizo​​ntalScrollView,AutoTruncateTextView和两者,但是它没有改变计算。

我该怎么做才能在Android 6及更低版本中获得正确的widthMeasureSpec值?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

经过多次尝试,似乎可以通过将以下代码段添加到AutoTruncateTextView的onMeasure中来工作:

if (textBoundsWidth == 0) {
            textBoundsWidth =  getTouchInterceptFrameLayout().getMeasuredWidth();
        }

基本上,获取TouchInterceptFrameLayout的宽度,即XML文件的第二级

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="72dp"
    android:foreground="?attr/rectSelector"
    tools:ignore="UnusedAttribute">

    <!-- for getSwipeableContainerView() -->
    <com.poupa.vinylmusicplayer.views.TouchInterceptFrameLayout
        android:id="@+id/dummy_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

并保留上面发布的代码,否则截断机制将不再起作用。