Devrath
Devrath

Reputation: 42854

Using DialogFragment in android

I am trying to launch a DialogFragment

What i am trying to do::

MainActivity.java

import android.content.Context;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;

public class MainActivity extends FragmentActivity {

    LocationManager locationManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        if ( !locationManager.isProviderEnabled( LocationManager.GPS_PROVIDER ) ) {
            showDialog();
        }
    }

    public void showDialog(){
        //GPS-Dialog
        GpsEnablingDialog gpsAlert;
        try {
            gpsAlert = new GpsEnablingDialog();
            gpsAlert.show(getSupportFragmentManager(), "GpsAlert_Tag");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            Log.d("My-Log-Msg",e.toString());
            e.printStackTrace();
        }

    }
}

GpsEnablingDialog.java

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.widget.Toast;

public class GpsEnablingDialog extends DialogFragment {

    AlertDialog.Builder builder=new AlertDialog.Builder(getActivity());

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {


        builder.setMessage("GPS is not Enabled \n Enable GPS ?");
        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(getActivity(), "Enable the GPS and restart the application", Toast.LENGTH_SHORT).show();
            }
        });

        builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                //Go to Settings page
                //startActivityForResult(new Intent(android.provider.Settings.ACTION_SETTINGS), 0);
            }
        });

        Dialog dialog=builder.create();
        return dialog;
    }
}

Problem I am facing::

In MainActivity for the line

gpsAlert = new GpsEnablingDialog();

I am getting error as shown below:: (LOG)

04-23 12:02:04.234: D/My-Log-Msg(775): java.lang.NullPointerException
04-23 12:02:05.063: W/System.err(775): java.lang.NullPointerException
04-23 12:02:05.125: W/System.err(775):  at android.app.AlertDialog.resolveDialogTheme(AlertDialog.java:142)
04-23 12:02:05.144: W/System.err(775):  at android.app.AlertDialog$Builder.<init>(AlertDialog.java:359)
04-23 12:02:05.164: W/System.err(775):  at com.example.enablegpsfromsettingpagewhenappstarts.GpsEnablingDialog.<init>(GpsEnablingDialog.java:13)
04-23 12:02:05.174: W/System.err(775):  at com.example.enablegpsfromsettingpagewhenappstarts.MainActivity.showDialog(MainActivity.java:29)
04-23 12:02:05.184: W/System.err(775):  at com.example.enablegpsfromsettingpagewhenappstarts.MainActivity.onCreate(MainActivity.java:21)
04-23 12:02:05.193: W/System.err(775):  at android.app.Activity.performCreate(Activity.java:4465)
04-23 12:02:05.215: W/System.err(775):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
04-23 12:02:05.224: W/System.err(775):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
04-23 12:02:05.234: W/System.err(775):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
04-23 12:02:05.254: W/System.err(775):  at android.app.ActivityThread.access$600(ActivityThread.java:122)
04-23 12:02:05.263: W/System.err(775):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
04-23 12:02:05.274: W/System.err(775):  at android.os.Handler.dispatchMessage(Handler.java:99)
04-23 12:02:05.284: W/System.err(775):  at android.os.Looper.loop(Looper.java:137)
04-23 12:02:05.304: W/System.err(775):  at android.app.ActivityThread.main(ActivityThread.java:4340)
04-23 12:02:05.304: W/System.err(775):  at java.lang.reflect.Method.invokeNative(Native Method)
04-23 12:02:05.324: W/System.err(775):  at java.lang.reflect.Method.invoke(Method.java:511)
04-23 12:02:05.334: W/System.err(775):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
04-23 12:02:05.344: W/System.err(775):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-23 12:02:05.354: W/System.err(775):  at dalvik.system.NativeStart.main(Native Method)

MyQuestion:: What mistake i am doing and how to resolve this ?

Thanks .... !

Upvotes: 0

Views: 487

Answers (3)

Raghunandan
Raghunandan

Reputation: 133570

This

AlertDialog.Builder builder=new AlertDialog.Builder(getActivity());

Is causing NullPointerException

Move it to onCreateDialog.

getActivity() returns null in your case. You initialized alert dialog outside of onCreateDialog

http://developer.android.com/reference/android/app/DialogFragment.html#Lifecycle

There also an example of AlertDialog in the docs

Your stacktraces indicates that alertdialog initialization fails

04-23 12:02:05.144: W/System.err(775):  at android.app.AlertDialog$Builder.<init>(AlertDialog.java:359)
04-23 12:02:05.164: W/System.err(775):  at com.example.enablegpsfromsettingpagewhenappstarts.GpsEnablingDialog.<init>(GpsEnablingDialog.java:13)

getActivity()

public final Activity getActivity ()

Added in API level 11
Return the Activity this fragment is currently associated with

Upvotes: 2

Rod_Algonquin
Rod_Algonquin

Reputation: 26198

The problem is from here

AlertDialog.Builder builder=new AlertDialog.Builder(getActivity());

We dont know if the getActivity() is null in there;

solution:

pass the context to ur contructor

   //in main Activity
   gpsAlert = new GpsEnablingDialog(this)
   //in dialog fragment
   public GpsEnablingDialog (Context context)
   {
      builder=new AlertDialog.Builder(context);     
   }

Upvotes: 0

Rohit
Rohit

Reputation: 3408

create constructor and call this

Context mContext;
public GpsEnablingDialog() {
    mContext = getActivity();
}

new GpsEnablingDialog().show(getFragmentManager(), "MyDialog");

Upvotes: 0

Related Questions