2011-11-13 40 views
7

Tôi đang cố gắng tham gia vào chương trình Android và tôi lấy một số ví dụ từ một cuốn sách. Trong trên các ví dụ được yêu cầu để đưa đoạn mã sau:Tại sao đối tượng Bundle luôn là null trên onCreate()?

public class ExemploCicloVida extends Activity { 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     Log.i(TAG, getClassName() + " onCreate() called on: " + icicle); 

     TextView t = new TextView(this); 
     t.setText("Exemplo de ciclo de vida de uma Activity.\nConsulte os logs no LogCat"); 
     setContentView(t); 
    } 
} 

Tôi tự hỏi tại sao đối tượng Bundle luôn là null về trường hợp này.

Trả lời

13

Gói sẽ không có giá trị nếu không có trạng thái đã lưu trước đó.

Điều này được đề cập trong Activity API documentation.

2

Chạy mã này và xoay màn hình bằng cách nhấn Ctrl + F11. Gói sẽ không rỗng.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    if (savedInstanceState != null) { 
     Toast.makeText(this, savedInstanceState.getString("s"), 
       Toast.LENGTH_LONG).show(); 
    } 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

    outState.putString("s", "hello"); 
} 

onSaveInstanceState(Bundle) sẽ được gọi. Sau đó, đối tượng hoạt động được tạo và onCreated(Bundle) sẽ được gọi với số không Bundle savedInstanceState.

+1

Cảm ơn wannik. API đã cho tôi manh mối và cũng là của bạn, tôi chỉ cần gõ Ctrl + F11 trên mã rất riêng của tôi, và icicle không còn null. –

8

Trong trường hợp của tôi, lý do là hoạt động cụ thể không có chủ đề được khai báo trong tệp kê khai.

Để khắc phục điều này, hãy mở AndroidManifest.xml, nhấp vào Ứng dụng, chọn hoạt động bị lỗi trong Nút ứng dụng và thêm chủ đề vào trường Chủ đề của Thuộc tính. Trong trường hợp của tôi, đó là

@style/Theme.AppCompat.Light.DarkActionBar 

nhưng bạn có thể sao chép chủ đề từ một trong các hoạt động khác của mình.

P .: Tôi biết đây là câu trả lời cho câu hỏi cũ, nhưng tôi đã tình cờ gặp nó trong khi tìm kiếm bản sửa lỗi và không tìm được giải pháp làm việc để có thể giúp người khác.

+1

cảm ơn bạn rất nhiều vì đầu vào của bạn vào điều này !!! Bạn đã cứu tôi rất nhiều đau đầu ... Tôi đã thay đổi chủ đề trong hoạt động trước đây của tôi nhưng không phải trong hoạt động mà tôi đã nhận được con trỏ null! Tôi sẽ không bao giờ mơ rằng đây là vấn đề! Một lần nữa ... cead dặm failte! –

+0

Bạn đang rất hoan nghênh! Tôi lãng phí rất nhiều thời gian để tìm ra nó vì vậy tôi vui mừng khi nghe nó giúp một người nào đó không đi qua tất cả điều này! –

0

Tôi đoán bạn muốn đọc các tham số tham gia hoạt động của mình. Sử dụng chức năng này:

protected String getStringExtra(Bundle savedInstanceState, String id) { 
String l; 
l = (savedInstanceState == null) ? null : (String) savedInstanceState 
      .getSerializable(id); 
if (l == null) { 
    Bundle extras = getIntent().getExtras(); 
    l = extras != null ? extras.getString(id) : null; 
} 
return l; 
} 
Các vấn đề liên quan