Tôi ghi đè các phương thức onCreateDialog và onPrepareDialog hoặc lớp Dialog.Android - Xử lý cuộc gọi trên màn hình Thay đổi hướng màn hình
Tôi đã làm theo ví dụ từ cuốn sách Phát triển ứng dụng Android chuyên nghiệp của Reto Meier, Chương 5 để kéo một số dữ liệu XML và sau đó sử dụng hộp thoại để hiển thị thông tin.
tôi đã về cơ bản theo nó chính xác nhưng thay đổi các biến cho phù hợp với lược đồ XML của riêng tôi như sau:
@Override
public Dialog onCreateDialog(int id) {
switch(id) {
case (SETTINGS_DIALOG) :
LayoutInflater li = LayoutInflater.from(this);
View settingsDetailsView = li.inflate(R.layout.details, null);
AlertDialog.Builder settingsDialog = new AlertDialog.Builder(this);
settingsDialog.setTitle("Provisioned Settings");
settingsDialog.setView(settingsDetailsView);
return settingsDialog.create();
}
return null;
}
@Override
public void onPrepareDialog(int id, Dialog dialog) {
switch(id) {
case (SETTINGS_DIALOG) :
String afpunText = " ";
if(setting.getAddForPublicUserNames() == 1){
afpunText = "Yes";
}
else{
afpunText = "No";
}
String Text = "Login Settings: " + "\n"
+ "Password: " + setting.getPassword() + "\n"
+ "Server: " + setting.getServerAddress() + "\n";
AlertDialog settingsDialog = (AlertDialog)dialog;
settingsDialog.setTitle(setting.getUserName());
tv = (TextView)settingsDialog.findViewById(R.id.detailsTextView);
if (tv != null)
tv.setText(Text);
break;
}
}
Nó hoạt động tốt cho đến khi tôi cố gắng thay đổi hướng màn hình, Khi tôi làm onPrepareDialog này được gọi nhưng tôi nhận được ngoại lệ con trỏ null trên tất cả các biến của tôi.
Lỗi vẫn xảy ra ngay cả khi tôi yêu cầu hoạt động của mình bỏ qua hướng màn hình trong tệp kê khai.
Vì vậy, tôi cho rằng có điều gì đó đã bị bỏ quên trong ví dụ trong cuốn sách tôi có cần ghi đè lên một phương pháp khác để lưu biến của tôi vào hoặc một cái gì đó không?
bây giờ tôi đã thêm như sau:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save UI state changes to the savedInstanceState.
// This bundle will be passed to onCreate if the process is
// killed and restarted.
savedInstanceState.putString("Username", setting.getUserName());
savedInstanceState.putString("Password", setting.getPassword());
savedInstanceState.putString("Server", setting.getServerAddress());
super.onSaveInstanceState(savedInstanceState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
settings.clear();
// Restore UI state from the savedInstanceState.
// This bundle has also been passed to onCreate.
username = savedInstanceState.getString("Username");
password = savedInstanceState.getString("Password");
serveraddress = savedInstanceState.getString("Server");
Settings setting = new Settings(username, password, serveraddress);
addNewSettings(setting);
}
Nhưng tôi vẫn nhận được những ngoại lệ Null Pointer
Hi seanhodges, Tôi làm theo các ví dụ trong ví dụ stack overflow bạn cung cấp, tôi đã thêm mã mới của tôi cho câu hỏi của tôi, nhưng tôi vẫn nhận được con trỏ Null trên dòng chính xác mà bạn đã đề cập - nếu (setting.getAddForPublicUserNames() == 1) { –
Hmm, tôi hy vọng nó sẽ hoạt động ngay bây giờ. Hãy thử gắn một điểm ngắt trong phương thức onRestoreInstanceState() của bạn và đảm bảo rằng "thiết lập" thực sự được thiết lập trước khi phương thức onPrepareDialog() cố gắng sử dụng nó ... – seanhodges
Có vẻ như đối tượng thiết lập của tôi là nguyên nhân của các con trỏ rỗng, Nó không được tạo ra/lưu hay cái gì đó? Tôi đã thay đổi tất cả các biến của mình trong lớp và loại bỏ việc sử dụng đối tượng cài đặt và ứng dụng chạy tốt ngay bây giờ. Q phần còn lại của buổi tối tìm hiểu lý do tại sao đối tượng của tôi không được lưu/tạo: ( –