Java 从非活动启动对话框

Java 从非活动启动对话框,java,android,android-alertdialog,android-dialogfragment,android-context,Java,Android,Android Alertdialog,Android Dialogfragment,Android Context,我有一个对话框可以工作,直到我添加代码尝试启动另一个对话框,然后它崩溃,出现DialogFragment.class错误。popup.show是发生错误的地方 公共类ProcessLocation扩展了DialogFragment{ Context context; SharedPreferences domainToName; SharedPreferences nameToDomain; SharedPreferences defaults; PopupMessage popup; int

我有一个对话框可以工作,直到我添加代码尝试启动另一个对话框,然后它崩溃,出现DialogFragment.class错误。popup.show是发生错误的地方

公共类ProcessLocation扩展了DialogFragment{

Context context;
SharedPreferences domainToName;
SharedPreferences nameToDomain;
SharedPreferences defaults;
PopupMessage popup;
int locationTally;

// Constructor
ProcessLocation(Context context) {
    this.context = context;
}


 public void processLocation(String domain, String name, String password) {

        domainToName = context.getSharedPreferences("domainToName",  Context.MODE_PRIVATE); //domain name = friendly name
        nameToDomain = context.getSharedPreferences("nameToDomain",  Context.MODE_PRIVATE); //friendly name = domain name/password/acm
        defaults = context.getSharedPreferences("Defaults",  Context.MODE_PRIVATE); //friendly name = domain name/password/acm
        String checkName = nameToDomain.getString(name,null);

        locationTally = defaults.getInt("tally",0);
        final Editor domainEdit = domainToName.edit();
        final Editor nameEdit = nameToDomain.edit();
        //popup = new PopupMessage();

        // Check to see if the location friendly name exists already, if so the entry is overwritten with new data
        if (checkName == null) {
             locationTally++;
             updatePreferences(locationTally, name, domain, password);
        //   popup.message = "Location has been added";
        //   popup.show(getFragmentManager(), "PopupMsgFragment");
            }
        else {
            nameEdit.remove(name);
            nameEdit.commit();
            domainEdit.remove(domain);
            domainEdit.remove(domain+"Pw");
            domainEdit.commit();
            updatePreferences(locationTally, name, domain, password);
        }

    }

 public void updatePreferences(int tally, String name, String domain, String password) {

     popup = new PopupMessage();

     domainToName = context.getSharedPreferences("domainToName",  Context.MODE_PRIVATE);    //domain name = friendly name
     nameToDomain = context.getSharedPreferences("nameToDomain",  Context.MODE_PRIVATE); //friendly name = domain name/password/acm
     defaults = context.getSharedPreferences("Defaults",  Context.MODE_PRIVATE); //friendly name = domain name/password/acm
     final Editor domainEdit = domainToName.edit();
     final Editor nameEdit = nameToDomain.edit();
     final Editor defaultEdit = defaults.edit();

     String defaultLocation = defaults.getString("defaultLocation", "None Set");
     if(defaultLocation.equals("")) {
         defaultEdit.putString("defaultLocation",name);
     }

     nameEdit.putString(name,domain);
     nameEdit.commit();
     defaultEdit.putInt("tally",tally);
     defaultEdit.commit();
     domainEdit.putString(domain,name);
     domainEdit.putString(domain+"Pw",password);
     domainEdit.commit();

     System.out.println("mycOutput:- Tally: " + locationTally);
     System.out.println("mycOutput:- Domain from Name: " + nameToDomain.getString(name,""));
     System.out.println("mycOutput:- Name from Domain: " + domainToName.getString(domain,""));
     System.out.println("mycOutput:- Password: " + domainToName.getString(domain+"Pw",""));

     popup.popupType = "info";
     popup.message = name + " has been added successfully";
     popup.show(getActivity().getFragmentManager(), "PopupMsgFragment");

 }
}

包含弹出窗口的类是:

public class PopupMessage extends DialogFragment {


String message = "";
AddLocation addLocation;
String popupType = "";

Context mContext;

public PopupMessage() {
    mContext = getActivity();
}
// Constructor


@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    addLocation = new AddLocation();

    // Use the Builder class for convenient dialog construction
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    if (popupType.equals("addloc")) {
        builder.setMessage(message)
           .setPositiveButton("Add Location", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   if (popupType.equals("addloc")) {
                   addLocation.show(getFragmentManager(), "PopupMsgFragment");
                   }
               }
           })
           .setNegativeButton("Ok", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
          //
            };
           });
    }
    if (popupType.equals("info")) {
        builder.setMessage(message)
        .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {

            }
        }); 
    }

    // Create the AlertDialog object and return it
    return builder.create();
}
}

谢谢

错误MEESSAGE all抛出一个空指针:


您没有提供AddLocation类。假设它与ProcessLocation是不同的类

在PopupMessage类中,尝试添加:

Context mContext;

public PopupMessage() {
    mContext = getActivity();
}
在ProcessLocation类中,修改如下:

替换popup.showgetFragmentManager、PopupMsgFragment

通过popup.showgetActivity.getFragmentManager、PopupMsgFragment

处理位置

弹出窗口


尝试在新弹出消息中使用此消息时出错。我把它改为popup=newpopupmessagegetactivity;但还是得到了nullpointer@DanJamesPalmer您可以发布错误的调试日志吗?如果您可以发布addLocation类,也可以这样做
 final Editor nameEdit = nameToDomain.edit();
            popup = new PopupMessage(this);

            // Check to see if the location friendly name exists already, if so the entry is overwritten with new data
            if (checkName == null) {
                 nameEdit.putString(name,domain);
public class PopupMessage extends DialogFragment {
    Context myContext;
    String message = "";
    AddLocation addLocation;

    public PopupMessage(Context context){
        this.myContext = context;
    }


    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        addLocation = new AddLocation();

        // Use the Builder class for convenient dialog construction
        AlertDialog.Builder builder = new AlertDialog.Builder(this.myContext);
        builder.setMessage(message)
               .setPositiveButton("Add Location", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       addLocation.show(getFragmentManager(), "PopupMsgFragment");
                   }
               })
               .setNegativeButton("Ok", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
              //
            };
        });
        // Create the AlertDialog object and return it
        return builder.create();
    } }