[英]Disabling navigation drawer from fragment
我有一個帶有導航抽屜和 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
可以通過該interface
調用處理抽屜鎖定和切換按鈕狀態的Activity
本地方法。 例如:
public interface DrawerLocker {
public void setDrawerEnabled(boolean enabled);
}
在Activity
的interface
方法中,我們只是為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 語言,這兩行:第一行用於關閉抽屜,第二行用於將其模式設置為“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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.