22

Tôi có mảnh sau đây trong ứng dụng của tôi:onCreateOptionsMenu gọi sau onResume trên JB 4.2

public class MyFragment extends SherlockListFragment implements LoaderManager.LoaderCallbacks<Cursor> { 
    private MenuItem refresh = null; 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    setHasOptionsMenu(true); 

    //..... 

    // NPE here 
    refresh.setActionView(R.layout.indeterminate_progress_action); 
    getActivity().getSupportLoaderManager().initLoader(0, null, this); 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    inflater.inflate(R.menu.refresh_menu, menu); 
    refresh = (MenuItem) menu.findItem(R.id.menu_item_refresh); 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    mAdapter.swapCursor(data); 
    refresh.setActionView(null); 
    } 
} 

Về cơ bản khi người dùng khởi động Hoạt động Tôi muốn hiển thị một spinner tiến bộ, trong actionbar, cho đến khi bộ nạp hoàn tất. Trước khi Android 4.2 mọi thứ hoạt động tốt. Trên Android 4.2, tôi nhận được lỗi sau:

11-24 13:37:14.811: E/AndroidRuntime(17850): Caused by: java.lang.NullPointerException 
11-24 13:37:14.811: E/AndroidRuntime(17850): at com.MyApp.library.fragments.MyFragment.onActivityCreated(TabFragment.java:65) 

Sau khi thêm một số điểm ngắt tôi đã nhận ra onCreateOptionsMenu đã được gọi sau onActivityCreated. Có sự kiện vòng đời nào khác mà tôi có thể sử dụng không? Có cách nào tốt hơn để đạt được hiệu quả mong muốn?

+2

Um, tại sao không di chuyển 'setActionView của bạn() 'gọi cho' onCreateOptionsMenu() ', sau đó? Và có lẽ làm điều đó tùy thuộc vào việc tải có được thực hiện hay không? – CommonsWare

+0

Kinda hoạt động. Có vẻ như 'onCreateOptionsMenu' được gọi sau' onLoadFinished'. Vì tôi có các tab có nhiều bộ tải 'hasRunningLoaders' không hữu ích trong việc xác định xem tải đã kết thúc chưa. Đoán tôi sẽ phải sử dụng một giá trị Boolean để theo dõi trạng thái. – Frohnzie

+6

Sự cố Android: http://code.google.com/p/android/issues/detail?id=39721 – Frohnzie

Trả lời

3

Tôi đã sử dụng onPrepareOptionsMenu theo cách này để đạt được những gì bạn đang cố gắng làm. (không kiểm tra nhưng phải cung cấp cho bạn một ý tưởng.)

private boolean mIsLoading = true; 

@Override 
public void onPrepareOptionsMenu(Menu menu) { 
    super.onPrepareOptionsMenu(menu); 
    refresh = (MenuItem) menu.findItem(R.id.menu_item_refresh); 
    if (!mIsLoading) { 
     refresh.setActionView(null); 
    } 
} 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    mAdapter.swapCursor(data); 
    mIsLoading = false; 
    getActivity().invalidateOptionsMenu(); 
} 
+0

Làm thế nào đến onPrepareOptionsMenu phương thức trả về void; Tôi nghĩ rằng tôi chỉ thấy một con mèo âm hộ; sợ tâm trí quái dị của tôi – DJphy

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