onCreateOptionsMenu ภายในแฟรกเมนต์


182

ฉันได้วางไว้setHasOptionsMenu(true)ข้างในonCreateViewแล้ว แต่ยังไม่สามารถโทรหาonCreateOptionsMenuชิ้นส่วนภายใน

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
                         Bundle savedInstanceState) {   
   setHasOptionsMenu(true);             
   return inflater.inflate(R.layout.facesheet, container, false);
}

ด้านล่างเป็นonCreateOptionsMenuรหัสของฉัน

@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
    getSupportMenuInflater().inflate(R.menu.layout, menu);
    return (super.onCreateOptionsMenu(menu));
}

ข้อความแสดงข้อผิดพลาดที่ฉันได้รับ:

วิธีการonCreateOptionsMenu(Menu)พิมพ์ส่วนจะต้องแทนที่หรือใช้วิธีการ supertype


1
ขอบคุณสำหรับ 'setHasOptionsMenu (true);' ฉันกำลังมองหาสิ่งนั้นอยู่
Fabricio PH

คำตอบ:


497

ลองนี้

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_sample, menu);
    super.onCreateOptionsMenu(menu,inflater);
}

และในonCreateเพิ่มบรรทัดนี้เพื่อให้ตัวเลือกที่ปรากฏในของคุณToolbar

setHasOptionsMenu(true);

182
จะไม่ถูกเรียกหากคุณไม่เพิ่มบรรทัดนี้:setHasOptionsMenu(true);
Yoann Hercouet

10
onCreateOptionsMenu () สำหรับแฟรกเมนต์มีอาร์กิวเมนต์ที่แตกต่างจากกิจกรรม
Jorge

3
และประเภทผลตอบแทนที่แตกต่างกันเป็นโมฆะซึ่งแตกต่างจากบูลีนของ onCreateOptionsMenu () ในกิจกรรมดังกล่าวข้างต้น ans
เด็กซ์เตอร์

4
หมายเหตุที่น่าสนใจ: หากคุณแทนที่ onCreateOptionsMenu ในกิจกรรมที่มีอยู่ของคุณรายการเมนูตัวเลือกทั้งสองจะปรากฏขึ้น
Adam Johns

5
setHasOptionsMenu(true);จะต้องถูกเรียกonCreate()ให้สมบูรณ์
Roel

21

คุณมีไฟล์ที่สร้างอัตโนมัติ/ res / menu.xml ที่กำหนดaction_settingsแล้ว

ในMainActivity.javaของคุณมีวิธีการดังต่อไปนี้:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case R.id.action_settings:
            // do stuff, like showing settings fragment
            return true;
    }

    return super.onOptionsItemSelected(item); // important line
}

ในonCreateView()วิธีการโทรแฟรกเมนต์ของคุณ:

setHasOptionsMenu(true); 

และเพิ่มวิธีการทั้งสองนี้:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.fragment_menu, menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case R.id.action_1:
            // do stuff
            return true;

        case R.id.action_2:
            // do more stuff
            return true;
    }

    return false;
}

สุดท้ายเพิ่มไฟล์ใหม่ความละเอียด / เมนู / fragment_menu.xmlกำหนดACTION_1และaction_2

วิธีนี้เมื่อแอพของคุณแสดง Fragment เมนูจะมี 3 รายการ:

  • action_1จากres / menu / fragment_menu.xml
  • action_2จากres / menu / fragment_menu.xml
  • action_settingsจากres / menu / menu.xml

1
คำถามอยู่ในเศษเล็กเศษน้อยไม่ใช่กิจกรรม
OlivierM

2
@OlivierM คำตอบนี้อธิบายเมนูส่วนได้ ฉันชื่นชมคำอธิบายว่ามันโต้ตอบกับเมนูกิจกรรมอย่างไร
Aranda

13

ฉันลองใช้ @Alexander Farber และ @Sino Raj ตอบ ทั้งสองคำตอบนั้นดี แต่ฉันไม่สามารถใช้ onCreateOptionsMenu ในส่วนของฉันได้จนกว่าฉันจะค้นพบสิ่งที่ขาดหายไป:

เพิ่ม setSupportActionBar (แถบเครื่องมือ) ในกิจกรรมของฉันเช่นนี้:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.id.activity_main);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
}

ฉันหวังว่าคำตอบนี้จะเป็นประโยชน์สำหรับคนที่มีปัญหาเดียวกัน


4

โทร

setSupportActionBar(toolbar)

ภายใน

onViewCreated(...) 

ของชิ้นส่วน

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
    ((MainActivity)getActivity()).setSupportActionBar(toolbar);
    setHasOptionsMenu(true);
}

1
 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_add_customer, container, false);
        setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_sample, menu);
    super.onCreateOptionsMenu(menu,inflater);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.