从片段中禁用导航抽屉

时间:2016-03-27 16:10:24

标签: android android-fragments navigation android-toolbar

我有一个带导航抽屉的应用程序和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);

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

1 个答案:

答案 0 :(得分:48)

执行此操作的一种干净方法是创建interface实现的ActivityFragment可以通过该Activity调用处理该public interface DrawerLocker { public void setDrawerEnabled(boolean enabled); } 的{​​{1}}本地方法抽屉锁和切换按钮状态。例如:

Activity

interface DrawerLayout#setDrawerLockMode()方法中,我们只是将setDrawerIndicatorEnabled()调用的锁定模式设为常量,并在{{1}上调用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);
    }

    ...
}

Fragment中,我们只需要将托管Activity投射到interface,然后相应地调用setDrawerEnabled()方法。例如,要关闭抽屉:

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

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