Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

findViewById in DialogFragment - NullPointerException

Tags:

java

android

The dialog I show has two Spinners, and for one of those I'd like to set the selected item (item to select is passed from the main activity with setArguments()/getArguments())

The problem is I can't get the spinner, instead I get a NullPointerException at

Spinner spinner = (Spinner) view.findViewById(R.id.ssd_weeksSelectSpinner);

The DialogFragment code:

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Spinner;

public class DFrag extends DialogFragment 
{
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());       
    LayoutInflater inflater = getActivity().getLayoutInflater();

    builder.setView(inflater.inflate(R.layout.activity_schedule_select_dialog, null))
        .setPositiveButton(R.string.ssd_select_positive, new DialogInterface.OnClickListener()
        {               
            public void onClick(DialogInterface dialog, int which)
            {
                mListener.onDialogPositiveClick(DFrag.this);                        
            }
        })
        .setNegativeButton(R.string.select_negative, new DialogInterface.OnClickListener()
        {               
            @Override
            public void onClick(DialogInterface dialog, int which) {
                mListener.onDialogNegativeClick(DFrag.this);
                DFrag.this.getDialog().cancel();                        
            }
        });

        builder.setInverseBackgroundForced(true);

        return builder.create();        
    }


    public void onActivityCreated(Bundle savedInstanceState)
    {       
        View view = getView();

        Spinner spinner = (Spinner) view.findViewById(R.id.ssd_weeksSelectSpinner);
        spinner.setSelection(getArguments().getInt("SelectWeek"));

        super.onActivityCreated(savedInstanceState);
    }

    public interface DFragListener
    {
        public void onDialogPositiveClick(DialogFragment dialog);
        public void onDialogNegativeClick(DialogFragment dialog);
    }

    DFragListener mListener;


    @Override
    public void onAttach(Activity activity)
    {
        super.onAttach(activity);
        try 
        {
            mListener = (DFragListener) activity;
        }
        catch (ClassCastException e)
        {
            throw new ClassCastException(activity.toString() + " Listener not implemented");
        }
    }
}

As requested, layout for the dialog (activity_schedule_select_dialog.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView 
        android:id="@+id/ssd_classLabel"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/select_class_label"
        android:layout_marginRight="4dip"
        android:layout_marginLeft="4dip"/>
    <Spinner 
        android:id="@+id/ssd_classSelectSpinner"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="4dip"
        android:entries="@array/urnikClasses"/>

    <TextView 
        android:id="@+id/ssd_weekLabel"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/select_week_label"
        android:layout_marginRight="4dip"
        android:layout_marginLeft="4dip"/>    
    <Spinner 
        android:id="@+id/ssd_weeksSelectSpinner"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:entries="@array/weeksArray"/>

    <CheckBox 
        android:id="@+id/ssd_DefaultChkbox"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/ssd_DefaultChkBoxTxt"/>


</LinearLayout>

Logcat:

05-12 13:16:16.288: E/AndroidRuntime(4310): FATAL EXCEPTION: main
05-12 13:16:16.288: E/AndroidRuntime(4310): java.lang.NullPointerException
05-12 13:16:16.288: E/AndroidRuntime(4310):     at com.rogy.scks.urnik.DFrag.onActivityCreated(DFrag.java:91)
05-12 13:16:16.288: E/AndroidRuntime(4310):     at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1468)
05-12 13:16:16.288: E/AndroidRuntime(4310):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:931)
05-12 13:16:16.288: E/AndroidRuntime(4310):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
05-12 13:16:16.288: E/AndroidRuntime(4310):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
05-12 13:16:16.288: E/AndroidRuntime(4310):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
05-12 13:16:16.288: E/AndroidRuntime(4310):     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)
05-12 13:16:16.288: E/AndroidRuntime(4310):     at android.os.Handler.handleCallback(Handler.java:725)
05-12 13:16:16.288: E/AndroidRuntime(4310):     at android.os.Handler.dispatchMessage(Handler.java:92)
05-12 13:16:16.288: E/AndroidRuntime(4310):     at android.os.Looper.loop(Looper.java:137)
05-12 13:16:16.288: E/AndroidRuntime(4310):     at android.app.ActivityThread.main(ActivityThread.java:5195)
05-12 13:16:16.288: E/AndroidRuntime(4310):     at java.lang.reflect.Method.invokeNative(Native Method)
05-12 13:16:16.288: E/AndroidRuntime(4310):     at java.lang.reflect.Method.invoke(Method.java:511)
05-12 13:16:16.288: E/AndroidRuntime(4310):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
05-12 13:16:16.288: E/AndroidRuntime(4310):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
05-12 13:16:16.288: E/AndroidRuntime(4310):     at dalvik.system.NativeStart.main(Native Method)
like image 478
Rogy Avatar asked May 12 '13 11:05

Rogy


People also ask

What does this method do FindViewById?

FindViewById(Int32)Finds a view that was identified by the android:id XML attribute that was processed in #onCreate .

What is Viewview FindViewById?

The findViewById() method is a method of Android's View and Activity classes. The method is used to find an existing view in your XML layout by its android:id attribute.

How do I destroy DialogFragment?

tl;dr: The correct way to close a DialogFragment is to use dismiss() directly on the DialogFragment. Control of the dialog (deciding when to show, hide, dismiss it) should be done through the API here, not with direct calls on the dialog. Dismiss the fragment and its dialog.

What is the difference between dialog & DialogFragment?

Dialog: A dialog is a small window that prompts the user to make a decision or enter additional information. DialogFragment: A DialogFragment is a special fragment subclass that is designed for creating and hosting dialogs.


2 Answers

Found the solution, instead of trying to find the view in public void onActivityCreated(Bundle savedInstanceState)

In public Dialog onCreateDialog(Bundle savedInstanceState)

I changed from

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());       
    LayoutInflater inflater = getActivity().getLayoutInflater();

    builder.setView(inflater.inflate(R.layout.activity_schedule_select_dialog, null))
        .setPositiveButton(R.string.ssd_select_positive, new DialogInterface.OnClickListener()
        {               
            public void onClick(DialogInterface dialog, int which)
            {
                mListener.onDialogPositiveClick(DFrag.this);                        
            }
        })
        .setNegativeButton(R.string.select_negative, new DialogInterface.OnClickListener()
        {               
            @Override
            public void onClick(DialogInterface dialog, int which) {
                mListener.onDialogNegativeClick(DFrag.this);
                DFrag.this.getDialog().cancel();                        
            }
        });

To

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());       
    LayoutInflater inflater = getActivity().getLayoutInflater();
    View view = inflater.inflate(R.layout.activity_schedule_select_dialog, null);

    builder.setView(view)
        .setPositiveButton(R.string.ssd_select_positive, new DialogInterface.OnClickListener()
        {               
            public void onClick(DialogInterface dialog, int which)
            {
                mListener.onDialogPositiveClick(DFrag.this);                        
            }
        })
        .setNegativeButton(R.string.select_negative, new DialogInterface.OnClickListener()
        {               
            @Override
            public void onClick(DialogInterface dialog, int which) {
                mListener.onDialogNegativeClick(DFrag.this);
                DFrag.this.getDialog().cancel();                        
            }
        });

And at the end added

Spinner spinner = (Spinner) view.findViewById(R.id.ssd_weeksSelectSpinner);
spinner.setSelection(getArguments().getInt("SelectWeek"));
like image 168
Rogy Avatar answered Oct 03 '22 19:10

Rogy


First of extract the Spinner object to a member of the class.

public class DFrag extends DialogFragment
{
    private Spinner mSpinner;
    ...

Then assign your spinner from the onCreateDialog() function

public Dialog onCreateDialog(Bundle savedInstanceState) 
{
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());       
    LayoutInflater inflater = getActivity().getLayoutInflater();
    View view = inflater.inflate(R.layout.activity_schedule_select_dialog, null);
    // Assign spinner
    mSpinner = (Spinner) view.findViewById(R.id.ssd_weeksSelectSpinner);
    builder.setView(view);
    // Set positive and negative buttons here
    ...
}

Now place the value of your spinner on the onCreateView() function

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{
    mSpinner.setSelection(getArguments().getInt("SelectWeek"));
    ...
}

Cheers!

like image 39
noahutz Avatar answered Oct 03 '22 19:10

noahutz