Android 툴바 다른 조각에 대한 메뉴 항목 추가


90

툴바와 탐색 서랍이 있습니다. 앱을 시작하면 도구 모음과 탐색 창이 만들어집니다. 탐색 창에서 항목을 클릭하면 새 조각이 시작되고 동일한 도구 모음이 유지됩니다. 기본적으로 특정 조각을 시작할 때 검색, 추가, 편집과 같은 메뉴 항목을 도구 모음에 추가하려면 어떻게해야합니까? 프로그램 시작시 원하지 않지만 동적으로 생성되었습니다. 또한 이러한 버튼을 클릭하여 다른 조각을 시작하도록하려면 어떻게해야합니까? 한 조각에서 도구 모음의 편집 단추가 다른 조각의 편집 단추에 비해 특정 작업을 수행하기를 원합니다. 감사!

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"
/>

답변:


169

조각에 유사한 코드를 추가합니다.

@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
조각에서 호출되는 onCreateOptionsMenu 메서드에 대해 setHasOptionsMenu (true)에 대한 호출이 필요하기 때문에 이것이 정답입니다.
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
주어진 링크는 더 이상 없다
아쉬 빈 solanki

26

가장 좋은 방법은 다음과 같습니다.

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 (true) 정말 도움이됩니다! Thank U
J.Dragon

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 2015 년

@JoeEigi 예, 사용자 정의 메뉴 xml을 확장하여 사용자 정의 메뉴를 가질 수 있습니다. 전화로 setTitle()제목을 추가 할 수 있습니다.
Ellie Zou 2015 년

@JoeEigi 당신이 틀린 문맥을 얻은 것 같습니다. 이것에 대해 살펴보십시오 : stackoverflow.com/questions/26998455/…
Allen Chan

1
매니페스트에서 액션 바를 껐지만 툴바 위의 활동 레이아웃에 여전히 표시됩니다. 이걸 어떻게 제거합니까
조 Eigi

네,을했고, 여전히 내 레이아웃에 표시되지만보기 밖으로 이동
조 Eigi을

10

가장 간단한 옵션은

toolbar.inflateMenu(R.menu.fragment_menu);

핸들 클릭 메뉴 항목

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

다음과 같이 부풀려진 메뉴의 clickListener : stackoverflow.com/a/26512114/2098878
Rafael

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에서 a의 메뉴가 여전히 프래그먼트 b의 도구 모음에 표시됨을 의미합니다.
Zeeshan Ahmed

조각 b의 onCreateView에서 setHasOptionsMenu (false)를 사용합니다.
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
단지 메뉴가 있는지 확인 = NULL을하는 명확한을 호출하기 전에 ()!
마포

2

다음은 조각이 다른 다양한 메뉴 옵션을 표시하는 단계입니다.

1 단계 : setHasOptionsMenu (true) 호출

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

XML 내부에이 줄 추가

app:menu="@menu/main_menu"

1
사실 당신 말이 맞아요! XML로 지정한 다음 조각에서 지정할 수 있습니다.```override fun onViewCreated (view : View, savedInstanceState : Bundle?) {super.onViewCreated (view, savedInstanceState) toolBar.setNavigationOnClickListener {activity? .onBackPressed ()} searchView = toolBar.menu.findItem (R.id.action_search) .actionView as 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.