android - 从 fragment 中禁用抽屉导航

标签 android android-fragments navigation android-toolbar

我有一个带有抽屉导航和 4 个导航项( fragment )的应用。在其中一个 fragment 中,我设置了一个带有 View 寻呼机的选项卡布局(另外 3 个 fragment )。

从这些内部 fragment 之一,我想动态地禁用/启用抽屉导航。基本上,在按下按钮时,我想限制对抽屉导航的访问(并在再次按下时重新启用)。

我该怎么做?

我尝试从这个内部 fragment 访问父 Activity 的 DrawerLayout。但是我看不到启用/禁用抽屉导航的方法。

我将抽屉添加到我的主要 Activity 的方式:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);

NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);

(当然,我在 onPostCreate 方法中添加了 toggle.syncState()

最佳答案

一个干净的方法是创建一个接口(interface)Activity 实现,Fragment 可以通过它调用本地方法处理抽屉锁和切换按钮状态的 Activity。例如:

public interface DrawerLocker {
    public void setDrawerEnabled(boolean enabled);
}

Activityinterface 方法中,我们简单地计算出 DrawerLayout#setDrawerLockMode() 调用的锁定模式常量,然后调用ActionBarDrawerToggle 上的 setDrawerIndicatorEnabled()

public class MainActivity extends Activity implements DrawerLocker {

    public void setDrawerEnabled(boolean enabled) {
        int lockMode = enabled ? DrawerLayout.LOCK_MODE_UNLOCKED :
                                 DrawerLayout.LOCK_MODE_LOCKED_CLOSED;
        drawer.setDrawerLockMode(lockMode);
        toggle.setDrawerIndicatorEnabled(enabled);
    }

    ...
}

Fragment中,我们只需要将托管Activity转换为接口(interface),并调用setDrawerEnabled() 相应的方法。例如,锁上抽屉:

((DrawerLocker) getActivity()).setDrawerEnabled(false);

注意:自 v7 appcompat 支持库的版本 23.2.0 起,ActionBarDrawerToggle 尊重 DrawerLayout 的锁定模式,并且不会切换抽屉状态,如果它是锁定。这意味着使用 setDrawerIndicatorEnabled() 并不是绝对必要的,但为了向用户提供切换已禁用的视觉指示,可能仍然需要这样做。

关于android - 从 fragment 中禁用抽屉导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36249563/

相关文章:

java - android更改选中的标签背景颜色

java - 如何解析表格第三列的单元格?

android - 从 fragment B 中的 fragment A 访问 View

无需滑动的Android选项卡布局

android - 如何将工具栏添加到android中的 fragment ?

Controller 和返回 Swift 的按钮操作

android - java.lang.IllegalMonitorStateException : object not locked by thread before notify() - onResponse 异常

javascript - 导航栏

jquery - IE9 中不显示导航

android - 读取/写入具有密码保护的 NFC 标签