android - 从 Activity 获取 Fragment 的抽屉导航

标签 android android-fragments

我有 MainActivity,它包含 2 个 fragment 。第一个 fragment 有抽屉导航,第二个 fragment 没有。在 MainActivity 中,我想重写 onBackPressed() 方法,因此当抽屉导航打开时,它必须关闭 fragment 。但我不知道如何从 Activity 获取 fragment 的抽屉导航状态。代码如下:

MainActivity.java

@Override
public void onBackPressed() {
    if (drawerLayout.isDrawerOpen(GravityCompat.START)){
        drawerLayout.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}

FragmentListProduct.java

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    mainView = inflater.inflate(R.layout.fragment_list_product_layout, container, false);
    Toolbar toolbar = (Toolbar) mainView.findViewById(R.id.toolbar);
    fragmentActivity.setSupportActionBar(toolbar);

    drawerLayout = (DrawerLayout) mainView.findViewById(R.id.drawer_layout);
    drawerToggle = new ActionBarDrawerToggle(fragmentActivity, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawerLayout.addDrawerListener(drawerToggle);
    drawerToggle.syncState();

    navigationView = (NavigationView) mainView.findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
    navigationView.setCheckedItem(R.id.nav_cat_all);
}

当然,它给了我错误无法解析符号darwerlayout。 在我将drawerLayout作为静态字段之前,但我收到警告不要将Android上下文类放在静态字段中;这是内存泄漏(也会破坏即时运行)。那么如何解决这个问题,或者也许你有另一个解决方案:D

最佳答案

您可以使用标签访问 fragment ,调用 fragment 时必须分配该标签,如下所示:

getFragmentManager()
    .beginTransaction()
    .replace(R.id.content_frame, fragment, "the_tag_here")
    .commit();

使用 getFragmentManager().findFragmentByTag("the_tag") 访问它

@Override
public void onBackPressed() {

    FragmentListProduct fragment =  (FragmentListProduct) getFragmentManager().findFragmentByTag("the_tag_here");

    if (fragment != null) {
        DrawerLayout drawerLayout = fragment.drawerLayout;
       //make drawerLayout public in the fragment
        if (drawerLayout.isDrawerOpen(GravityCompat.START)){
            drawerLayout.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }

    } else {
        super.onBackPressed();
    }

}

关于android - 从 Activity 获取 Fragment 的抽屉导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40967620/

相关文章:

android - APK部署问题

android - 以编程方式在滚动同一列表时修复列表中 View 的位置

android - 如何建立从 iOS 到 Android 设备的 RFCOMM 蓝牙连接

android - 来自 Fragments 的 `onViewStateRestored` 如何工作?

android - 为推送通知构建 fragment backStack

android - 在 Android 中查看时调整 ListView 元素的大小?

android - 在 build.gradle 中有条件地定义 resValue

android - 在回收站 ListView 项目之间添加了大空间

android - 在 viewpager 上滑动时,选项卡选择器无法在上一个选项卡上单击

android - Commit 上的数据未保存在共享首选项中