如何从Fragment Android中禁用或隐藏抽屉布局

Sai*_*Sai 3 android

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

Cem*_*ser 11

您可以在片段中执行以下操作:

private MainActivity main;

@Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        main = (MainActivity) activity;
    }
Run Code Online (Sandbox Code Playgroud)

你绝对应该避免这个!

一个mutch更好的解决方案是使用接口在Main和Fragment之间进行通信.你最终会得到这样的东西:

public interface MyInterface {
 public void lockDrawer();
 public void unlockDrawer();
}
Run Code Online (Sandbox Code Playgroud)

主要:

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

分段:

   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();
    }

}
Run Code Online (Sandbox Code Playgroud)

为什么这是最佳解决方案:如果您执行类似((HomeActivity)mActivity的操作),您将无法重复使用Fragment.会有一个ClassCastException.为了重用你的Fragment,你应该使用一个接口而不是为你强制转换MainActivity.因此,每个将使用您的Frament的Activity都可以简单地实现此接口.即使没有DrawerLayout,你也可以使用它.所以最大的努力是可重用性.


Dez*_*ezo 6

带有导航组件的 Kotlin 解决方案:

如果您使用导航组件(具有多个片段目标的一个主要活动),那么您需要使用addOnDestinationChangedListener来处理将显示哪个片段以及在哪个片段上隐藏抽屉布局内的导航视图。

在这里您可以看到如何从导航组件开始,这里是关于setDrawerLockMode方法。

所以你的代码看起来像这样:

 val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
 val navController = findNavController(R.id.nav_host_fragment)
 navController.addOnDestinationChangedListener{_, destination, _ ->

 if (destination.id == R.id.nav_fragment1) {
     drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
     //DRAWER LOCKED IN fragment1
    
 } else if (destination.id == R.id.nav_fragment2) {
           drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
           //DRAWER UNLOCKED IN fragment2
    
 } else {.....
           
 }
 }
Run Code Online (Sandbox Code Playgroud)

这部分代码您可以放入 MainActivity 的 onCreate() 方法中。制作导航抽屉活动的最简单方法是在您的 android studio 中自动进行。只需按照文件 -> 新建 -> 活动 -> 导航抽屉活动即可。