禁用导航抽屉从片段中

20

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

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


使用 setDrawerLockMode() 控制 DrawerLayout,并使用 setDrawerIndicatorEnabled() 控制 ActionBarDrawerToggle - Mike M.
1
@MikeM。设置setDrawerLockMode()停止了滑动手势。但是要设置setDrawerIndicatorEnabled(),我应该如何从我的Fragment中访问ActionBarDrawerToggle - Roshnal
理想情况下,你应该通过一个接口来实现这个操作,Activity类实现该接口,在Activity中调用上述方法。 - Mike M.
@MikeM。是的,我尝试过了。但事情变得非常复杂,因为我试图在ViewPager的一个Fragment内部完成此操作,而ViewPager又在包含在主Activity所拥有的Fragment中的Tab布局中。如果您可以提供任何关于如何做到这一点的提示(例如伪代码?或基本的代码结构?),那将非常棒。 - Roshnal
但事情变得非常复杂,因为我正在尝试在 Tab 布局的 ViewPager 中的一个 Fragment 中完成此操作,而这又包含在主 Activity 拥有的 Fragment 中。实际上,由于该 Fragment 仍直接附加到 Activity 上,因此这并不相关。将“getActivity()”转换为您的“interface”。 - Mike M.
2个回答

76

一个干净的方法是创建一个接口,Activity实现该接口,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);

NB:自v7 appcompat support库的23.2.0版本起,ActionBarDrawerToggle将尊重DrawerLayout的锁定模式,并且如果它被锁定,则不会切换抽屉状态。这意味着使用setDrawerIndicatorEnabled()并非必需,但仍然可以这样做,以便为用户提供切换按钮已禁用的视觉指示。


这个解决方案有效,谢谢。我该如何更改图标以便它不可见?总的来说,我在管理图标方面遇到了麻烦。 - lcj
1
你是不是在寻找 ActionBar#setDisplayHomeAsUpEnabled(false) - Mike M.
1
getSupportActionBar().setDisplayHomeAsUpEnabled(false); 对我有用。谢谢 @MikeM。 - Mrityunjai

1
对于 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接