我意识到这个问题已经被触及了无数次,但是我尝试的任何事情都没有为我工作。尝试访问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);
...
}
已经很晚了,我很累,而且我没有通过编译器来解决这个问题,所以如果我遗漏了逗号,分号或拼写错误,请原谅我。希望你能漂移。祝好运!