2013-08-08 25 views
17

Đoạn của tôi thay thế tùy chọn Hoạt động gốc bằng một mục tùy chọn cụ thể nhưng khi tôi nhấp vào mục, chỉ onOptionItemSelected của hoạt động được gọi là eventhough tôi đã ghi đè phương thức bên trong Phân đoạn. Tui bỏ lỡ điều gì vậy?Fragment's onOptionsItemSelected không được gọi là

phương pháp Fragment của:

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

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 

    Log.d(TAG, "Fragment.onCreateOptionsMenu"); 

    if (mPasteMode) { 
     menu.clear(); 
     inflater.inflate(R.menu.contexual_paste, menu); 
     getActivity().getActionBar().setTitle("PasteMode"); 
    } 
    super.onCreateOptionsMenu(menu, inflater); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    Log.d(TAG, "Fragment.onOptionsItemSelected"); 

    switch (item.getItemId()) { 
     case R.id.context_action_paste: 
      Toast.makeText(getActivity(), 
        "It worked ", 
        Toast.LENGTH_SHORT).show(); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

Hoạt động của phương pháp: đầu ra

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    Log.d(TAG, "MainActivitiy.onOptionsItemSelected"); 
    switch (item.getItemId()) { 
     case R.id.action_refresh: 
      Toast.makeText(this, "Action Refresh selected", Toast.LENGTH_SHORT).show(); 
      break; 
     default: 
      break; 
    } 
    return true; 
} 

Logcat:

MainActivity.onCreateOptionsMenu 
Fragment.onCreateOptionsMenu 
MainActivitiy.onOptionsItemSelected 

Vậy làm thế nào tôi có thể có onOptionsItemSelected của đoạn được gọi là?

Trả lời

30

Bạn không bị xâu chuỗi vào lớp cha trong các phương thức hoạt động. Vui lòng có onCreateOptionsMenu() trả lại super.onCreateOptionsMenu(menu) và có onOptionsItemSelected() trả lại super.onOptionsItemSelected(item) (ngoại trừ mặt hàng bạn đang xử lý, cần trả lại true để cho biết rằng bạn đã xử lý sự kiện).

+0

Cảm ơn, đã giải quyết được vấn đề. – Nima

+4

Cần lưu ý rằng setHasOptionsMenu (đúng) phải được gọi trong đoạn là –

+0

cổ vũ @TashPemhiwa – Patric

26

Nếu của Hoạt động của bạn onOptionsItemSelected phương pháp returs đúng, cuộc gọi được tiêu thụ trong hoạt động và onOptionsItemSelected Fragment của không được gọi. Vì vậy, trả về false trong hoạt động của bạn onOptionsItemChọn phương thức hoặc thực hiện lớp cha mẹ qua super.onOptionsItemSelected call (thực hiện mặc định trả về false).

Theo lớp Hoạt động javadoc, phương pháp Activity.onOptionsItemSelected nên:

Return sai cho phép xử lý đơn bình thường để tiếp tục, đúng với tiêu thụ nó ở đây

+0

Cảm ơn bạn rất nhiều, đây là câu trả lời rất rõ ràng –

+0

Tuyệt vời, đã giải quyết được vấn đề của tôi !!! – Jenny

+0

Cảm ơn bạn rất nhiều bạn đã tiết kiệm thời gian của tôi. – Shailesh

5

Trong trường hợp của tôi, tôi không thêm bất kỳ các mục menu (ví dụ: tôi không gọi onCreateOptionsMenu trong cả hoạt động hoặc đoạn). Tuy nhiên, tôi cần phải sử dụng nút home bar (up) hành động trong đoạn. Đối với điều này tôi đã phải đảm bảo rằng setHasOptionsMenu(true) được gọi trong phương pháp onCreateView() của mảnh trước khi điều này có thể hoạt động. Sau đó, tôi không cần ghi đè onOptionsItemSelected trong hoạt động của mình.

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