Android: Khi nào onCreateOptionsMothy được gọi trong vòng đời Activity?


149

Tôi đặt một vài điểm dừng ở onCreate(một ở đầu và một ở cuối phương thức), và tôi cũng đặt một điểm dừng ở đầu onCreateOptionsMenu. Các onCreatephương pháp được gọi là đầu tiên, và trước khi nó kết thúc onCreateOptionsMenuđược gọi.

Tôi đang cố tách Fragmentmã điều hướng trong ứng dụng của mình, vì vậy tôi có một vài đối tượng mà tôi ủy quyền onCreateOptionsMenutùy thuộc vào việc ứng dụng có chạy trên điện thoại / máy tính bảng hay không (Tôi đang sử dụng kích thước màn hình để xác định điều này, tệp bố cục của tôi cho màn hình lớn có Chế độ xem tôi kiểm tra sau khi bố cục bị thổi phồng). Vấn đề tôi gặp phải là, tôi tạo các đối tượng này trong onCreate và tôi nhận được một ngoại lệ con trỏ null khi tôi tham chiếu đối tượng onCreateOptionsMenu.

Câu trả lời:


112

Phương thức onCreate được gọi đầu tiên và trước khi kết thúc onCreateOptionsMothy được gọi.

Điều đó sẽ đúng trên các thiết bị và ứng dụng có thanh hành động kiểu Honeycomb chính thức. Nếu không có thanh hành động, onCreateOptionsMenu()không nên gọi cho đến khi người dùng gọi menu, thường bằng cách nhấn nút MENU.

(Tôi đang sử dụng kích thước màn hình để xác định điều này, tệp bố cục của tôi cho màn hình lớn có Chế độ xem tôi kiểm tra sau khi bố cục bị thổi phồng)

Thử nghiệm đó sẽ phá vỡ rất sớm, một khi Ice Cream Sandwich xuất xưởng. Từ những gì tôi có thể nói, điện thoại ICS sẽ có các thanh hành động (mặc dù có lẽ không phải là thanh hệ thống).


Tôi quên đề cập rằng tôi đang sử dụng thư viện ActionbarSherlock. Câu trả lời của bạn nhắc nhở tôi. Đó có lẽ là lý do cho hành vi này, vì nó là một trình bao bọc trong thư viện tương thích, đặt các mục menu trong "ActionBar".
Christopher Perry

@commonsware - Điều đó có nghĩa là trên các thiết bị và ứng dụng không có thanh hành động. Menu sẽ hiển thị ngay cả khi onCreateOptionsMothy không có mục hiển thị?
NinjaCoder

12
trong trường hợp của tôi, cuộc gọi onCreateMothy sau onResume
Kostya Khuta

1
Vâng, tôi có cùng một vấn đề ... Nhưng mã của tôi có liên quan đến một mảnh.
Yoann Hercouet

Tôi bắt đầu có NPEkhi kiểm tra nếu nav drawer fragmentmở onCreateOptionsMenu. Tôi đã phải đặt kiểm tra null trong cả onCreateOptionsMothy của hoạt động, cũng như cuộc gọi lại mà đoạn đó đang sử dụng trong onCreateOptionsMothy của nó. Thực sự kỳ lạ bởi vì nó chỉ xảy ra trên một vài màn hình, nhưng nhất quán trên những màn hình đó.
theblang

54

Trong trường hợp của tôi trên Android 2.3 và với FragmentActivitythư viện hỗ trợ v4, thứ tự các phương thức vòng đời được gọi là:

07-18 18:29:21.629  20183-20183/? I/onCreate:
07-18 18:29:21.719  20183-20183/? I/onStart: 
07-18 18:29:21.719  20183-20183/? I/onResume: 
07-18 18:29:21.739  20183-20183/? I/onCreateOptionsMenu:

27

Tôi tìm thấy nếu trong onResume () tôi gọi

invalidateOptionsMenu();

sau đó onCreateOptionsMothy (Menu Menu) được gọi sau đó - theo vòng đời hoạt động (tôi nghĩ đó là thuật ngữ chính xác ở đây) , như được chỉ ra bởi @ tir38

@Override
public void onResume() {
    super.onResume();
    invalidateOptionsMenu();
}

4
Nếu bạn đang sử dụng actionbarsherlock thì hãy gọi phương thức nàysupportInvalidateOptionsMenu();
Shan Xeeshi

3
Hãy cẩn thận khi bạn nói "ngay lập tức". Nó sẽ không thực sự xảy ra ngay lập tức. Khi bạn invalidateOptionsMenu, một công việc (tái) tạo menu tùy chọn sẽ được thêm vào hàng đợi tin nhắn của UI. Bất cứ điều gì khác trong hàng đợi sẽ được chạy đầu tiên.
tir38

21

Ngoài ra trong câu trả lời ở trên, Trong trường hợp ICS và Honeycomb onCreateOptionsMothy được gọi sau onCreate và onPostCreate trong khi ở Gingerbread và các phiên bản trước đó, nó được gọi sau onCreate nhưng trước onPostCreate. Đó là sự khác biệt duy nhất tôi tìm thấy.


3

Theo kinh nghiệm của tôi ActionBarActivitytừ hỗ trợ v7 onCreateOptionsMenu()được gọi trong setContentView()phương thức ở giữa onCreate()nó xuất hiện vào ngày 4.1.1.

Nhưng vào ngày 4.4, một câu chuyện khác onCreateOptionMenu()được gọi sau onCreate(). Ngoài ra tôi không biết nó có thể ngay sau đó, có thể không. Nhưng là thực tế sau. Tôi đã không thử nghiệm trên các phiên bản khác nhưng 4.1.1 là lần đầu tiên tôi gặp rắc rối với thứ tự init.


Có lẽ bạn cần sử dụng supportInvalidateOptionsMenu()?
David d C e Freitas

2

tôi đề nghị tạo một hàm gọi lại trong đoạn của bạn để tránh các vấn đề về thời gian với onResume () và onCreateOptionsMothy ().

làm những công việc sau đây hoàn hảo cho tôi:

  1. tạo và thêm đoạn của bạn vào hoạt động của bạn
  2. để lại một tham chiếu của đoạn này trong hoạt động của bạn
  3. tạo một phương thức công khai doS SomethingWithTheMothy () trong đoạn của bạn
  4. gọi phương thức này từ bên trong hoạt động của bạn khi onCreateOptionsMothy (menu Menu) được gọi.

thí dụ:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (this.myFragment != null) {
        this.myFragment.doSomethingWithTheMenu(menu);
    }
    return true;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.