แถบเครื่องมือ Android การเพิ่มรายการเมนูสำหรับชิ้นส่วนต่างๆ


92

ฉันมีแถบเครื่องมือและลิ้นชักการนำทาง เมื่อฉันเริ่มแอปแถบเครื่องมือและลิ้นชักการนำทางจะถูกสร้างขึ้น เมื่อฉันคลิกรายการในลิ้นชักการนำทางมันจะเริ่มชิ้นส่วนใหม่และคงแถบเครื่องมือเดิมไว้ โดยพื้นฐานแล้วฉันจะเพิ่มรายการเมนูลงในแถบเครื่องมือได้อย่างไรเช่นค้นหาเพิ่มแก้ไขเมื่อฉันเริ่มชิ้นส่วนเฉพาะ ฉันไม่ต้องการให้พวกเขาเมื่อเริ่มต้นโปรแกรม แต่สร้างขึ้นแบบไดนามิก นอกจากนี้ฉันจะคลิกปุ่มเหล่านี้และเริ่มต้นส่วนอื่น ๆ ได้อย่างไร ฉันต้องการให้ในส่วนเดียวปุ่มแก้ไขในแถบเครื่องมือทำสิ่งที่เฉพาะเจาะจงเมื่อเทียบกับปุ่มแก้ไขในส่วนอื่น ขอบคุณ!

Menu_toolbar:

<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<item android:id="@+id/edit"
    android:orderInCategory="1"
    android:title="Edit"
    app:showAsAction="always"
    android:icon="@drawable/pencil_icon"/>
<item android:id="@+id/add"
    android:orderInCategory="1"
    android:title="Add"
    app:showAsAction="always"
    android:icon="@drawable/plus_icon"/>

แถบเครื่องมือ:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="55dp"
android:background="#10a1ff"
android:title="Home"
/>

คำตอบ:


172

เพิ่มรหัสที่คล้ายกันให้กับชิ้นส่วนของคุณ:

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


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

ด้วยวิธีนี้คุณสามารถปรับแต่งเมนูสำหรับชิ้นส่วนของคุณ


19
นี่เป็นคำตอบที่ถูกต้องเนื่องจากการเรียก setHasOptionsMenu (true) จำเป็นสำหรับเมธอด onCreateOptionsMenu ที่ถูกเรียกในแฟรกเมนต์
John Slavick

15
อย่าลืมเกี่ยวกับการโทรmenu.clear()เข้าonCreateOptionsMenu- มิฉะนั้นคุณจะได้รับเมนูจากผู้ปกครองด้วย
Dart Dega

@DartDega ที่ฉันใส่รหัสเพื่อล้าง? ส่วนย่อยหรือกิจกรรมครับผมไม่เห็นเมนูในส่วนของฉัน
famfamfam

สิ่งนี้ใช้ได้กับ API ระดับ 28 หรือไม่ ฉันยังคงเห็นรายการเมนูกิจกรรมหลัก
ArdenDev

33

นี่คือวิธีสร้างเมนูแบบไดนามิก: http://www.101apps.co.za/index.php/articles/using-toolbars-in-your-apps.html

แก้ไข:

Toolbar actionBarToolBar = (Toolbar) findViewById(R.id.my_toobar);
setSupportActionBar(actionBarToolBar);
actionBarToolBar.setNavigationIcon(R.drawable.icon);
actionBarToolBar.setNavigationContextDescription(getResources().getString(R.string.desc);
actionBarToolBar.setLogo(R.drawable.other_icon);
actionBarToolBar.setLogoDescription(getResources().getString(R.string.other_desc);
actionBarToolBar.inflateMenu(R.menu.fragment_menu);

4
ใช้actionBarToolbar.setOnMenuItemClickListener()เพื่อจัดการการทำงานของรายการเมนู onOptionsItemSelected()ไม่ได้รับการเรียกในสถานการณ์นี้
Lahiru Chandima

2
ลิงค์ที่ให้มาไม่มีอีกแล้ว
Ashvin solanki

28

วิธีที่ดีที่สุด:

1. ค้นหาแถบเครื่องมือในกิจกรรมและตั้งเป็น supportActionBar

Toolbar actionBarToolBar = (Toolbar) findViewById(R.id.my_toobar);
setSupportActionBar(actionBarToolBar);

2. จากนั้นจะเป็นชิ้นเค้กสำหรับจัดการเมนูตัวเลือกสำหรับชิ้นส่วนต่างๆในกิจกรรมเดียวกัน ทำสิ่งต่างๆในแต่ละส่วนตามที่คุณต้องการ:

ในการเรียกวิธี OnCreateView

setHasOptionsMenu(true);

และสุดท้ายนี้

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

และในการจัดการรายการเมนูเรามี onOptionsItemSelected:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_search :
            Log.i("item id ", item.getItemId() + "");
        default:
            return super.onOptionsItemSelected(item);
    }
}

1
setHasOptionsMenu (จริง) มีประโยชน์มาก! ขอบคุณ U
J.Dragon

11

ตัวเลือกที่ง่ายที่สุดคือทำ

toolbar.inflateMenu(R.menu.fragment_menu);

และสำหรับการจัดการคลิกที่รายการเมนู

toolbar.setOnMenuItemClickListener {
    when (it.itemId) {
        R.id.nav_example -> doThat()
    }
    true
}

clickListener สำหรับเมนูที่สูงเกินจริง: stackoverflow.com/a/26512114/2098878
Rafael

10

แทนที่onCreateOptionsMenuวิธีการในทุกส่วนของคุณ

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

@JoeEigi ทำไมคุณถึงต้องการแถบเครื่องมือที่แตกต่างกัน? คุณสามารถตั้งชื่อเรื่องและเมนูต่างๆได้
Ellie Zou

@JoeEigi ใช่คุณสามารถมีเมนูที่กำหนดเองได้โดยขยาย xml เมนูที่กำหนดเอง โทรsetTitle()สามารถเพิ่มชื่อเรื่อง
Ellie Zou

@JoeEigi ดูเหมือนว่าคุณมีบริบทที่ไม่ถูกต้องลองดูสิ่งนี้: stackoverflow.com/questions/26998455/…
Allen Chan

1
ฉันปิดแถบการดำเนินการในรายการของฉัน แต่ยังคงปรากฏในเค้าโครงกิจกรรมของฉันเหนือแถบเครื่องมือ ฉันจะกำจัดสิ่งนี้ได้อย่างไร
Joe Eigi

ใช่ทำอย่างนั้นและยังคงปรากฏในเค้าโครงของฉัน แต่ถูกย้ายออกจากมุมมอง
Joe Eigi

4

ฉันแก้ไขปัญหานี้อย่างถูกต้อง ทางออกของฉันคือรหัสต่อไปนี้:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    mRootView = inflater.inflate(R.layout.fragment_order_history, container, false);
    //getActivity().invalidateOptionsMenu();


    setHasOptionsMenu(true);

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

ใช่ฉันแสดงเมนูอย่างถูกต้อง แต่วิธีซ่อนเมนูนี้เมื่อปิดส่วนย่อยฉันหมายถึงเมื่อเราเปลี่ยนไปใช้ส่วนอื่นเช่นจาก a -> b เมนูของแถบเครื่องมือที่ยังคงปรากฏให้เห็นในแถบเครื่องมือของส่วน b
Zeeshan Ahmed

ใช้ setHasOptionsMenu (false) ใน onCreateView ของแฟรกเมนต์ b.
Kannan_SJD

4

ฉันมีปัญหาเดียวกันและฉันต้องการแทนที่เมนูแถบเครื่องมือตามส่วนที่แสดง

ปัญหาที่ฉันพบตอนนี้คือมีการเพิ่มเมนูไปยังเมนูก่อนหน้านี้

เพื่อที่จะแสดงเฉพาะเมนูสำหรับส่วนฉันขอแนะนำ:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
     menu.clear(); //Empty the old menu
     inflater.inflate(R.menu.menu_fragment1, menu);
     super.onCreateOptionsMenu(menu, inflater);
}

หวังว่ามันจะช่วยได้


2
เพียงตรวจสอบว่า menu! = null ก่อนโทรไปที่. clear ()
mapo

2

ด้านล่างนี้เป็นขั้นตอนในการแสดงตัวเลือกเมนูต่างๆที่มีส่วนต่างๆ

ขั้นตอนที่ 1: เรียก setHasOptionsMenu (จริง)

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        setHasOptionsMenu(true)
        super.onViewCreated(view, savedInstanceState)

    }

ขั้นตอนที่ 2: ขยายรายการเมนูตัวเลือกที่เกี่ยวข้องกับชิ้นส่วนของคุณ

override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
    // To clear previously added menu items
    menu?.clear()
    inflater?.inflate(R.menu.your_fragment_menu, menu)
    super.onCreateOptionsMenu(menu, inflater)
}

สิ่งนี้ช่วยให้ฉันลบปุ่มเมนูที่ไม่ต้องการซึ่งปรากฏในเมนูใหม่ของฉัน
Im Batman

1

Inside XML เพิ่มบรรทัดนี้

app:menu="@menu/main_menu"

1
ที่จริงคุณพูดถูก! คุณสามารถระบุโดย xml จากนั้นในแฟรกเมนต์: `` แทนที่ความสนุก onViewCreated (view: View, savedInstanceState: Bundle?) {super.onViewCreated (view, savedInstanceState) toolBar.setNavigationOnClickListener {activity? .onBackPressed ()} searchView = toolBar.menu.findItem (R.id.action_search) .actionView เป็น SearchView searchView.setOnQueryTextListener (this)} ``
user3193413

0

การใช้MaterialToolbarใหม่มันง่ายมากที่จะสร้างเมนูล้นและใช้เพื่อ:

<com.google.android.material.appbar.MaterialToolbar
        android:id="@+id/toolbar"
        android:layout_width="0dp"
        android:layout_height="?attr/actionBarSize"
        app:navigationIcon="@drawable/ic_menu"
        app:menu="@menu/main_menu"/>

จากนั้นในรหัสเพื่อตั้งค่า OnCLick Listeners เพียงเพิ่มสิ่งนี้:

toolbar.setOnMenuItemClickListener {
            // .. DO SOMETHING HERE
            false
        }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.