我在片段中看不到选项菜单

Posted

技术标签:

【中文标题】我在片段中看不到选项菜单【英文标题】:I don't see the option menu in the fragment 【发布时间】:2021-06-25 19:01:50 【问题描述】:

我正在制作Bottom Navigation View

切换屏幕时显示片段。

但是,当切换到 Fragment 时,右上角的 icon (Option menu) 不可见。

出于类似原因,作为解决方案,我添加了setHasOptionsMenu(true),但选项菜单仍然不可见。

MainActivity.xml

<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    tools:context=".activity.MainActivity">

    <FrameLayout
        android:id="@+id/content_layout"
        android:layout_
        android:layout_
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toTopOf="@id/bottom_nav"/>

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottom_nav"
        android:layout_
        android:layout_
        android:background="?android:attr/windowBackground"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:menu="@menu/bottom_nav_menu"/>
</androidx.constraintlayout.widget.ConstraintLayout>

fragment.java

public class WorkoutListFragment extends Fragment 
    RecyclerView rcv_dailyRecord;
    TextView mainNotifyText;
    Toolbar toolbar;
    LinearLayoutManager lm;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) 
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.activity_workout_list, container, false);
        initViews(rootView);
        setHasOptionsMenu(true);
        return rootView;
    

    public void initViews(View v) 
        rcv_dailyRecord = v.findViewById(R.id.rcv_dailyrecord);
        toolbar = v.findViewById(R.id.toolbar);
        mainNotifyText = v.findViewById(R.id.main_notification_text);
    

    @Override
    public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) 

        inflater = getActivity().getMenuInflater();
        inflater.inflate(R.menu.record_item_add, menu);
    

fragment.xml

<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    tools:context=".activity.WorkoutListActivity">
    <androidx.coordinatorlayout.widget.CoordinatorLayout
        android:id="@+id/coordinator"
        android:layout_
        android:layout_
        app:layout_constraintTop_toTopOf="parent">
        <com.google.android.material.appbar.AppBarLayout
            android:id="@+id/appbar"
            android:layout_
            android:layout_
            app:elevation="0dp"
            android:theme="@style/Theme.AppBarOverlay">
            <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_
                android:layout_
                app:title="LIST"
                app:titleTextColor="@color/black"
                app:titleMarginStart="30dp"
                android:paddingRight="30dp"
                android:theme="@style/Theme.PopupOverlay"/>
        </com.google.android.material.appbar.AppBarLayout>

        <FrameLayout
            android:layout_
            android:layout_
            app:layout_constraintTop_toBottomOf="@id/toolbar"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">

            <TextView
                android:id="@+id/main_notification_text"
                android:layout_
                android:layout_
                android:text="CHOOSE WORKOUT"
                android:textSize="16dp"
                android:gravity="center"
                android:layout_gravity="center"
                android:textColor="@color/orgin_text_color"/>

            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/rcv_dailyrecord"
                android:layout_
                android:layout_
                android:layout_marginRight="10dp"
                android:layout_marginLeft="10dp"
                android:scrollbars="vertical" />
        </FrameLayout>
    </androidx.coordinatorlayout.widget.CoordinatorLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <item
        android:icon="@drawable/ic_action_add"
        android:title="A D D"
        app:showAsAction="always" />
</menu>

【问题讨论】:

【参考方案1】:

尝试在 Fragment 中覆盖 onCreate 函数并在那里调用 setHasOptionsMenu 函数,如下所示:

 @Override
 public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
 

关于 onCreateonCreateView 之间的区别,您可以在this *** 线程中阅读更多信息。

【讨论】:

请在 onCreateOptionsMenu 中尝试通过调用“menu.clear();”来清除上一个菜单,然后再添加一个新菜单;一开始。 它仍然是不可见的。【参考方案2】:

试试这个,因为你的 Fragment 中有一个自定义工具栏, 只需将您的工具栏添加到您的活动和setHasOptionMenu(true)

将此添加到您的 onCreate 方法中:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) 
    ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_blank, container, false);
    initViews(rootView);


    ((AppCompatActivity) requireActivity()).setSupportActionBar((toolbar));
    setHasOptionsMenu(true);
    return rootView;

【讨论】:

你是对的。现在它起作用了。谢谢你。但是getActivity()requireActivity() 有什么区别呢?我不应该只使用getActivity()吗? 这不是requireActivity()getActivity() 都返回附加片段的活动以获取更多信息,请参阅answer

以上是关于我在片段中看不到选项菜单的主要内容,如果未能解决你的问题,请参考以下文章

隐藏/显示不同片段的操作栏选项菜单项

从外部片段内的 FragmentTabHost 的子片段添加新的选项菜单

滑块菜单片段中的可交换选项卡

使用片段在可Swipable选项卡中加载首选项设置

当片段具有选项菜单时,Android Chrome Cast 介绍 Overlay 的行为不正确

找不到用于片段的id 0x7f0800c4的视图