我意识到这个问题已经被触及了无数次,但是我尝试的任何事情都没有为我工作。尝试访问SharedPreferences时仍然出现错误。

在主活动(McsHome)中,我启动各种对话框来帮助用户添加位置。

第一个对话框在下面,它仅弹出一条消息,指出需要添加位置(PopupMessage.java):

public class PopupMessage extends DialogFragment {

    String message = "";
    AddLocation addLocation;


    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        addLocation = new AddLocation();

        // Use the Builder class for convenient dialog construction
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        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();
    }
}


这为用户提供了添加位置的选项,当单击该按钮时,会弹出另一个对话框(AddLocation.java):

public class AddLocation extends DialogFragment {

    EditText mcsDomain;
    EditText friendlyName;
    EditText password;
    ProcessLocation addLoc;
    String message = "";

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        LayoutInflater inflater = getActivity().getLayoutInflater();
        View layout = inflater.inflate(R.layout.add_location_dialog, null); // Pass null as the parent view because its going in the dialog layout
        mcsDomain = (EditText) layout.findViewById(R.id.mcsDomain);
        friendlyName = (EditText) layout.findViewById(R.id.friendlyName);
        password = (EditText) layout.findViewById(R.id.password);

        builder.setView(layout)
                .setTitle("Add/Update Location")
        // Add action buttons
               .setPositiveButton("Add/Update", new DialogInterface.OnClickListener() {
                   @Override

                   public void onClick(DialogInterface dialog, int id) {

                       // Passes the chosen location parameters to the ProcessLocation class
                       addLoc.processLocation(mcsDomain.getText().toString(),friendlyName.getText().toString(),password.getText().toString());

                   }
               })
               .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {

                   }
               });
        return builder.create();
    }


AddLocation.java使用XML布局,其中包括3个EditText字段。这些值将传递给包含方法processLocation()的第三类ProcessLocation.java。

public class ProcessLocation {


    SharedPreferences domainToName;
    SharedPreferences nameToDomain;


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

            domainToName = getSharedPreferences("domainToName",  MODE_PRIVATE);
            nameToDomain = getSharedPreferences("nameToDomain",  MODE_PRIVATE);
        //  final Editor domainEdit = domainToName.edit();
        //  final Editor nameEdit = nameToDomain.edit();

            if (nameToDomain.contains(name)) {
                   System.out.println("Name Doesn't Exist");
                }

        }

}


我在MODE_PRIVATE上遇到错误,我认为与Context有关。我一直在玩背景游戏,没有运气(或理解)。我知道我要连续弹出几个对话框。如果添加“扩展活动”,该错误会消失,但尝试getSharedPreferences时应用程序将崩溃。

通过阅读其他文章,我确定这与通过McsHome.java活动传递上下文有关,但是我尝试过的一切都失败了。

最佳答案

首先,在AddLocation中声明成员变量addLoc,但不要将其分配给任何变量。如果确实要对此进行编译,则会在此处抛出NullPointerException

addLoc.processLocation(mcsDomain.getText().toString(), friendlyName.getText().toString(),
        password.getText().toString());


getSharedPreferences()Context类的方法。在ProcessLocation.processLocation()中,您正在尝试调用它。 ProcessLocation类中不存在此方法。

您需要执行以下操作:

1)ProcessLocation需要具有Context引用,以便可以调用getSharedPreferences()。最简单的方法是在ProcessLocation类型的Context中声明一个成员变量,并在ProcessLocation的构造函数中对其进行初始化。像这样:

public class ProcessLocation {
    Context context;
    SharedPreferences domainToName;
    SharedPreferences nameToDomain;
    // Constructor
    ProcessLocation(Context context) {
        this.context = context;
    }


2)您需要创建ProcessLocation的实例。在AddLocation中,在使用变量addLoc之前,需要对其进行初始化。像这样:

    // Create instance of ProcessLocation and pass it the activity (Activity is a Context)
    addLoc = new ProcessLocation(getActivity);


3)使用Context中的ProcessLocation.processLocation(),如下所示:

    public void processLocation(String domain, String name, String password) {
        domainToName = context.getSharedPreferences("domainToName",  Context.MODE_PRIVATE);
        nameToDomain = context.getSharedPreferences("nameToDomain",  Context.MODE_PRIVATE);
        ...
    }


已经很晚了,我很累,而且我没有通过编译器来解决这个问题,所以如果我遗漏了逗号,分号或拼写错误,请原谅我。希望你能漂移。祝好运!

08-05 10:46