조각 그룹에서 옵션 메뉴에 항목을 추가하려고합니다.
새 MenuFragment클래스를 만들고 메뉴 항목을 포함하려는 조각에 대해 이것을 확장했습니다. 코드는 다음과 같습니다.
자바:
public class MenuFragment extends Fragment {
MenuItem fav;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
fav = menu.add("add");
fav.setIcon(R.drawable.btn_star_big_off);
}
}
코 틀린 :
class MenuFragment : Fragment {
lateinit var fav: MenuItem
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
fav = menu.add("add");
fav.setIcon(R.drawable.btn_star_big_off);
}
}
어떤 이유로 인해 onCreateOptionsMenu실행되지 않는 것 같습니다.
답변
super 메소드를 호출하십시오.
자바:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// TODO Add your menu entries here
super.onCreateOptionsMenu(menu, inflater);
}
코 틀린 :
override fun void onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
// TODO Add your menu entries here
super.onCreateOptionsMenu(menu, inflater)
}
코드에 로그 문을 넣어 메소드가 호출되지 않거나 메뉴가 메뉴에서 수정되지 않는지 확인하십시오.
또한 프래그먼트가 옵션 메뉴 처리에 참여해야 함을 알리기 위해 호출 setHasOptionsMenu(boolean)하고 있는지 확인하십시오 onCreate(Bundle).
답변
나는 같은 문제가 있었지만, 그것을 작동시키는 마지막 단계를 요약하고 소개하는 것이 낫다고 생각합니다.
-
Fragment의
onCreate(Bundle savedInstanceState)메소드 에 setHasOptionsMenu (true) 메소드를 추가하십시오 . -
onCreateOptionsMenu(Menu menu, MenuInflater inflater)조각의 메뉴에서 다른 작업을 수행하려는 경우 조각의 재정 의 및onOptionsItemSelected(MenuItem item)메서드. -
onOptionsItemSelected(MenuItem item)액티비티의 메소드 내 에서 메뉴 항목 조치가onOptionsItemSelected(MenuItem item)프래그먼트의 메소드 로 구현 될 때 false를 리턴해야합니다 .
예를 들면 :
활동
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.activity_menu_item:
// Do Activity menu item stuff here
return true;
case R.id.fragment_menu_item:
// Not implemented here
return false;
default:
break;
}
return false;
}
파편
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
....
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// Do something that differs the Activity's menu here
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.activity_menu_item:
// Not implemented here
return false;
case R.id.fragment_menu_item:
// Do Fragment menu item stuff here
return true;
default:
break;
}
return false;
}
답변
onCreateOptionsMenu(Menu menu, MenuInflater inflater)메소드가 호출되지 않는 것을 발견 하면 Fragment의 onCreate(Bundle savedInstanceState)메소드 에서 다음을 호출하십시오 .
setHasOptionsMenu(true)
답변
당신이 필요한 경우 menu를 새로 webview특정 내부에 Fragment, 당신은 사용할 수 있습니다 :
조각 :
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// TODO Add your menu entries here
inflater.inflate(R.menu.menu, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.exit:
System.exit(1);
break;
case R.id.refresh:
webView.reload();
break;
}
return true;
}
menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/exit" android:title="Exit" android:icon="@drawable/ic_action_cancel" />
<item android:id="@+id/refresh" android:title="Refresh" android:icon="@drawable/ic_action_refresh" />
</menu>
답변
TL; DR
사용 android.support.v7.widget.Toolbar하고 그냥 하십시오 :
toolbar.inflateMenu(R.menu.my_menu)
toolbar.setOnMenuItemClickListener {
onOptionsItemSelected(it)
}
독립형 툴바
제안 된 솔루션의 대부분은 상위 활동에 레이아웃에 툴바가 있고 를 통해 선언 한 setHasOptionsMenu(true)경우에만 작동 합니다 . 그러면 Fragments는이 정확한 ActionBar 의 메뉴 인구에 참여할 수 있습니다 .setSupportActionBar()
Fragment.onCreateOptionsMenu () : Fragment 호스트의 표준 옵션 메뉴의 내용을 초기화합니다.
하나의 특정 조각에 대한 독립형 도구 모음 및 메뉴를 원하는 경우 다음을 수행 할 수 있습니다.
menu_custom_fragment.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_save"
android:title="SAVE" />
</menu>
custom_fragment.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
...
CustomFragment.kt
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(layout.custom_fragment, container, false)
val toolbar = view.findViewById<Toolbar>(R.id.toolbar)
toolbar.inflateMenu(R.menu.menu_custom_fragment)
toolbar.setOnMenuItemClickListener {
onOptionsItemSelected(it)
}
return view
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.menu_save -> {
// TODO: User clicked the save button
true
}
else -> super.onOptionsItemSelected(item)
}
}
예, 그렇게 쉽습니다. onCreate()또는 을 재정의 할 필요도 없습니다 onCreateOptionsMenu().
추신 : 이것은와 만 작동 android.support.v4.app.Fragment하고 있습니다 android.support.v7.widget.Toolbar( AppCompatActivity및 AppCompat테마도 사용 하십시오 styles.xml).
답변
에서 menu.xml모든 메뉴 항목을 추가해야합니다. 그런 다음 초기 로딩에서 원하지 않는 항목을 숨길 수 있습니다.
menu.xml
<item
android:id="@+id/action_newItem"
android:icon="@drawable/action_newItem"
android:showAsAction="never"
android:visible="false"
android:title="@string/action_newItem"/>
setHasOptionsMenu(true)onCreate () 메소드에 추가 하여 Fragment 클래스의 메뉴 항목을 호출하십시오.
FragmentClass.java
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
onCreateOptionsMenuFragment 클래스에서 다시 재정 의 할 필요가 없습니다 . onPrepareOptionsMenuFragment에서 사용 가능한 방법 을 재정 의하여 메뉴 항목을 변경 (추가 / 제거) 할 수 있습니다 .
@Override
public void onPrepareOptionsMenu(Menu menu) {
menu.findItem(R.id.action_newItem).setVisible(true);
super.onPrepareOptionsMenu(menu);
}
답변
메뉴를 부풀리기 전에 menu.clear ()를 사용해야합니다.
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
inflater.inflate(R.menu.menu, menu);
super.onCreateOptionsMenu(menu, inflater);
}
과
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}