2015-04-30 7 views
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) 
+0

нет ответа до сих пор. .. –

+0

Я не уверен, что это поможет, но я хотел бы знать, какую тему вы используете? –

ответ

0

SwitchCompat требует указания андроида: Текстон и 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"/> 
+0

Мой код работает без textOn и textOff, он только падает, когда я пытался его измерить, так или иначе, у меня нет доступа к кодам сейчас, и я думаю, что он уже разрешен, поэтому я не могу проверить этот ответ. Об этом просили 2 года назад. –

2

В Метод onMeasue SwtichCompat, если 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.

Таким образом, вы должны установить атрибуты Android: Текстон и Android: textOff для SwitchCompat, или установить приложение: ShowText = "ложь":

<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" /> 
+0

Мой код работает без textOn и textOff, он только падает, когда я пытался его измерить, так или иначе, у меня нет доступа к кодам сейчас, и я думаю, что он уже разрешен, поэтому я не могу проверить этот ответ. Об этом просили 2 года назад. –

Смежные вопросы