正在禁用碎片中的导航抽屉



我有一个应用程序,里面有一个导航抽屉和4个导航项(碎片)。在其中一个片段中,我有一个用视图寻呼机设置的选项卡布局(还有3个片段)。

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

我该怎么做?

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

我将抽屉添加到主活动中的方式:

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);
}

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(),尽管为了向用户提供切换被禁用的视觉指示,仍然需要这样做。

对于Kotlin语言,这两行:第一行用于关闭抽屉,第二行用于将其模式设置为"0";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)

相关内容

  • 没有找到相关文章

最新更新