0

这是我的代码,用于测量列表视图中项目的高度并根据其子项的总高度设置列表视图高度。

使用任何其他视图时我没有任何问题。

public static void setListViewHeightBasedOnChildren(TwoWayView listView) {
    ListAdapter listAdapter = listView.getAdapter();
    if (listAdapter == null) {
        return;
    }
    int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST);
    int totalHeight = 0;
    View listItem = null;
    for (int i = 0; i < listAdapter.getCount(); i++) {
        listItem = listAdapter.getView(i, listItem, listView);
        if (listItem instanceof ViewGroup) {
            listItem.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, ViewGroup.LayoutParams.WRAP_CONTENT));
        }
        listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED); // this is where the exception happens
        totalHeight += listItem.getMeasuredHeight();
    }
    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight + (listView.getItemMargin() * (listAdapter.getCount() - 1)) + listView.getPaddingTop() + listView.getPaddingBottom();
    listView.setLayoutParams(params);
    listView.requestLayout();
}

这是堆栈跟踪:

java.lang.NullPointerException
       at android.text.StaticLayout.<init>(StaticLayout.java:50)
       at android.support.v7.widget.SwitchCompat.makeLayout(SwitchCompat.java:606)
       at android.support.v7.widget.SwitchCompat.onMeasure(SwitchCompat.java:526)
       at android.view.View.measure(View.java:15395)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4826)
       at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1396)
       at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1038)
       at android.widget.LinearLayout.onMeasure(LinearLayout.java:576)
       at android.view.View.measure(View.java:15395)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4826)
       at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1396)
       at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1038)
       at android.widget.LinearLayout.onMeasure(LinearLayout.java:576)
       at android.view.View.measure(View.java:15395)
4

2 回答 2

2

在 SwtichCompat 的 onMeasue 方法中,如果 showText 为 true,则使用 textOn 和 textOff 进行布局:

 @Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    if (mShowText) {
        if (mOnLayout == null) {
            mOnLayout = makeLayout(mTextOn);
        }

        if (mOffLayout == null) {
            mOffLayout = makeLayout(mTextOff);
        }
    }
    ...
 }

看看方法makeLayout:

private Layout makeLayout(CharSequence text) {
    final CharSequence transformed = (mSwitchTransformationMethod != null)
            ? mSwitchTransformationMethod.getTransformation(text, this)
            : text;

    return new StaticLayout(transformed, mTextPaint,
            transformed != null ?
                    (int) Math.ceil(Layout.getDesiredWidth(transformed, mTextPaint)) : 0,
            Layout.Alignment.ALIGN_NORMAL, 1.f, 0, true);
}

如果参数文本为空,则转换后的也将为空。然后会传递给StaticLayout的构造函数,导致NullPointException。

所以,你应该为 SwitchCompat 设置属性 android:textOn 和 android:textOff,或者设置 app:showText="false":

<android.support.v7.widget.SwitchCompat
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:textOn="@string/text_on"
  android:textOff="@string/text_off" />

或者

<android.support.v7.widget.SwitchCompat
  xmlns:app="http://schemas.android.com/apk/res-auto"   
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  app:showText="false" />
于 2017-03-21T08:13:18.667 回答
0

SwitchCompat 要求您指定 android:textOn 和 android:textOff

例如,您可以像这样更改

<android.support.v7.widget.SwitchCompat
android:id="@+id/on_off_switch"
android:textOn="On"
android:textOff="Off"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_centerVertical="true"
android:layout_alignParentEnd="true"/>
于 2016-05-30T06:50:36.017 回答