diff options
author | Kirill Grouchnikov <kirillg@google.com> | 2015-10-30 14:35:36 -0400 |
---|---|---|
committer | Kirill Grouchnikov <kirillg@google.com> | 2015-11-02 12:45:32 -0500 |
commit | 220a8ecaa3d9d2380eddaf2a47fc428253510ffd (patch) | |
tree | 049232f4756cc15224bb0752c64d9bd2629d1705 | |
parent | caaf7b076e0b848c74880e12f23493d4a1d16984 (diff) | |
download | android_development-220a8ecaa3d9d2380eddaf2a47fc428253510ffd.tar.gz android_development-220a8ecaa3d9d2380eddaf2a47fc428253510ffd.tar.bz2 android_development-220a8ecaa3d9d2380eddaf2a47fc428253510ffd.zip |
Material-compliant sample app for drawer layout.
Bug: 25321348
Change-Id: Ib26c112bbcb515869bd3bacc91be553b9aca8ef0
-rw-r--r-- | samples/Support7Demos/AndroidManifest.xml | 10 | ||||
-rw-r--r-- | samples/Support7Demos/res/drawable-hdpi/drawer_shadow.9.png | bin | 0 -> 171 bytes | |||
-rw-r--r-- | samples/Support7Demos/res/drawable-mdpi/drawer_shadow.9.png | bin | 0 -> 158 bytes | |||
-rw-r--r-- | samples/Support7Demos/res/drawable-xhdpi/drawer_shadow.9.png | bin | 0 -> 182 bytes | |||
-rw-r--r-- | samples/Support7Demos/res/layout/drawer_layout.xml | 75 | ||||
-rw-r--r-- | samples/Support7Demos/res/values/colors.xml | 2 | ||||
-rw-r--r-- | samples/Support7Demos/res/values/strings.xml | 6 | ||||
-rw-r--r-- | samples/Support7Demos/res/values/styles.xml | 8 | ||||
-rw-r--r-- | samples/Support7Demos/src/com/example/android/supportv7/widget/DrawerLayoutActivity.java | 197 |
9 files changed, 298 insertions, 0 deletions
diff --git a/samples/Support7Demos/AndroidManifest.xml b/samples/Support7Demos/AndroidManifest.xml index 1b8850772..df9b2d1fc 100644 --- a/samples/Support7Demos/AndroidManifest.xml +++ b/samples/Support7Demos/AndroidManifest.xml @@ -433,6 +433,16 @@ <category android:name="com.example.android.supportv7.SAMPLE_CODE"/> </intent-filter> </activity> + + <!-- DrawerLayout demo activity --> + <activity android:name=".widget.DrawerLayoutActivity" + android:label="@string/drawer_layout_activity" + android:theme="@style/Theme.SampleDrawerLayout"> + <intent-filter> + <action android:name="android.intent.action.MAIN"/> + <category android:name="com.example.android.supportv7.SAMPLE_CODE"/> + </intent-filter> + </activity> </application> diff --git a/samples/Support7Demos/res/drawable-hdpi/drawer_shadow.9.png b/samples/Support7Demos/res/drawable-hdpi/drawer_shadow.9.png Binary files differnew file mode 100644 index 000000000..224cc4ff4 --- /dev/null +++ b/samples/Support7Demos/res/drawable-hdpi/drawer_shadow.9.png diff --git a/samples/Support7Demos/res/drawable-mdpi/drawer_shadow.9.png b/samples/Support7Demos/res/drawable-mdpi/drawer_shadow.9.png Binary files differnew file mode 100644 index 000000000..3797f99c0 --- /dev/null +++ b/samples/Support7Demos/res/drawable-mdpi/drawer_shadow.9.png diff --git a/samples/Support7Demos/res/drawable-xhdpi/drawer_shadow.9.png b/samples/Support7Demos/res/drawable-xhdpi/drawer_shadow.9.png Binary files differnew file mode 100644 index 000000000..fa3d853e9 --- /dev/null +++ b/samples/Support7Demos/res/drawable-xhdpi/drawer_shadow.9.png diff --git a/samples/Support7Demos/res/layout/drawer_layout.xml b/samples/Support7Demos/res/layout/drawer_layout.xml new file mode 100644 index 000000000..c110af75f --- /dev/null +++ b/samples/Support7Demos/res/layout/drawer_layout.xml @@ -0,0 +1,75 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<!-- + A DrawerLayout is indended 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" + android:id="@+id/drawer_layout" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:fitsSystemWindows="true"> + <!-- As the main content view, the view below consumes the entire + space available using match_parent in both dimensions. Note that + this child does not specify android:layout_gravity attribute. --> + <FrameLayout + android:id="@+id/content" + android:layout_width="match_parent" + android:layout_height="match_parent"> + <!-- This will be set as the support action bar of the activity at runtime. + It needs to be a dynamic runtime call for correct vertical layering of + the drawer and the toolbar. --> + <android.support.v7.widget.Toolbar + android:id="@+id/toolbar" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + <!-- Note layout_marginTop attribute with action bar height as the value. + This "pushes" down the main content so that it doesn't overlap with + the toolbar. --> + <ScrollView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginTop="?attr/actionBarSize" + android:scrollbarStyle="outsideOverlay"> + <TextView + android:id="@+id/content_text" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:text="@string/drawer_layout_summary" + android:textAppearance="?android:attr/textAppearanceMedium" + android:padding="16dp"/> + </ScrollView> + </FrameLayout> + + <!-- android:layout_gravity="start" tells DrawerLayout to treat + this as a sliding drawer on the starting side, which is + left for left-to-right locales. The drawer is given a fixed + width in dp and extends the full height of the container. A + solid background is used for contrast with the content view. + android:fitsSystemWindows="true" tells the system to have + DrawerLayout span the full height of the screen, including the + system status bar on Lollipop+ versions of the plaform. --> + <ListView + android:id="@+id/start_drawer" + android:layout_width="300dp" + android:layout_height="match_parent" + android:layout_gravity="start" + android:background="#ff333333" + android:fitsSystemWindows="true"/> +</android.support.v4.widget.DrawerLayout> + diff --git a/samples/Support7Demos/res/values/colors.xml b/samples/Support7Demos/res/values/colors.xml index c8c67a0a2..8667546b0 100644 --- a/samples/Support7Demos/res/values/colors.xml +++ b/samples/Support7Demos/res/values/colors.xml @@ -21,4 +21,6 @@ <color name="card_classic">#BAB7A9</color> <color name="card_sunbrite">#F9D6AC</color> <color name="card_tropical">#56C4E8</color> + + <color name="drawer_sample_metal_blue">#FF505080</color> </resources> diff --git a/samples/Support7Demos/res/values/strings.xml b/samples/Support7Demos/res/values/strings.xml index d0b97f1cc..45bb45900 100644 --- a/samples/Support7Demos/res/values/strings.xml +++ b/samples/Support7Demos/res/values/strings.xml @@ -200,4 +200,10 @@ <string name="swipe">swipe me</string> <string name="swiping">swiping</string> <string name="vertical">vertical</string> + + <string name="drawer_layout_activity">Drawer layout</string> + <string name="drawer_layout_summary">This activity illustrates the use of sliding drawers. The drawer may be pulled out from the starting edge, which is left on left-to-right locales, with an edge swipe. You can tap the hamburger (three horizontal lines) icon at the starting side of the action bar to open the drawer as well.</string> + <string name="drawer_title">Navigation</string> + <string name="drawer_open">Open navigation drawer</string> + <string name="drawer_close">Close navigation drawer</string> </resources> diff --git a/samples/Support7Demos/res/values/styles.xml b/samples/Support7Demos/res/values/styles.xml index a78893826..250b4bf9c 100644 --- a/samples/Support7Demos/res/values/styles.xml +++ b/samples/Support7Demos/res/values/styles.xml @@ -66,4 +66,12 @@ <item name="android:minHeight">35dp</item> </style> + <style name="Theme.SampleDrawerLayout" parent="Theme.AppCompat.NoActionBar"> + <!-- Tell SystemUI that our activity window will draw the background for the status bar. --> + <item name="android:windowDrawsSystemBarBackgrounds">true</item> + <!-- Set the status bar to be translucent black. --> + <item name="android:statusBarColor">#30000000</item> + <item name="windowActionModeOverlay">true</item> + <item name="android:windowContentOverlay">@null</item> + </style> </resources> diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/DrawerLayoutActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/DrawerLayoutActivity.java new file mode 100644 index 000000000..8cdf927c2 --- /dev/null +++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/DrawerLayoutActivity.java @@ -0,0 +1,197 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.supportv7.widget; + +import android.content.res.Configuration; +import android.os.Bundle; +import android.support.v4.view.GravityCompat; +import android.support.v4.widget.DrawerLayout; +import android.support.v7.app.ActionBarDrawerToggle; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.view.MenuItem; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.ListView; +import android.widget.TextView; +import com.example.android.supportv7.R; +import com.example.android.supportv7.Shakespeare; + +/** + * This example illustrates a common usage of the DrawerLayout widget combined with Toolbar + * in the Android support library that respect the + * <a href="https://www.google.com/design/spec/patterns/navigation-drawer.html">Material design + * guidelines</a> for the drawer component. + * + * + * <p>A DrawerLayout should be positioned at the top of your view hierarchy, placing it + * below the action bar but above your content views. The primary content should match_parent + * in both dimensions. Each drawer should define a reasonable width and match_parent for height. + * Drawer views should be positioned after the content view in your layout to preserve proper + * ordering.</p> + * + * <p>When a navigation (left) drawer is present, the host activity should detect presses of + * the action bar's Up affordance as a signal to open and close the navigation drawer. + * Items within the drawer should fall into one of two categories.</p> + * + * <ul> + * <li><strong>View switches</strong>. A view switch follows the same basic policies as + * list or tab navigation in that a view switch does not create navigation history. + * This pattern should only be used at the root activity of a task, leaving some form + * of Up navigation active for activities further down the navigation hierarchy.</li> + * <li><strong>Selective Up</strong>. The drawer allows the user to choose an alternate + * parent for Up navigation. This allows a user to jump across an app's navigation + * hierarchy at will. The application should treat this as it treats Up navigation from + * a different task, replacing the current task stack using TaskStackBuilder or similar. + * This is the only form of navigation drawer that should be used outside of the root + * activity of a task.</li> + * </ul> + * + * <p>Right side drawers should be used for actions, not navigation. This follows the pattern + * established by the Action Bar that navigation should be to the left and actions to the right. + * An action should be an operation performed on the current contents of the window, + * for example enabling or disabling a data overlay on top of the current content.</p> + * + * <p>When the drawer is open, it is above the application toolbar. On Lollipop versions of the + * platform and above the drawer spans the full height of the screen, including behind the system + * status bar.</p> + */ +public class DrawerLayoutActivity extends AppCompatActivity { + private DrawerLayout mDrawerLayout; + private ListView mDrawer; + private TextView mContent; + + private ActionBarDrawerToggle mDrawerToggle; + private Toolbar mToolbar; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.drawer_layout); + + mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); + mDrawer = (ListView) findViewById(R.id.start_drawer); + mContent = (TextView) findViewById(R.id.content_text); + + mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); + + // The drawer title must be set in order to announce state changes when + // accessibility is turned on. This is typically a simple description, + // e.g. "Navigation". + mDrawerLayout.setDrawerTitle(GravityCompat.START, getString(R.string.drawer_title)); + + mDrawer.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, + Shakespeare.TITLES)); + mDrawer.setOnItemClickListener(new DrawerItemClickListener()); + + // Find the toolbar in our layout and set it as the support action bar on the activity. + // This is required to have the drawer slide "over" the toolbar. + mToolbar = (Toolbar) findViewById(R.id.toolbar); + mToolbar.setTitle(R.string.drawer_title); + setSupportActionBar(mToolbar); + + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setDisplayShowHomeEnabled(false); + + // ActionBarDrawerToggle provides convenient helpers for tying together the + // prescribed interactions between a top-level sliding drawer and the action bar. + // Note that, as the Javadocs of ActionBarDrawerToggle constructors say, we are + // *not* using a constructor that gets a Toolbar since we're setting our toolbar + // dynamically at runtime. Furthermore, as the drawer is sliding over the toolbar, + // we are suppressing the morphing animation from hamburger to back arrow by + // calling super.onDrawerSlide with slideOffset=0.0f. In case your app only has + // top-level pages and doesn't need back arrow visuals at all, you can set up + // your activity theme to have attribute named "drawerArrowStyle" that points + // to an extension of Widget.AppCompat.DrawerArrowToggle that has its "spinBars" + // attribute set to false. + mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, + R.string.drawer_open, R.string.drawer_close) { + @Override + public void onDrawerOpened(View drawerView) { + super.onDrawerOpened(drawerView); + super.onDrawerSlide(drawerView, 0.0f); + } + + @Override + public void onDrawerSlide(View drawerView, float slideOffset) { + super.onDrawerSlide(drawerView, 0.0f); + } + }; + + mDrawerLayout.setDrawerListener(mDrawerToggle); + + // Configure the background color fill of the system status bar (on supported platform + // versions) and the toolbar itself. We're using the same color, and android:statusBar + // from the theme makes the status bar slightly darker. + final int metalBlueColor = getResources().getColor(R.color.drawer_sample_metal_blue); + mDrawerLayout.setStatusBarBackgroundColor(metalBlueColor); + mToolbar.setBackgroundColor(metalBlueColor); + } + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + + // Sync the toggle state after onRestoreInstanceState has occurred. + mDrawerToggle.syncState(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + /* + * The action bar home/up action should open or close the drawer. + * The drawer toggle will take care of this. + */ + if (mDrawerToggle.onOptionsItemSelected(item)) { + return true; + } + return super.onOptionsItemSelected(item); + } + + @Override + public void onBackPressed() { + // Is the drawer open? + if (mDrawerLayout.isDrawerOpen(mDrawer)) { + // Close the drawer and return. + mDrawerLayout.closeDrawer(mDrawer); + return; + } + + super.onBackPressed(); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + mDrawerToggle.onConfigurationChanged(newConfig); + } + + /** + * This list item click listener implements very simple view switching by changing + * the primary content text. The drawer is closed when a selection is made. + */ + private class DrawerItemClickListener implements ListView.OnItemClickListener { + @Override + public void onItemClick(AdapterView<?> parent, View view, int position, long id) { + mContent.setText(Shakespeare.DIALOGUE[position]); + mToolbar.setTitle(Shakespeare.TITLES[position]); + mDrawerLayout.closeDrawer(mDrawer); + } + } +} |