6

Tôi mới bắt đầu sử dụng Android và tôi đang phát triển ứng dụng Android nhỏ. Trong ứng dụng của tôi, tôi đang sử dụng thư viện Sherlock. Ứng dụng của tôi chứa một hoạt động chính và hai đoạn. Về cấu trúc đoạn danh sách của tôi trông giống nhưonCreateOptionsMenu được gọi trước khi bậtTạo android

public class MyCards extends SherlockListFragment 
     { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setHasOptionsMenu(true); 
     Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside fragment on create"); 

    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside on activity created"); 
    } 

    private void displayCards(int type) { 

     Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside display cards"); 

    } 

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

    } 

    @Override 
    public void onPause() { 
     super.onPause(); 

    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.mycards, container, false); 

     View view1 = inflater.inflate(R.layout.empty_card, container, false); 
     return view; 

    } 

    /*@Override 
    public void onPrepareOptionsMenu(Menu menu) { 
    super.onPrepareOptionsMenu(menu); 

    optionsMenu = menu; 
    }*/ 

    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     inflater.inflate(R.menu.menu_type2, menu); 

     Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside on create option menu"); 
     Spinner spinner = (Spinner) menu.findItem(R.id.cardType) 
       .getActionView(); 

     SpinnerAdapter adapter = ArrayAdapter.createFromResource(getSherlockActivity().getSupportActionBar().getThemedContext(), R.array.card_action_list,android.R.layout.simple_spinner_dropdown_item); 
     spinner.setAdapter(adapter); // set the adapter 

     spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 

      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, 
        int pos, long id) { 
       displayCards(pos); 
       Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside on option selected"); 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> arg0) { 
       displayCards(0); 
       Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside on no option selection"); 
      } 

     }); 


    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     Log.i("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "inside option select listener"); 

    } 

} 

Bây giờ vấn đề của tôi là khi tôi chuyển sang fro một đoạn khác đoạn cho lần đầu tiên nó mang lại cho dữ liệu ghi nhận sau

01-04 00:54:06.997: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(2575): inside on create option menu 
01-04 00:54:06.997: W/KeyCharacterMap(2575): No keyboard for id -1 
01-04 00:54:06.997: W/KeyCharacterMap(2575): Using default keymap: /system/usr/keychars/qwerty.kcm.bin 
01-04 00:54:07.020: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(2575): inside fragment on create 
01-04 00:54:07.036: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(2575): inside on activity created 

Đó có nghĩa là trên tạo tùy chọn được gọi trước khi tạo và tạo hoạt động. và nó cũng đưa ra hai cảnh báo. Điều này làm việc với bất kỳ lỗi nào. Nhưng tôi không thể hiển thị danh sách điểm của tôi

Bây giờ khi tôi lại chuyển sang cùng một đoạn (đối với lần thứ hai) nó mang lại sau dữ liệu ghi nhận

02-07 10:05:10.983: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(15844): inside on create option menu 
02-07 10:05:11.023: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(15844): inside fragment on create 
02-07 10:05:11.043: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(15844): inside on activity created 
02-07 10:05:11.113: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(15844): inside display cards 
02-07 10:05:11.133: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(15844): inside on option selected 

thời gian này nó không đưa ra bất kỳ cảnh báo và hoạt động đúng. Đồng thời hiển thị chế độ xem danh sách của tôi. Nhưng lần đầu tiên nó không hoạt động bình thường .. Một điểm khác là khi tôi chạy nó trên phiên bản cao hơn của android làm việc tốt của nó. Nhưng nếu tôi chạy nó trên phiên bản thấp hơn của android như 2.3.3 tôi cho thấy hành vi như vậy .. Tôi đọc về điều này ListFragment onPrepareOptionsMenu called before onCreate. Why and How to Fix/Bypass? Nhưng tôi không thể giải quyết vấn đề này.

nếu tôi xác định setHasOptionsMenu(true) bên onActivityCreated nó mang lại cho sản lượng sau

01-04 03:32:38.622: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(8157): inside fragment on create 
01-04 03:32:38.653: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(8157): inside on activity created 
01-04 03:32:38.692: I/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(8157): inside on create option menu 
01-04 03:32:38.700: W/KeyCharacterMap(8157): No keyboard for id -1 
01-04 03:32:38.700: W/KeyCharacterMap(8157): Using default keymap: /system/usr/keychars/qwerty.kcm.bin 

Tôi cũng đã cố gắng để thiết lập setHasOptionsMenu cho đoạn của tôi, nơi giao dịch đoạn thực tế diễn ra như dưới đây ..

@Override 
     public void onTabSelected(Tab tab, FragmentTransaction ft) { 
      MyCards mc = new MyCards(); 
      mc.setHasOptionsMenu(true); 
      ft = mActivity.getSupportFragmentManager().beginTransaction(); 

       mFragment = Fragment.instantiate(mActivity, mClass.getName(), 
         mArgs); 

       ft.add(android.R.id.content, mFragment, mTag); 
       ft.commit(); 
      } 

và vẫn còn đó đưa ra cùng một vấn đề.

bất kỳ sự cố nào với mã của tôi hoặc một số thứ khác? Vì vậy, làm thế nào để giải quyết vấn đề này. Cần giúp đỡ ... cảm ơn bạn ...

+0

Bạn có chắc chắn không phải vì bạn đang gọi 'setHasOptionsMenu' trước khi thực hiện đăng nhập onCreate? – Zharf

+0

Hi zharf cảm ơn bạn đã trả lời. xem câu hỏi của tôi edited .. và thay đổi đầu ra đăng nhập .. Nhưng điều này không giải quyết vấn đề của tôi .. – nilkash

Trả lời

1

Tôi không biết tại sao nó hoạt động như thế, nhưng làm điều này: Set tùy chọn setHasOptionsMenu(true) trong hoạt động của bạn khi bạn đang thêm mảnh của bạn với nó.

Ví dụ:

//Activity class 
YourListFragment f = new YourListFragment(); 

f.setHasOptionsMenu(true); //here 

getSupportFragmentManager().beginTransaction() 
.add(R.id.your_list_fragment_container, f).commit(); 

Và xóa thiết lập nó trong mã của đoạn bạn. Nó làm việc cho tôi.

+0

Hi michal cảm ơn bạn đã trả lời nhanh chóng .. Tôi đã thử giải pháp u r. Trong ứng dụng của tôi, tôi đang sử dụng các tab. Trong phương pháp ontabselected của tôi tôi đã thử giải pháp của bạn nhưng nó không làm việc cho tôi. Tôi đã cố gắng theo cách sau. 'MyCards my_card = new MyCards()' và 'my_card.setHasOptionsMenu (true)' .... Nhưng nó không hoạt động. Phương pháp này thậm chí không hoạt động trên phiên bản Android mới nhất cho tôi. Bất kỳ giải pháp nào khác. Cảm ơn bạn đã giúp đỡ ... – nilkash

+0

Điều gì làm bạn có nghĩa là phương pháp này thậm chí không hoạt động? Nó làm việc cho tôi trên Android 2.3 tốt như trên 4.2. –

+0

hi michal cảm ơn bạn đã trả lời. Tôi đã thử nó trên phiên bản 2.3.3 và ics nhưng nó không hoạt động ... Có gì sai với mã của tôi ... Cần giúp đỡ. – nilkash

28

viết setHasOptionsMenu(true); trong phương thức onActivityCreated(Bundle savedInstanceState).

+3

Điều này phải được đánh dấu là câu trả lời chính xác. – Horacio

+0

Nó phù hợp với tôi! – JaredLuo

+3

lý do: đối với một số phiên bản, thư viện hỗ trợ sẽ ngay lập tức tạo thanh thực đơn khi gọi setHasOptionsMenu (true) ... điều này có thể gây ra lỗi nếu bạn, ví dụ, cần bố cục đã được tăng cấp hoặc cần một số biến mẫu từ bố cục tăng cao. – chaqke

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