0

I get a NullPointerException in creating a layout on Android 5.0, Android 4 works fine. There is a Spinner in there with an extended ArrayAdapter.

EDIT It only occurs if I try to set a selection with setSelection.

Below is my stack trace:

12-17 09:35:40.195: E/AndroidRuntime(25564): FATAL EXCEPTION: main
12-17 09:35:40.195: E/AndroidRuntime(25564): Process: nl.minerall.sapphire.pocket, PID: 25564
12-17 09:35:40.195: E/AndroidRuntime(25564): java.lang.NullPointerException: Attempt to read from field 'int android.view.ViewGroup$LayoutParams.height' on a null object reference
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.widget.TextView.makeNewLayout(TextView.java:6573)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.widget.TextView.onMeasure(TextView.java:6851)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.view.View.measure(View.java:17496)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.widget.Spinner.setUpChild(Spinner.java:669)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.widget.Spinner.makeView(Spinner.java:632)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.widget.Spinner.getBaseline(Spinner.java:458)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1122)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.widget.TableRow.onMeasure(TableRow.java:114)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.view.View.measure(View.java:17496)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5464)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1438)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.widget.TableLayout.measureChildBeforeLayout(TableLayout.java:464)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:724)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.widget.TableLayout.measureVertical(TableLayout.java:476)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.widget.TableLayout.onMeasure(TableLayout.java:439)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.view.View.measure(View.java:17496)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5464)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.view.View.measure(View.java:17496)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5464)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:447)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.view.View.measure(View.java:17496)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5464)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2636)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.view.View.measure(View.java:17496)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2089)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1251)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1458)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1136)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5933)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.view.Choreographer.doCallbacks(Choreographer.java:580)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.view.Choreographer.doFrame(Choreographer.java:550)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.os.Handler.handleCallback(Handler.java:739)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.os.Handler.dispatchMessage(Handler.java:95)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.os.Looper.loop(Looper.java:135)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at android.app.ActivityThread.main(ActivityThread.java:5297)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at java.lang.reflect.Method.invoke(Native Method)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at java.lang.reflect.Method.invoke(Method.java:372)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
12-17 09:35:40.195: E/AndroidRuntime(25564):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)

This is the XML-excerpt where the spinner is defined:

<TableRow
    android:id="@+id/tableRow1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="5dp"
    android:paddingRight="5dp" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:gravity="right"
        android:text="@string/method"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="@color/Blue" />

    <Spinner
        android:id="@+id/spMethod"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

</TableRow>

This is my adapter:

public class PMethodAdapter extends ArrayAdapter<PMethod> {
    static ArrayList<PMethod> methods = null;
    private LayoutInflater mInflater;

    public PMethodAdapter(Context ctx) {
        super(ctx, 0);
        mInflater = LayoutInflater.from(ctx);
        if (methods == null) {
            methods = new ArrayList<PMethod>();
            methods.add(new PMethod(PMethod.METHOD_ONE, "one");
            methods.add(new PMethod(PMethod.METHOD_TWO, "two");
            methods.add(new PMethod(PMethod.METHOD_THREE, "three");
        }
    }

    @Override
    public int getCount() {
        return methods.size();
    }

    @Override
    public PMethod getItem(int position) {
        return methods.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = mInflater.inflate(android.R.layout.simple_spinner_item, null);
        }
        TextView tvLabel = (TextView)convertView.findViewById(android.R.id.text1);
        PMethod pm = methods.get(position);
        tvLabel.setText(pm.getLabel());

        return convertView;
    }

    public int getItemIdByMethod(int methodid) {
        // return an ID from the method ID
        int i = -1;
        for (i = 0; i < methods.size(); i++) {
            PMethod pm = methods.get(i); 
            if (pm.getMethod() == methodid) {
                break; 
            }
        }
        return i;
    }   
}

the METHOD_* constants are just integers.

Also, when I call setSelection in onResume the same error occurs, when I call it after the complete layout has been rendered, it does work.

Bart Friederichs
  • 33,050
  • 15
  • 95
  • 195
  • @Aspicas I know what a `NullPointerException` is. Thing is, I have no clue where in my code it occurs. If you see the stack trace, there is none of my own code there. And stepping through almost all code in the adapter reveals no null pointer. – Bart Friederichs Dec 17 '15 at 08:48
  • there is a bug in extended ArrayAdapter. – pskink Dec 17 '15 at 08:48
  • @BartFriederichs assign height and width before accessing layoutParams check this may be help for you http://stackoverflow.com/questions/28567065/android-error-when-i-set-size-of-imageview-inside-tablerow-programmatically – soorapadman Dec 17 '15 at 08:51
  • @Blackbelt this is how I instantiate my `LayoutInflater`: `mInflater = LayoutInflater.from(ctx);`. The `ctx` is the Activity in which it is contained. – Bart Friederichs Dec 17 '15 at 08:54
  • What I wanted to ask is if you were providing the parent to `mInflater.inflate` as second parameter. As @pskink it is probably a bug in the Adapter – Blackbelt Dec 17 '15 at 08:57
  • @Blackbelt No, no parent. But I thought it was allowed in this case. – Bart Friederichs Dec 17 '15 at 08:58
  • @BartFriederichs maybe adding your xml code will help us.... – penta Dec 17 '15 at 09:07
  • can you please provide some code? – H Raval Dec 17 '15 at 09:10
  • and share your adapter code... – pskink Dec 17 '15 at 10:50
  • like @Blackbelt said, instead of `null`, pass `parent` as a second parameter of `inflate` (and third parameter == `false`) and see what happens – pskink Dec 17 '15 at 11:08
  • @pskink that was it. Apparently for Android 5 this is a bigger issue than in Android 4. – Bart Friederichs Dec 17 '15 at 11:11
  • when not sure see the sources of `ArrayAdapter` and / or `ResourceCursorAdapter` to see how they use inflater in order to create new item views – pskink Dec 17 '15 at 11:15
  • honestly `ViewGroup$LayoutParams.height' on a null object reference` was a huge hint imo – Blackbelt Dec 17 '15 at 14:06

0 Answers0