2014-04-25 102 views
51

我試圖使導航抽屜在操作欄時,它是幻燈片喜歡這個程序的權利: [刪除]Android的抽屜式導航欄之上的ActionBar

這是我的主要活動的佈局:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout ...> 
    <RelativeLayout android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
     ... 
    </RelativeLayout> 
    <fragment android:name="com...." 
     android:layout_gravity="start" 
     android:id="@id/navigation" 
     android:layout_width="@dimen/navigation_menu_width" 
     android:layout_height="fill_parent" /> 
</android.support.v4.widget.DrawerLayout> 

計算器上的其他一些問題,如this question類似這樣的,但所有的答案,建議使用滑動菜單庫。但這個應用程序,他們仍然使用android.support.v4.widget.DrawerLayout,他們成功了。不要問我如何知道他們使用標準導航抽屜,但我確信它。

非常感謝您的幫助。


這裏是最終的解決方案:非常感謝@Peter蔡,這一完全的作品。 https://github.com/lemycanh/DrawerOnTopActionBar

Screen CaptureTranslucent on KitKat

回答

49

我從https://github.com/jfeinstein10/SlidingMenu獲得了一個小小的「訣竅」來實現您需要的效果。

您只需要移除窗口裝飾視圖的第一個子項,並將第一個子項添加到抽屜的內容視圖中。之後,您只需將抽屜添加到窗戶的裝飾視圖中即可。

下面是一些你要做的詳細步驟。

首先,創建一個名爲「decor.xml」的xml或任何你喜歡的東西。只能放入DrawerLayout和抽屜。下面的「FrameLayout」只是一個容器。我們將用它來包裝您的活動內容。

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout ...> 
    <FrameLayout android:id="@+id/container" 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"/> 
    <fragment android:name="com...." 
     android:layout_gravity="start" 
     android:id="@id/navigation" 
     android:layout_width="@dimen/navigation_menu_width" 
     android:layout_height="fill_parent" /> 
</android.support.v4.widget.DrawerLayout> 

然後刪除主佈局中的DrawerLayout。現在您的主要活動的佈局應該看起來像

<RelativeLayout android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    ... 
</RelativeLayout> 

我們假設主活動的佈局命名爲「main.xml」。

在MainActivity

,寫成如下:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // Inflate the "decor.xml" 
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    DrawerLayout drawer = (DrawerLayout) inflater.inflate(R.layout.decor, null); // "null" is important. 

    // HACK: "steal" the first child of decor view 
    ViewGroup decor = (ViewGroup) getWindow().getDecorView(); 
    View child = decor.getChildAt(0); 
    decor.removeView(child); 
    FrameLayout container = (FrameLayout) drawer.findViewById(R.id.container); // This is the container we defined just now. 
    container.addView(child); 

    // Make the drawer replace the first child 
    decor.addView(drawer); 

    // Do what you want to do....... 

} 

現在你已經有了一個DrawerLayout可以在動作條滑動。但是你可能會發現它由狀態欄覆蓋。你可能需要添加一個paddingTop到抽屜來解決這個問題。

+3

確認這個破解工作正常。 我們需要添加填充到抽屜,這裏是獲取狀態欄高度的技巧:http://stackoverflow.com/questions/ 20584325 /可靠獲取高度狀態條解決kitkat半透明導航問題。 另一個破解是我們想要添加片段到容器,而不是像這樣添加:fragmentTransaction.replace(R .id.contai片段); 我們應該替換爲R.id.content。 fragmentTransaction.replace(getContentIdResource(),fragment); ... private int getContentIdResource(){ \t \t return getResources()。getIdentifier(「content」,「id」,「android」); \t} – lemycanh

+0

@lemycanh我用來添加片段的另一個解決方案是在主佈局中添加一個容器。抽屜佈局已經從主佈局中分離出來,所以R.id.container只打包在main.xml中定義的佈局。 –

+0

偉大的答案!在實現這個之後,我意識到我們實際上是從另一個佈局中竊取了一個視圖並放棄它!哈哈 – uLYsseus

34

UPDATE:如何用疊加導航抽屜的動作條。 (使用新的工具欄) 在你的build.gradle

compile 'com.android.support:appcompat-v7:21.0.0' 
compile 'com.android.support:support-v4:21.0.0' 

這使用這些在你的依賴作爲你drawerlayout

<!-- A DrawerLayout is intended to be used as the top-level content view using match_parent for both width and height to consume the full space available. --> 
<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <LinearLayout 
     android:id="@+id/layout_main" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 
    <include layout="@layout/toolbar"/> 
    <!-- As the main content view, the view below consumes the entire 
     space available using match_parent in both dimensions. --> 
    <FrameLayout 
     android:id="@+id/content_frame" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@color/white"/> 

    </LinearLayout> 
    <fragment android:id="@+id/navigation_drawer" 
     android:layout_width="@dimen/navigation_drawer_width" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:background="@color/list_background" 
     /> 

</android.support.v4.widget.DrawerLayout> 

結交新toolbar.xml文件在佈局文件夾中。

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/toolbar" 
    android:layout_height="wrap_content" 
    android:layout_width="match_parent" 
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
    android:minHeight="?attr/actionBarSize" 
    android:background="?attr/colorPrimary" /> 

轉到您的活動擴展導航抽屜。 和之後的setContentView添加此()

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
setSupportActionBar(toolbar); 

不要忘記延長你的主題NoActionBar在你的價值觀的文件夾。

<style name="Theme.Whtsnxt" parent="@style/Theme.AppCompat.Light.NoActionBar"> 
    <item name="windowActionBar">false</item> 
    <!-- colorPrimary is used for the default action bar background --> 
    <item name="windowActionModeOverlay">true</item> 
    <item name="android:textColorPrimary">@color/white</item> 
    <item name="colorPrimary">@color/splashscreen</item> 
    <item name="colorPrimaryDark">@color/holo_blue_light</item> 

    <item name="android:windowBackground">@color/white</item> 
    <item name="android:colorBackground">@color/white</item> 

</style> 
+0

您可以使用apktool查看佈局。這是不好的,但我沒有辦法:( – lemycanh

+1

這個庫不應該使用,它已經很長時間沒有更新了,當谷歌有DrawerLayout時,它違背了設計準則。看看Google I/O應用程序,特別是Android L的Material版本(它位於GitHub頁面上:https://github.com/google/iosched)。DrawerLayout可以覆蓋操作欄 – afollestad

+0

在回答問題時,沒有解決方案這個我知道!謝謝你的建議我編輯了答案! –

0

我發佈了一個技巧,使之在以前的Android L版本中成爲可能。 你可以找到我的解決方案in this post。希望對某人有用。

0

如果你不想使用一個lib或這個技巧:

  1. 擴展「Theme.AppCompat.NoActionBar」
  2. 將您DrawerLayout的第一個元素爲LinearLayout中。
  3. 將一個工具欄添加到此LinearLayout。

    <android.support.v7.widget.Toolbar 
        android:id="@+id/toolbar" 
        android:minHeight="?attr/actionBarSize" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        app:titleTextColor="@android:color/white" 
        android:background="?attr/colorPrimary"> 
    </android.support.v7.widget.Toolbar> 
    
  4. 在活動

    加下面一行的setContentView

    setSupportActionBar((Toolbar) findViewById(R.id.toolbar)); 
    
  5. 後,現在它應該工作。
+0

現在看到[這裏](https://stackoverflow.com/a/30998517/2347168)是相同的答案,但代碼更多。 – fupduck