2010-06-10 15 views
10

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

Trả lời

4

Tôi không có cuốn sách Reto của vì vậy tôi không thể kiểm tra mã, nhưng nếu có một sai lầm trong cuốn sách bạn có thể liên hệ với anh ấy một cách dễ dàng trên Twitter để thảo luận về nó: http://twitter.com/retomeier

Hãy nhớ rằng nếu hướng màn hình thay đổi, hoạt động của bạn sẽ được tạo lại. Điều đó có nghĩa là bất kỳ biến nào bạn đặt trong khoảng thời gian gần nhất, không tĩnh, sẽ bị mất sau khi hoạt động được tạo lại theo hướng mới.

tôi đoán là bạn nhấn một NullPointerException đây:

if(setting.getAddForPublicUserNames() == 1){ 

Nếu vậy, có khả năng nhất mà một số hành động người dùng thay đổi các "thiết lập" biến để một cái gì đó khác hơn là null - bạn cần phải đảm bảo điều này được đặt lại khi hoạt động được tạo lại.

Phương pháp chuẩn nhất để lưu trữ/lấy ra trạng thái hoạt động giữa định hướng được trình bày chi tiết ở đây: Saving Android Activity state using Save Instance State

+0

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) { –

+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

+0

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: ( –

2

Khi bạn thay đổi hướng, Android khởi động lại hoạt động của bạn, bạn cần để lưu di sản với

onSaveInstanceState 

và phục hồi với

savedInstanceState 
0

Nếu bạn không muốn hoạt động phải được tái tạo khi định hướng thay đổi. Chèn dòng sau vào tệp AndroidManifest.xml.

android:configChanges="keyboardHidden|orientation 

dụ:

<activity android:name=".FABSLogin" android:label="@string/app_name" android:theme="@style/Theme.NoWindowTitle" android:noHistory="true" **android:configChanges="keyboardHidden|orientation**"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>

+0

Đối với tôi, câu trả lời này là cách nhanh nhất để sửa tất cả các lỗi liên quan đến thay đổi hướng màn hình. Tôi trong khi tích hợp hộp thoại Facebook Người dùng vẫn có thể sử dụng bàn phím phần cứng – OneWorld

+10

Nó có thể "có vẻ" để làm việc nhưng chỉ ẩn vấn đề. – rf43