我有一个带有抽屉导航和 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);
}
在 Activity
的 interface
方法中,我们简单地计算出 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/