Android 如何从 Fragment 编辑操作栏菜单

Posted

技术标签:

【中文标题】Android 如何从 Fragment 编辑操作栏菜单【英文标题】:Android How to edit the Action bar menu from Fragment 【发布时间】:2015-02-22 06:11:42 【问题描述】:

我创建了一个使用 Fragment 的应用程序。在我的 MainActivity 中,我设置了 ActionBar。

但在我的一个片段中,我需要修改动作图标并点击。

所以使用下面的代码,当我加载我的 Fragment 时,它仍然显示来自 MainActivity 的操作栏菜单

这是我的 MainActivity :

public void restoreActionBar() 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
    actionBar.setDisplayShowTitleEnabled(true);
    actionBar.setTitle(mTitle);

    // enable ActionBar app icon to behave as action to toggle nav drawer
    actionBar.setDisplayHomeAsUpEnabled(true);
    actionBar.setHomeButtonEnabled(true);



@Override
public boolean onCreateOptionsMenu(Menu menu) 
    if (!mNavigationDrawerFragment.isDrawerOpen()) 
        // Only show items in the action bar relevant to this screen
        // if the drawer is not showing. Otherwise, let the drawer
        // decide what to show in the action bar.
        getMenuInflater().inflate(R.menu.main, menu);


        //Handle the Search Menu
        SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search));
        searchView.setQueryHint(this.getString(R.string.action_search));

        ((EditText)searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text))
        .setHintTextColor(getResources().getColor(R.color.white));      
        searchView.setOnQueryTextListener(OnQuerySearchView);

        mSearchCheck = false;


        restoreActionBar();
        return true;
    

    return super.onCreateOptionsMenu(menu);
//end onCreateOptionsMenu

@Override
public boolean onOptionsItemSelected(MenuItem item) 
    // Handle presses on the action bar items
    switch (item.getItemId()) 

        /** CAMERA **/
        case R.id.action_camera:
            //openCamera();
            Utils.makeToast(getApplicationContext(), "Implement Camera", false);
            return true;

        /** SEARCH **/   
        case R.id.action_search:
            //openSearch();
            mSearchCheck = true;
            Utils.makeToast(getApplicationContext(), "Implement Search", false);
            return true;

        /** SETTINGS **/ 
        case R.id.action_settings:
            //openSettings();
            Utils.makeToast(getApplicationContext(), "Implement Settings", false);
            return true;

        /** ABOUT **/ 
        case R.id.action_help:
            //openHelp();
            Utils.makeToast(getApplicationContext(), "Implement Help", false);
            return true;


        default:
            return super.onOptionsItemSelected(item);
    //end switch
//end onOptionsItemSelected

private OnQueryTextListener OnQuerySearchView = new OnQueryTextListener() 
    @Override
    public boolean onQueryTextSubmit(String arg0) 
        // TODO Auto-generated method stub
        return false;
    
    @Override
    public boolean onQueryTextChange(String arg0) 
        // TODO Auto-generated method stub
        if (mSearchCheck)
            // implement your search here
        
        return false;
    
;//end OnQueryTextListener

这是布局:

<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"
    tools:context="com.example.sellbeesclean.MainActivity" >


    <!-- CAMERA -->
    <item
        android:id="@+id/action_camera"
        android:orderInCategory="100"
        android:icon="@drawable/ic_action_camera"
        android:title="@string/action_camera"
        app:showAsAction="ifRoom|collapseActionView"/>

    <!-- SEARCH -->
    <item
        android:id="@+id/action_search"
        android:orderInCategory="100"
        android:icon="@drawable/ic_action_search"
        android:title="@string/action_search"
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="ifRoom|collapseActionView"/>

    <!-- SETTINGS -->
    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:title="@string/action_settings"
        app:showAsAction="never"/>

    <!-- HELP -->
    <item
        android:id="@+id/action_help"
        android:orderInCategory="100"
        android:icon="@drawable/ic_action_help"
        android:title="@string/action_help"
        app:showAsAction="ifRoom|collapseActionView"/> </menu>

她是我的碎片:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
        setHasOptionsMenu(true);
        View rootView = inflater.inflate(R.layout.user_profile_fragment, container, false);
        Log.i(TAG, "onCreateView");
.....

    @Override
    public void onAttach(Activity activity) 
        super.onAttach(activity);

        setHasOptionsMenu(true);
    

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) 
        super.onCreateOptionsMenu(menu, inflater);      
        inflater.inflate(R.menu.fragment_menu, menu);

       



    @Override
    public boolean onOptionsItemSelected(MenuItem item) 
        // Handle presses on the action bar items
        switch (item.getItemId()) 

            /** EDIT **/
            case R.id.action_edit:
                //openEditProfile(); //Open Edit Profile Fragment
                Utils.makeToast(MyApplication.getAppContext(), "Implement Camera", false);
                return true;



            default:
                return super.onOptionsItemSelected(item);
        //end switch
    //end onOptionsItemSelected

这里是片段菜单布局

<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"
    tools:context="com.example.sellbeesclean.MainActivity" >


    <!-- EDIT -->
    <item
        android:id="@+id/action_edit"
        android:orderInCategory="100"
        android:icon="@drawable/ic_action_edit"
        android:title="@string/action_edit_profile"
        app:showAsAction="ifRoom|collapseActionView"/></menu>

【问题讨论】:

我也绑定了activity.invalidateOptionsMenu();,但是没有运气 【参考方案1】:

在片段的 onCreateView 方法中写入

setHasOptionsMenu(true);

并在 onCreateOptionsMenu 方法中扩充您的菜单 xml 文件

在片段的onCreateOptionsMenu中,写

menu.clear();

膨胀菜单之前

【讨论】:

新图标仅在我单击导航抽屉时显示(当抽屉打开时),否则它仍然从 MainActivity 布局加载 片段中无需调用 restoreActionBar 方法 我没有调用 restoreActionBar(),它现在被注释掉了。 - 我更新了上面的代码。谢谢 在片段的onCreateOptionsMenu中,写“menu.clear();”在膨胀菜单之前

以上是关于Android 如何从 Fragment 编辑操作栏菜单的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Mainactivity 编辑 Fragment 中的 TextView

Android - 如何从 FragmentActivity 访问 Fragment

如何从 Android 中的 Fragment 访问 UI 元素?

如何将数据从 Android Activity 发送到 Fragment [重复]

Android Studio:如何从 Fragment 在 ActionBar 中实现后退按钮

Android如何成功截击请求,如何将数据从Activity传递到Fragment?