2015-12-21 49 views
3

我在我的应用程序中有10个不同的片段。我需要将导航抽屉(抽屉布局)隐藏在少数片段中,如何从片段访问抽屉布局并隐藏它?我知道我们需要在活动mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);中使用,但如何在碎片中完成它?如何从片段中禁用或隐藏抽屉布局Android

回答

6

你可以做这样的事情在你的片段:

private MainActivity main; 

@Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     main = (MainActivity) activity; 
    } 

你一定要避免这种情况!

mutch更好的解决方案将使用一个接口在您的Main和片段之间进行通信。你最终会像这样的东西:

public interface MyInterface { 
public void lockDrawer(); 
public void unlockDrawer(); 
} 

主营:

public class DetailViewActivity extends AppCompatActivity implements MyInterface { 
@Override 
    public void lockDrawer() {   
     mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 
    } 

@Override 
    public void unlockDrawer() { 
    mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); 
    } 

} 

片段:

public class MyFragment extends Fragment { 
    private MyInterface myInterface; 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
     myInterface = (MyInterface) activity; 
      } catch (ClassCastException e) { 
       throw new ClassCastException(activity.toString() + " must implement MyInterface"); 
      } 
     } 

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

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
     myInterface.unlockDrawer(); 
    } 

} 

为什么这是最好的解决办法:如果你做这样的事情((HomeActivity)毫无疑问),你将无法重复使用你的片段。 将会有一个ClassCastException。为了重用你的Fragment,你应该使用一个接口,而不是投你MainActivity。因此,每个使用 的活动都可以简单地实现此界面。即使没有DrawerLayout,你也可以使用它。所以最大的努力就是可重用性。

写你的活动中,如下所示一个公共方法 - -

public void enableDisableDrawer(int mode) { 
    if (mDrawerLayout != null) { 
     mDrawerLayout.setDrawerLockMode(mode); 
    } 
} 

,然后里面片段的onResume,你可以调用这个和改变抽屉锁模式需要

+0

谢谢你。它的工作完美。 – sivaprakash

1

您可以使用此方法锁定或解锁抽屉:DrawerLayout.setDrawerLockMode(...)。 (此方法还有另外两个版本,用于指定特定抽屉的锁定模式。)要锁定,请使用DrawerLayout.LOCK_MODE_LOCKED_CLOSED;解锁,使用DrawerLayout.LOCK_MODE_UNLOCKED

如果您使用的是ActionBarDrawerToggle,则需要添加一些额外的代码,以防止在您锁定抽屉时单击ActionBarDrawerToggle时打开抽屉。

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // check lock mode before passing to ActionBarDrawerToggle 
    // I assume your drawer is on the left; if not, use Gravity.RIGHT 
    int lockMode = mDrawer.getDrawerLockMode(Gravity.LEFT); 
    if (lockMode == DrawerLayout.LOCK_MODE_UNLOCKED && 
      mDrawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 
    // Handle your other action bar items... 

    return super.onOptionsItemSelected(item); 
} 

参考链接了解更多信息link here

+0

我知道这一点。我的问题是,我怎样才能从活动访问它的形式片段。 –

1

创建您的活动两种方法。一个用于打开抽屉,另一个用于关闭抽屉。见下面的代码。

​​3210

现在打电话从片段上述方法类似下面

((MainActivity)getActivity()).closeNavigationDrawer(); // to close drawer 
((MainActivity)getActivity()).openNavigationDrawer(); // to open drawer 
((MainActivity)getActivity()).lockNavigationDrawer(); // to lock drawer 
((MainActivity)getActivity()).unLockNavigationDrawer(); // to unlock drawer 
+0

这将工作。也没有好的做法 - 活动和片段之间的沟通,你应该总是使用一个接口 –

5

您可以通过以下方式做到这一点 -

((HomeActivity) mActivity).enableDisableDrawer(DrawerLayout.LOCK_MODE_UNLOCKED); 

OR

((HomeActivity) mActivity).enableDisableDrawer(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 

其中mActivity是我的活动参考。

这种方式正在为我工​​作。

+0

我不会推荐这个原因 - 你以这种方式失去了碎片的可重用性 –

0

您可以使用此方法来锁定或解锁抽屉:DrawerLayout.setDrawerLockMode(...)。 (此方法还有另外两个版本,用于指定特定抽屉的锁定模式。)要锁定,请使用DrawerLayout.LOCK_MODE_LOCKED_CLOSED;要解锁,请使用DrawerLayout.LOCK_MODE_UNLOCKED。

如果您使用的是ActionBarDrawerToggle,则需要添加一些额外的代码,以防止在您锁定抽屉时单击ActionBarDrawerToggle时打开抽屉。

enter code here 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
// check lock mode before passing to ActionBarDrawerToggle 
// I assume your drawer is on the left; if not, use Gravity.RIGHT 
int lockMode = mDrawer.getDrawerLockMode(Gravity.LEFT); 
if (lockMode == DrawerLayout.LOCK_MODE_UNLOCKED && 
     mDrawerToggle.onOptionsItemSelected(item)) { 
    return true; 
} 
// Handle your other action bar items... 

return super.onOptionsItemSelected(item); 
} 
相关问题