我认为我的问题与此有关: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中。我可以在TouchInterceptHorizontalScrollView中获得度量,但这似乎无济于事。我试图在XML中为android:fillViewport =“ true”添加TouchInterceptHorizontalScrollView,AutoTruncateTextView和两者,但是它没有改变计算。
我该怎么做才能在Android 6及更低版本中获得正确的widthMeasureSpec值?
感谢您的帮助!
答案 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">
并保留上面发布的代码,否则截断机制将不再起作用。