특정 Fragment에서만 사용되는 메뉴 항목 inflate를 공통 Toolbar에 사용

10563 단어 FragmentAndroidmenu

개요


Activity가 보유한 Toolbar의 Overflow 메뉴에는 특정 Fragment에서만 사용하는 메뉴 항목을 삽입하는 방법이 고려됐다.

배경.


툴바가 있는 액티비티에서는 프래그먼트 A와 프래그먼트 B를 교체한다.Activity에서 툴바에 inflate에 있는 메뉴 항목이 Fragment A/B 양쪽에 모두 표시되기 때문에 Fragment A에 필요한 메뉴가 Fragment A를 표시할 때만 꺼내려고 합니다.

운영 환경


항목

Android OS
4.3
compileSdkVersion
25
buildToolsVersion
"25.0.3"

더 나은 실현 방법은 여기에 있다


이루어지다


onCreateView inflate로 menu를 만들었습니다. ondetach에 삽입된menu를 삭제하는 방법입니다.menu 대상을 삽입하고 삭제하는 Toolbar은 getActivity () 에서 가져온Activity 대상findViewById에서 가져옵니다.

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.graphics.ColorUtils;
import android.support.v7.widget.Toolbar;

public class FragmentA extends Fragment {

    //...

    @Nullable
    @Override
    public View onCreateView(
            final LayoutInflater inflater,
            @Nullable final ViewGroup container,
            @Nullable final Bundle savedInstanceState
    ) {
        //...
        inflateMenuToToolbar();
    }

    private void inflateMenuToToolbar() {
        final FragmentActivity activity = getActivity();
        final Toolbar toolbar = (Toolbar) activity.findViewById(R.id.toolbar);
        toolbar.inflateMenu(R.menu.fragment_a_menu);
        // チェックするタイプのメニューだったらチェックを入れる.
        // toolbar.getMenu().findItem(R.id.menu_checkable).setChecked(checked);
        toolbar.setOnMenuItemClickListener(item -> {
            if (item.getItemId() == R.id.menu_checkable) {
                // メニューがタップされた時の処理をここに記述.
                return true;
            }
            // Activity が持つメニューを呼び出す.
            return activity.onOptionsItemSelected(item);
        });
    }

    //...

    @Override
    public void onDetach() {
        super.onDetach();
        final Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
        toolbar.getMenu().removeItem(R.id.menu_checkable);
    }

미묘한 곳

  • Activity가 있는Toolbar의 ID(또는Activity 클래스로 정의된public 상수)
  • Activity에 Toolbar,null 검사가 있는지만 확인
  • 삽입된 menu
  • 를 하나씩 삭제해야 합니다.

    끝말


    해봤는데 이루어졌지만 느낌이 안 좋았어요.더 좋은 방법을 아시면 말씀해 주세요.

    참고 자료


    아래 블로그의 방법을 참고했습니다.
    - Android Fragment에서 Activity를 활용한 Toolbar

    추기


    위에서 내가 쓴 미묘한 점을 모두 해제하는 가장 적합한 방법은 로나0229씨의 평어가 나에게 알려주었기 때문에 저쪽 방법으로 수정했다.

    1. Toolbar이 있는 Activity에서 setSupportAction Bar


    Activity
        @Override
        protected void onCreate(final Bundle savedInstanceState) {
            // ...
            setSupportActionBar(binding.appBarMain.toolbar);
        }
    

    2. inflate Fragment 고유 메뉴


    onCreateView에서는 setHasOptionsMenu(true);라고 부르고, onCreate Options Menu에서는 inflate라고 부른다.
    Fragment
        @Nullable
        @Override
        public View onCreateView(
                final LayoutInflater inflater,
                @Nullable final ViewGroup container,
                @Nullable final Bundle savedInstanceState
        ) {
            // ...
            setHasOptionsMenu(true);
        }
    
        @Override
        public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
            super.onCreateOptionsMenu(menu, inflater);
            inflater.inflate(R.menu.search_menu, menu);
    
            final MenuItem item = menu.findItem(R.id.menu_checkable);
            // チェックするタイプのメニューだったらチェックを入れる.
            // item.setChecked(checked);
            item.setOnMenuItemClickListener(i -> {
                // メニューがタップされた時の処理をここに記述.
                return true;
             });
        }
    

    좋은 웹페이지 즐겨찾기