从片段中禁用导航抽屉
Disabling navigation drawer from fragment
我有一个带有导航抽屉和 4 个导航项(片段)的应用程序。在其中一个片段中,我设置了一个带有视图寻呼机的选项卡布局(另外 3 个片段)。
从这些内部片段之一,我想动态地 disable/enable 导航抽屉。基本上,在按下按钮时,我想限制对导航抽屉的访问(并在再次按下时重新启用)。
我该怎么做?
我尝试从这个内部片段访问父 activity 的 DrawerLayout
。但是我看不到 enable/disable 导航抽屉的方法。
我将抽屉添加到主抽屉的方式 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()
。
一个干净的方法是创建一个 Activity
实现的 interface
,通过它 Fragment
可以调用 Activity
的本地方法处理抽屉锁和切换按钮状态。例如:
public interface DrawerLocker {
public void setDrawerEnabled(boolean enabled);
}
在Activity
的interface
方法中,我们简单地计算出DrawerLayout#setDrawerLockMode()
调用的锁定模式常量,并在[=21=上调用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()
并不是绝对必要的,但为了向用户提供切换已禁用的视觉指示,可能仍然需要这样做。
对于 Kotlin 语言,这两行:
第一行是关闭抽屉,
第二行用于将其模式设置为“LOCK_MODE_LOCKED_CLOSED”(使其禁用)
drawerLayout.close()
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
“drawerLayout”定义如下:
第一行:声明一个 DrawerLayout 对象的实例
第二行:给它赋值
private lateinit var drawerLayout:DrawerLayout
drawerLayout = findViewById(R.id.activity_main_container)
我有一个带有导航抽屉和 4 个导航项(片段)的应用程序。在其中一个片段中,我设置了一个带有视图寻呼机的选项卡布局(另外 3 个片段)。
从这些内部片段之一,我想动态地 disable/enable 导航抽屉。基本上,在按下按钮时,我想限制对导航抽屉的访问(并在再次按下时重新启用)。
我该怎么做?
我尝试从这个内部片段访问父 activity 的 DrawerLayout
。但是我看不到 enable/disable 导航抽屉的方法。
我将抽屉添加到主抽屉的方式 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()
。
一个干净的方法是创建一个 Activity
实现的 interface
,通过它 Fragment
可以调用 Activity
的本地方法处理抽屉锁和切换按钮状态。例如:
public interface DrawerLocker {
public void setDrawerEnabled(boolean enabled);
}
在Activity
的interface
方法中,我们简单地计算出DrawerLayout#setDrawerLockMode()
调用的锁定模式常量,并在[=21=上调用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()
并不是绝对必要的,但为了向用户提供切换已禁用的视觉指示,可能仍然需要这样做。
对于 Kotlin 语言,这两行: 第一行是关闭抽屉, 第二行用于将其模式设置为“LOCK_MODE_LOCKED_CLOSED”(使其禁用)
drawerLayout.close()
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
“drawerLayout”定义如下: 第一行:声明一个 DrawerLayout 对象的实例 第二行:给它赋值
private lateinit var drawerLayout:DrawerLayout
drawerLayout = findViewById(R.id.activity_main_container)