【问题标题】:Disable swipe gesture (navigation drawer) from specific fragment从特定片段禁用滑动手势(导航抽屉)
【发布时间】:2014-08-19 11:32:38
【问题描述】:

我想禁用打开导航抽屉的滑动手势,但仅限于特定片段,我的意思是我不想从整个应用程序中禁用它。

我阅读了很多问题,其中一个似乎有效,但我可能不明白我必须做什么:this

我试过这个:

MainActivity,onCreate:

mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
mDrawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, R.layout.fragment_my_favourite);

R.layout.fragment_my_favourite:我要禁用抽屉的片段。

我会很感激任何提示。非常感谢

更新 1:

我试过这个:

主活动:

private ViewDragHelper draggerObj;
private Field mDragger;
private Field mEdgeSize;
private int edge;
private DrawerLayout mDrawer;

public void closeDrag()
{       
    try 
    {
       mDragger = mDrawer.getClass().getDeclaredField("mLeftDragger");
    }
    catch (NoSuchFieldException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    mDragger.setAccessible(true);

    try 
    {
        draggerObj = (ViewDragHelper) mDragger.get(mDrawer);
    }
    catch (IllegalArgumentException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    catch (IllegalAccessException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try 
    {
        mEdgeSize = draggerObj.getClass().getDeclaredField("mEdgeSize");
    } 
    catch (NoSuchFieldException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    mEdgeSize.setAccessible(true);

    try 
    {
      edge = mEdgeSize.getInt(draggerObj);
    } 
    catch (IllegalArgumentException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    catch (IllegalAccessException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try 
    {
        mEdgeSize.setInt(draggerObj, edge * 0);
    }
    catch (IllegalArgumentException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    catch (IllegalAccessException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

在我从我的片段中调用这个方法之后:

创建:

Activity activity = getActivity();
    if (activity instanceof MainActivity){
        ((MainActivity) activity).closeDrag();
    } 

【问题讨论】:

  • 您希望您的抽屉禁用仅用手指滑动吗?对
  • 这正是我想要的,但只是在一个特定的片段中。
  • 您能否发布更新的部分以及您的代码到底是什么?
  • 您的 MainActivity 正在扩展 ActionBarActivity ?对
  • 是的,它正在扩展 ActinBarActivity。抽屉正在工作,禁用打开抽屉的手势是不工作的。

标签: android navigation-drawer drawerlayout


【解决方案1】:
//Blocked swipe navigation drawer
mDrawer = (DrawerLayout) this.getActivity().findViewById(R.id.drawer_layout);
mDrawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);

【讨论】:

  • 没有解释的代码转储很少有用。请考虑在您的答案中添加一些上下文。
  • 您的答案有简单的方法,但如果您还添加重力或您的抽屉将打开的位置(如 Gravity.LEFT 或 Gravity.RIGHT)会很好,它还会增加稳定性。在这里查看官方指南developer.android.com/reference/android/support/v4/widget/…, int)
【解决方案2】:

我使用此代码,它对我有用。

public void closeDrag()
    {
        try 
        {
            mDragger = drawerLayout.getClass().getDeclaredField("mLeftDragger");
        }
        catch (NoSuchFieldException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        mDragger.setAccessible(true);

        try 
        {
            draggerObj = (ViewDragHelper) mDragger.get(drawerLayout);
        }
        catch (IllegalArgumentException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (IllegalAccessException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try 
        {
            mEdgeSize = draggerObj.getClass().getDeclaredField("mEdgeSize");
        } 
        catch (NoSuchFieldException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        mEdgeSize.setAccessible(true);

        try 
        {
            edge = mEdgeSize.getInt(draggerObj);
        } 
        catch (IllegalArgumentException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (IllegalAccessException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try 
        {
            mEdgeSize.setInt(draggerObj, edge * 0);
        }
        catch (IllegalArgumentException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (IllegalAccessException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

注意:it will allow to open/close drawer from Actionbar button but will disable finger swipe.

【讨论】:

  • 试试这个&如果它帮助你请接受作为答案。
  • 我在第一次尝试时得到 java.lang.NullPointerException。我已将变量初始化为 null(mDragger、mEdgeSize ...)。这可能是问题吗?
  • 我使它成为全局--> 字段 mDragger, mEdgeSize; & 不为空。
  • 我仍然收到空指针异常。我在 MainActivity 中创建了这个方法,并在片段类中创建了一个 MainActivity 对象。在我这样做之后>> if (main instanceof MainActivity){ main.closeDrag(); }
  • 实际上我已经在 Activity (onCreate) 中使用它而不是在片段中,并将该 Activity 作为基类并用它扩展其他活动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 2013-07-27
  • 2016-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多