특정 Fragment에서만 사용되는 메뉴 항목 inflate를 공통 Toolbar에 사용
개요
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);
}
미묘한 곳
이루어지다
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);
}
미묘한 곳
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);
}
끝말
해봤는데 이루어졌지만 느낌이 안 좋았어요.더 좋은 방법을 아시면 말씀해 주세요.
참고 자료
아래 블로그의 방법을 참고했습니다.
- 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;
});
}
Reference
이 문제에 관하여(특정 Fragment에서만 사용되는 메뉴 항목 inflate를 공통 Toolbar에 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/toastkidjp/items/c56594c09725c54af6b1
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
아래 블로그의 방법을 참고했습니다.
- 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;
});
}
Reference
이 문제에 관하여(특정 Fragment에서만 사용되는 메뉴 항목 inflate를 공통 Toolbar에 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/toastkidjp/items/c56594c09725c54af6b1
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
@Override
protected void onCreate(final Bundle savedInstanceState) {
// ...
setSupportActionBar(binding.appBarMain.toolbar);
}
@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;
});
}
Reference
이 문제에 관하여(특정 Fragment에서만 사용되는 메뉴 항목 inflate를 공통 Toolbar에 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/toastkidjp/items/c56594c09725c54af6b1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)