从片段中禁用导航抽屉

Ros*_*nal 10 navigation android android-fragments android-toolbar

我有一个带导航抽屉的应用程序和4个导航项目(碎片).在其中一个片段中,我有一个标签布局设置了一个视图寻呼机(另外3个片段).

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

我该怎么办?

我尝试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);
Run Code Online (Sandbox Code Playgroud)

(当然我已经toggle.syncState()onPostCreate方法中添加了.

Mik*_* M. 54

一个干净的方式做,这是创建interfaceActivity工具,通过它Fragment可以调用本地的方法Activity来处理抽屉的锁和切换按钮的状态.例如:

public interface DrawerLocker {
    public void setDrawerEnabled(boolean enabled);
}
Run Code Online (Sandbox Code Playgroud)

Activityinterface方法,我们只是数字为锁定模式不断DrawerLayout#setDrawerLockMode()呼叫,并调用setDrawerIndicatorEnabled()ActionBarDrawerToggle.

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

    ...
}
Run Code Online (Sandbox Code Playgroud)

Fragment,我们只需要将托管Activity转换为interface,并相应地调用setDrawerEnabled()方法.例如,要关闭抽屉:

((DrawerLocker) getActivity()).setDrawerEnabled(false);
Run Code Online (Sandbox Code Playgroud)

注意:从v7 appcompat支持库的版本23.2.0开始,ActionBarDrawerToggle尊重DrawerLayout锁定模式,如果它被锁定,则不会切换抽屉状态.这意味着并非严格必须使用setDrawerIndicatorEnabled(),但仍可能希望仍然这样做以便向用户提供禁用切换的视觉指示.