导航抽屉和右侧菜单之间的冲突

Posted

技术标签:

【中文标题】导航抽屉和右侧菜单之间的冲突【英文标题】:Conflict between navigation drawer and right side menu 【发布时间】:2015-02-13 10:14:51 【问题描述】:

我需要你的帮助。我迈出了 android 编程的第一步!

求救!!!

我创建了经典的导航抽屉,您可以通过单击汉堡图标或从左侧滑动来打开/关闭它。我还创建了右侧菜单(如在 Facebook 应用程序中)并使用了来自 GitHub (https://github.com/jfeinstein10/SlidingMenu) 的这个库。最后我有抽屉导航菜单和右侧菜单之间的冲突

当导航抽屉菜单打开并且您想通过从右向左滑动来关闭它时打开的右侧菜单。

所以我的问题:如何告诉设备,当导航抽屉菜单打开时,您无法通过滑动打开右侧菜单,而通过滑动您可以关闭导航抽屉。

我在 MainActivity 中的右侧菜单代码

protected void onCreate(Bundle savedInstanceState) 
super.onCreate(savedInstanceState);

SlidingMenu menu = new SlidingMenu(this);
menu.setMode(SlidingMenu.RIGHT);
menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
menu.setFadeDegree(0.35f);
menu.attachToActivity(this, SlidingMenu.SLIDING_WINDOW);
menu.setMenu(R.layout.sidemenu);
menu.setBehindWidthRes(R.dimen.slidingmenu_behind_width);

String[] items = "Fisrt fragment","Second fragment";
((ListView) findViewById(R.id.sidemenu)).setAdapter(
        new ArrayAdapter<Object>(
                this,
                R.layout.sidemenu_item,
                R.id.text,
                items
        )
);

NavigationDrawer 代码:

public class NavigationDrawerFragment extends Fragment 
public static final String PREF_FILE_NAME="testpref";
public static final String KEY_USER_LEARNED_DRAWER="user_learned_drawer";

private ActionBarDrawerToggle mDrawerToggle;
private ListView mDrawerList;
private DrawerLayout mDrawerLayout;

private boolean mUserLearnedDrawer;
private boolean mFromSavedInstanceState;

private View containerView;

public NavigationDrawerFragment() 
    // Required empty public constructor


@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    mUserLearnedDrawer = Boolean.valueOf(readFromPreferences(getActivity(),KEY_USER_LEARNED_DRAWER,"false"));
    if(savedInstanceState!=null)
        mFromSavedInstanceState=true;
    


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) 
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_navigation_drawer, container, false);


public void setUp(int fragmentId, DrawerLayout drawerLayout, final Toolbar toolbar)
    containerView = getActivity().findViewById(fragmentId);
    mDrawerLayout = drawerLayout;
    mDrawerToggle = new ActionBarDrawerToggle(getActivity(),drawerLayout,toolbar,R.string.drawer_open, R.string.drawer_close)

        @Override
        public void onDrawerOpened(View drawerView) 
            super.onDrawerOpened(drawerView);
            if(!mUserLearnedDrawer)
                mUserLearnedDrawer=true;
                saveToPreferences(getActivity(), KEY_USER_LEARNED_DRAWER, mUserLearnedDrawer+"");
            
            getActivity().invalidateOptionsMenu();
        

        @Override
        public void onDrawerClosed(View drawerView) 
            super.onDrawerClosed(drawerView);
            getActivity().invalidateOptionsMenu();
        

        public void onDrawerSlide(View drawerView, float slideOffset) 
            super.onDrawerSlide(drawerView, slideOffset);

            if(slideOffset<0.6) 
                toolbar.setAlpha(1 - slideOffset);
            
        
    ;
    if(!mUserLearnedDrawer&&!mFromSavedInstanceState)
        mDrawerLayout.openDrawer(containerView);
    
    mDrawerLayout.setDrawerListener(mDrawerToggle);

    mDrawerLayout.post(new Runnable() 
        @Override
        public void run() 
            mDrawerToggle.syncState();
        
    );


public static void saveToPreferences(Context context,String preferenceName, String preferenceValue)
    SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_FILE_NAME, context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString(preferenceName, preferenceValue);
    editor.apply();

public static String readFromPreferences(Context context, String preferenceName, String defaultValue)
    SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_APPEND);
    return  sharedPreferences.getString(preferenceName, defaultValue);

【问题讨论】:

【参考方案1】:

添加另一个级别,如下所示:http://pastebin.com/xm8UZbvj

【讨论】:

但这只是界面。我需要逻辑解决方案。 你有什么想法吗? 不是,因为我不使用滑动菜单【参考方案2】:

当用户尝试打开右侧菜单然后检查导航抽屉是否打开然后使用以下代码将其关闭-

if(mDrawerLayout.isDrawerOpen(mDrawerList))
        mDrawerLayout.closeDrawer(mDrawerList);

【讨论】:

据我所知,如果用户想先打开右侧菜单,他们需要关闭导航抽屉。我用 ActionBarDrawerToggle 创建了我的导航抽屉。在你的代码中,mDrawerList 是什么意思?!我在 mDrawerList 中有错误。对不起,这些愚蠢的问题。我只是初学者。 如果您使用导航抽屉,那么您应该有一个列表视图,您可以在导航抽屉中使用它。所以您必须传递该列表视图的对象。 事实上,我想在导航抽屉中使用 GridView 元素,但无论如何我添加了私有 ListView mDrawerList;所以现在代码没有错误,但应用程序 dont want to open in emulator. I dont 知道现在该做什么。你能看看上面我添加到帖子中的代码吗? NavigationDrawer 的代码。我把你说的加进去了。请我需要你的专业观点。我会等你尽快答复。

以上是关于导航抽屉和右侧菜单之间的冲突的主要内容,如果未能解决你的问题,请参考以下文章

如何在 vuetify 主抽屉/导航中创建子菜单

导航抽屉 RTL [重复]

如何设置导航抽屉从右到左打开

导航抽屉菜单子类别

隐藏导航抽屉菜单项 - Android

更改导航抽屉中菜单项的文本颜色