在android中使用DialogFragment

在android中使用DialogFragment,android,fragment,android-dialogfragment,Android,Fragment,Android Dialogfragment,我正在尝试启动一个对话框片段 gpsAlert = new GpsEnablingDialog(); 我正在尝试做的事情: gpsAlert = new GpsEnablingDialog(); 在启动应用程序之前,我已手动禁用GPS 我正在检查GPS是否已关闭 如果它被关闭,我会弹出一个对话框,询问 进入“设置”页的权限 MainActivity.java import android.content.Context; import android.location.LocationM

我正在尝试启动一个对话框片段

gpsAlert = new GpsEnablingDialog();
我正在尝试做的事情

gpsAlert = new GpsEnablingDialog();
  • 在启动应用程序之前,我已手动禁用GPS
  • 我正在检查GPS是否已关闭
  • 如果它被关闭,我会弹出一个对话框,询问 进入“设置”页的权限
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();
        }

    }
}
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;
    }
}
gpsAlert = new GpsEnablingDialog();
GpsEnablingDialog.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();
        }

    }
}
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;
    }
}
gpsAlert = new GpsEnablingDialog();

我面临的问题

gpsAlert = new GpsEnablingDialog();
生产线的主要活动

gpsAlert = new GpsEnablingDialog();
我得到如下所示的错误::(日志)

gpsAlert = new GpsEnablingDialog();
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):在android.app.AlertDialog.resolveDialogTheme(AlertDialog.java:142)上
04-23 12:02:05.144:W/System.err(775):在android.app.AlertDialog$Builder上。(AlertDialog.java:359)
04-23 12:02:05.164:W/System.err(775):在com.example.enablegpsfromsettingpagewhenapstarts.GpsEnablingDialog.(GpsEnablingDialog.java:13)
04-23 12:02:05.174:W/System.err(775):位于com.example.enablegpsfromsettingpagewhenapstarts.MainActivity.showDialog(MainActivity.java:29)
04-23 12:02:05.184:W/System.err(775):位于com.example.enablegpsfromsettingpagewhenapstarts.MainActivity.onCreate(MainActivity.java:21)
04-23 12:02:05.193:W/System.err(775):位于android.app.Activity.performCreate(Activity.java:4465)
04-23 12:02:05.215:W/System.err(775):位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
04-23 12:02:05.224:W/System.err(775):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
04-23 12:02:05.234:W/System.err(775):位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
04-23 12:02:05.254:W/System.err(775):位于android.app.ActivityThread.access$600(ActivityThread.java:122)
04-23 12:02:05.263:W/System.err(775):位于android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
04-23 12:02:05.274:W/System.err(775):位于android.os.Handler.dispatchMessage(Handler.java:99)
04-23 12:02:05.284:W/System.err(775):在android.os.Looper.loop(Looper.java:137)
04-23 12:02:05.304:W/System.err(775):位于android.app.ActivityThread.main(ActivityThread.java:4340)
04-23 12:02:05.304:W/System.err(775):位于java.lang.reflect.Method.invokenactive(本机方法)
04-23 12:02:05.324:W/System.err(775):位于java.lang.reflect.Method.invoke(Method.java:511)
04-23 12:02:05.334:W/System.err(775):位于com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
04-23 12:02:05.344:W/System.err(775):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-23 12:02:05.354:W/System.err(775):在dalvik.System.NativeStart.main(本机方法)

我的问题: 我犯了什么错误?如何解决

gpsAlert = new GpsEnablingDialog();

谢谢

创建构造函数并调用

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

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

问题就在这里

gpsAlert = new GpsEnablingDialog();
AlertDialog.Builder builder=new AlertDialog.Builder(getActivity());
我们不知道其中的getActivity()是否为null

gpsAlert = new GpsEnablingDialog();
解决方案:

gpsAlert = new GpsEnablingDialog();
将上下文传递给构造函数

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

gpsAlert = new GpsEnablingDialog();
正在导致
NullPointerException

gpsAlert = new GpsEnablingDialog();
将其移动到创建对话框的
onCreateDialog

gpsAlert = new GpsEnablingDialog();
getActivity()
在您的情况下返回null。您在
onCreateDialog

gpsAlert = new GpsEnablingDialog();

gpsAlert = new GpsEnablingDialog();
文档中还有一个
AlertDialog
示例

gpsAlert = new GpsEnablingDialog();
stacktraces表示alertdialog初始化失败

gpsAlert = new GpsEnablingDialog();
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在返回null之前,您能给他提供更多关于发生了什么的上下文吗?@Raghunandan。。。。谢谢你清楚的解释。。。。。所以它返回null,因为对话框片段生命周期尚未启动,并且。。。。。在那之前,我试图了解背景。。。因此,在对话框的生命周期开始后,上下文将可用。。。。我明白我的意思了吗understanding@Casperyes getActivity()返回null,由于上下文为null,所以初始化失败getActivity在onAttach之前返回null,这就是mistake@blackbelt .... 感谢您指出:)