2009-02-25 26 views
19

Tôi đang sử dụng Intents để chuyển đổi giữa các hoạt động trong ứng dụng Android của mình. Tôi đang đưa dữ liệu vào Intent để sử dụng trong hoạt động tiếp theo. Khi tôi chuyển đổi điện thoại giữa chế độ ngang và dọc, các giá trị được truyền từ mục đích bị mất và tôi nhận được NullPointerException.Android - chuyển đổi giữa chế độ ngang và dọc làm cho Intent bị mất giá trị

Ai đó có thể vui lòng cho tôi biết điều gì có thể sai.

Có nhiều mã để đăng hoàn toàn. Nhưng nếu ai đó cần xem xét các phần cụ thể của mã, tôi có thể đăng nó ở đây.

Chỉnh sửa
Tôi đã giải quyết được vấn đề trạng thái không được lưu. Nhưng một vấn đề khác mà tôi phải đối mặt là không có nút nào trên màn hình hoạt động sau khi định hướng đã được thay đổi. Khi nhấn nút, tôi nhận được cảnh báo này trong LogCat

02-25 23:07:49.190: WARN/WindowManager(58): No window to dispatch pointer action 0 

Xin vui lòng trợ giúp.

Trả lời

23

Khi bạn chuyển hướng định hướng, hoạt động được tạo lại và onCreate được thu hồi để bạn phải sử dụng gói để lưu trạng thái hiện tại và khôi phục sau khi thay đổi hướng. Bạn có thể thấy điều này trong hành động nếu bạn chỉ có một ứng dụng có TextView và bạn nhập văn bản và thay đổi hướng. Nếu bạn nhóm trạng thái của mình thành onCreate, bạn có thể hạn chế điều này. Đây có lẽ cũng là lý do tại sao bạn có một NullPointer sau khi thay đổi định hướng. Đó là khó chịu như tất cả các địa ngục nhưng một cái gì đó chúng ta phải sống với.

This liên kết trên một loạt hướng dẫn định hướng và this first one nói riêng sẽ giúp bạn hiểu chính xác những gì đang diễn ra và cách duy trì thành công trạng thái hiện tại của bạn.

Cập nhật: Ngoài ra còn có một bài đăng trên SO Activity restart on rotation Android đề cập đến gần như giống nhau.

Chỉnh sửa để theo dõi câu hỏi:

Bạn đã đính kèm lại trình xử lý nhấp chuột sau khi thay đổi định hướng chưa?

+0

Tại sao câu hỏi cuối cùng? Điều quan trọng là phải đính kèm lại người nghe? Làm ơn cho tôi biết. :) –

+0

Có, bởi vì nếu bạn không đính kèm lại chúng, chúng sẽ vẫn được đính kèm với các nút cũ không tồn tại nữa. –

+1

+1 cảm ơn! Tôi chỉ bị mắc kẹt với lỗi này trong một giờ qua. Tôi đã thực sự ghét Android Development! Nó làm phức tạp những điều tầm thường. –

5

Hãy thử điều này:

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putString(SOME_KEY, "blah blah blah"); 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    ... 
    somevalue = savedInstanceState.getString(SOME_KEY); 
    ... 
} 
3

Nó có thể tuyên bố một android thuộc tính: configChanges với giá trị của "định hướng", điều này sẽ ngăn chặn hoạt động không bị khởi động lại. Thay vào đó, hoạt động vẫn chạy và phương thức onConfigurationChanged() của nó được gọi.

+0

Thêm thẻ này vào thẻ hoạt động – sami

8

Viết này trong file..in biểu hiện của bạn hoạt động nào bạn muốn này--

android:configChanges="orientation|keyboardHidden" 

được sửa đổi: Sử dụng này cho các API mới versions--

android:configChanges="orientation|keyboardHidden|screenSize" 

Chắc chắn nó sẽ công việc ..

+0

Điều này đã được sử dụng trong trình giả lập. Nhưng không làm việc trong thiết bị thực. – enadun

+0

Điều này cũng sẽ hoạt động trên thiết bị thực. Hãy chắc chắn rằng bạn đã thêm điều này vào hoạt động mà vấn đề xảy ra. – Hulk

+0

không hoạt động !!!! –

1

Khai báo < android:configChanges="orientation|keyboardHidden"/> trong tệp kê khai của bạn. Điều này cho phép bạn tự quản lý thay đổi chế độ Định hướng/Bàn phím. Tất nhiên, bạn không cần phải ghi đè phương thức gọi lại để quản lý nó.

0

Xin chào, tôi cũng gặp sự cố này. gì cố định nó đối với tôi là:

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    // Save the user's current game state 
    savedInstanceState.putString("Username", mUsername); 
    savedInstanceState.putString("Password", mPassword); 
    savedInstanceState.putString("UserID", mUserID); 

    // Always call the superclass so it can save the view hierarchy state 
    super.onSaveInstanceState(savedInstanceState); 
} 

và sau đó trong onCreate():

if (savedInstanceState == null) { 
    Bundle extras = getIntent().getExtras(); 
    if(extras == null) { 
     mUsername = "?"; 
     mPassword = "?"; 
     mUserID = "?"; 
    } else { 
     mUsername = extras.getString("Username"); 
     mPassword = extras.getString("Password"); 
     mUserID = extras.getString("UserID"); 
    } 
} else { 
    mUsername = (String) savedInstanceState.getSerializable("Username"); 
    mPassword = (String) savedInstanceState.getSerializable("Password"); 
    mUserID = (String) savedInstanceState.getSerializable("UserID"); 
} 

sau đó bạn có thể chắc chắn các đối tượng không phải là null.

Các vấn đề liên quan