2016-05-23 36 views
2

我有一個ViewPager其中網頁包含圖表視圖,其反應的滑動動作。由於這個原因,我採取了通過從屏幕邊緣滑動來改變頁面。但是這給我帶來的問題是,這也是打開NavigationDrawer的手勢。如何防止NavigationDrawer從手勢被打開,但是從漢堡包圖標允許支持設計庫23.1.1.1

到現在爲止我用下面的代碼來實現這一目標:

protected override void OnCreate(Bundle savedInstanceState) 
{ 
    base.OnCreate(savedInstanceState); 

    SetContentView(GetLayoutId()); 

    Toolbar = FindViewById<Toolbar>(Resource.Id.toolbar); 
    if (Toolbar != null) 
    { 
    // set this flag so the colors colorPrimaryDark and android:statusBarColor have an effect 
    // setting android:statusBarColor to transparent causes the drawer to be dran underneath a translucent status bar 
    Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds); 

    // make the toolbar the replacement of the action bar 
    SetSupportActionBar(Toolbar); 
    } 

    // add the hamburger icon 
    m_DrawerLayout = FindViewById<DrawerLayout>(Resource.Id.drawer_layout); 
    var actionBarDrawerToggle = new ActionBarDrawerToggle(this, m_DrawerLayout, Toolbar, Resource.String.empty, Resource.String.empty); 
    m_DrawerLayout.AddDrawerListener(actionBarDrawerToggle); 

    // make sure the drawer can't be opened by swiping, to do this we set the lock mode to closed 
    // but if we just do this, it can't be closed by swiping either, so set the lock mode to unlocked when the drawer is opened, and locked again when it's closed 
    m_DrawerLayout.DrawerOpened += (object sender, DrawerLayout.DrawerOpenedEventArgs e) => 
    { 
    m_DrawerLayout.SetDrawerLockMode(DrawerLayout.LockModeUnlocked); 
    }; 
    m_DrawerLayout.DrawerClosed += (object sender, DrawerLayout.DrawerClosedEventArgs e) => 
    { 
    m_DrawerLayout.SetDrawerLockMode(DrawerLayout.LockModeLockedClosed); 
    }; 
    m_DrawerLayout.SetDrawerLockMode(DrawerLayout.LockModeLockedClosed); 

    //calling sync state is necessay or else the hamburger icon wont show up 
    actionBarDrawerToggle.SyncState(); 
} 

它的工作如預期,直到我更新到Android支持設計庫23.1.1.1,現在設置爲關閉,也可以防止鎖定模式通過點擊漢堡圖標打開菜單。

+0

一個不規範的行爲:) – jaibatrik

+0

可能是你需要創建'DrawerLayout'延伸的定製'View'。 – jaibatrik

+0

如果確實是導致這種情況的更新,那麼聽起來就像是一場混戰。你可能會想恢復到以前的庫版本,直到他們修復它,或者說現在是預期的行爲,這不會很有趣,因爲這將需要一個不必要的複雜的解決方法來獲得舊的行爲。 –

回答

2

看着爲ActionBarDrawerToggle類的最新版本的源代碼,這確實似乎是新的預期的行爲。這是toggle()方法現在看起來是這樣的:

private void toggle() { 
    int drawerLockMode = mDrawerLayout.getDrawerLockMode(GravityCompat.START); 
    if (mDrawerLayout.isDrawerVisible(GravityCompat.START) 
     && (drawerLockMode != DrawerLayout.LOCK_MODE_LOCKED_OPEN)) { 
     mDrawerLayout.closeDrawer(GravityCompat.START); 
    } 
    else if (drawerLockMode != DrawerLayout.LOCK_MODE_LOCKED_CLOSED) { 
     mDrawerLayout.openDrawer(GravityCompat.START); 
    } 
} 

,而它以前只是檢查抽屜的開啓/關閉狀態。

這是不幸的,因爲它現在將採取一種變通方法來實現舊的行爲。也許最簡單的做法是恢復到舊版本的支持庫。但是,如果你想保留最新版本,一個可能的解決方案如下。

首先請從ActionBarDrawerToggle構造函數調用的參數Toolbar

actionBarDrawerToggle = new ActionBarDrawerToggle(this, 
                m_DrawerLayout, 
                Resource.String.empty, 
                Resource.String.empty); 

這將導致ActivityOnOptionsItemSelected()法射擊在單擊切換,因爲你已經設置的Toolbar爲支撐ActionBar。我們還需要調用SupportActionBar.SetDisplayHomeAsUpEnabled(true)到實際顯示切換,因爲ActionBarDrawerToggle類交互略有不同與ActionBar比其與Toolbar確實,相對於他們的孩子View秒。

ActivityOnOptionsItemSelected()方法,我們再簡單地調用切換自己的OnOptionsItemSelected()方法,它處理抽屜的開啓和關閉之前解鎖抽屜。

public override bool OnOptionsItemSelected (IMenuItem item) 
{  
    switch (item.ItemId) 
    { 
     case Android.Resource.Id.Home: 
      m_DrawerLayout.SetDrawerLockMode(DrawerLayout.LockModeUnlocked); 
      actionBarDrawerToggle.OnOptionsItemSelected(item); 

      return true; 
     ... 
    } 
    ... 
} 

actionBarDrawerToggle將需要您Activity的領域,你可以刪除DrawerOpened處理程序。

+0

非常感謝,這工作。還有一件事我需要添加:'SupportActionBar.SetDisplayHomeAsUpEnabled(true);否則漢堡包圖標將不會顯示。 我想避免不得不繼續使用舊版本的支持庫。該應用程序仍處於開發階段,我不希望被迫連應用發佈的第一次之前,使用過時的東西... – Naryoril

+0

啊,是啊,我想我沒有注意到你沒有已經。涼。很高興它爲雅工作。乾杯! –