如何从Fragment Android

时间:2015-12-21 11:45:47

标签: android

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

6 个答案:

答案 0 :(得分:10)

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

private MainActivity main;

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

你绝对应该避免这种情况!

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

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)mActivity的操作),您将无法重复使用Fragment。 会有一个ClassCastException。为了重用你的Fragment,你应该使用一个接口而不是为你强制转换MainActivity。所以每个Activity都会使用 您的Frament可以简单地实现此接口。即使没有DrawerLayout,你也可以使用它。所以最大的努力就是可重用性。

答案 1 :(得分:3)

您可以按照以下方式执行此操作 -

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

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

然后在片段的onResume内你可以调用它并根据需要更改抽屉锁定模式 -

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

OR

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

mActivity 是我的活动参考。

这种方式对我有用。

答案 2 :(得分:2)

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

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

在这里您可以看到如何从 navigation component 开始,这里是关于 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 {.....
           
 }
 }

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

答案 3 :(得分: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

答案 4 :(得分:1)

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

public class MainActivity extends AppCompatActivity {
    private DrawerLayout mDrawerLayout;
    .......

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        .........
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        .........
    }
    public void openNavigationDrawer() {
        mDrawerLayout.openDrawer(Gravity.LEFT);
    }

    public void closeNavigationDrawer() {
        mDrawerLayout.closeDrawer(Gravity.LEFT);
    }

    public void lockNavigationDrawer() {
        mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
    }

    public void unLockNavigationDrawer() {
        mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
    }
}

现在从您的片段调用上面的方法,如下所示

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

答案 5 :(得分:0)

我挣扎了几个小时:将DrawerLayout设置为锁定模式根本不适用于我。甚至按照你的例子。

最后我想出了这个post

如果您设置 layout_gravity

DrawerLayout.setDrawerLockMode 将无效在NavigationView中开始|底部。只需将其设置为开始结束

即可

希望这有助于某人