summaryrefslogtreecommitdiffstats
path: root/samples/Support4Demos/src/com/example/android/supportv4/widget/DrawerLayoutActivity.java
diff options
context:
space:
mode:
authorAdam Powell <adamp@google.com>2013-02-20 11:51:00 -0800
committerAdam Powell <adamp@google.com>2013-04-18 17:31:30 -0700
commit98c5d4a228a45a3240afe82f269bb90f91b8e6a5 (patch)
tree4a22fd2a9c6fc7bb11b95799f50eaecd9a3422fb /samples/Support4Demos/src/com/example/android/supportv4/widget/DrawerLayoutActivity.java
parent2c0001e62c749d987a20e48c76eb4e3736209aee (diff)
downloadandroid_development-98c5d4a228a45a3240afe82f269bb90f91b8e6a5.tar.gz
android_development-98c5d4a228a45a3240afe82f269bb90f91b8e6a5.tar.bz2
android_development-98c5d4a228a45a3240afe82f269bb90f91b8e6a5.zip
Add Support4Demos examples for DrawerLayout and SlidingPaneLayout
Show basic usage of these two new widgets. Change-Id: I1ec82041c198e2b2853a0d1eb07e0ab78dbea61c
Diffstat (limited to 'samples/Support4Demos/src/com/example/android/supportv4/widget/DrawerLayoutActivity.java')
-rw-r--r--samples/Support4Demos/src/com/example/android/supportv4/widget/DrawerLayoutActivity.java244
1 files changed, 244 insertions, 0 deletions
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/widget/DrawerLayoutActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/widget/DrawerLayoutActivity.java
new file mode 100644
index 000000000..ce311ccc0
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/widget/DrawerLayoutActivity.java
@@ -0,0 +1,244 @@
+/*
+ * Copyright (C) 2013 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.supportv4.widget;
+
+import android.app.ActionBar;
+import android.app.Activity;
+import android.content.res.Configuration;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.v4.app.ActionBarDrawerToggle;
+import android.support.v4.view.GravityCompat;
+import android.support.v4.widget.DrawerLayout;
+import android.view.Gravity;
+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.supportv4.R;
+import com.example.android.supportv4.Shakespeare;
+
+/**
+ * This example illustrates a common usage of the DrawerLayout widget
+ * in the Android support library.
+ *
+ * <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>
+ */
+public class DrawerLayoutActivity extends Activity {
+ private DrawerLayout mDrawerLayout;
+ private ListView mDrawer;
+ private TextView mContent;
+
+ private ActionBarHelper mActionBar;
+
+ private ActionBarDrawerToggle mDrawerToggle;
+
+ @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.left_drawer);
+ mContent = (TextView) findViewById(R.id.content_text);
+
+ mDrawerLayout.setDrawerListener(new DemoDrawerListener());
+ mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
+
+ mDrawer.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
+ Shakespeare.TITLES));
+ mDrawer.setOnItemClickListener(new DrawerItemClickListener());
+
+ mActionBar = createActionBarHelper();
+ mActionBar.init();
+
+ // ActionBarDrawerToggle provides convenient helpers for tying together the
+ // prescribed interactions between a top-level sliding drawer and the action bar.
+ mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
+ R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close);
+ }
+
+ @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.
+ * mDrawerToggle will take care of this.
+ */
+ if (mDrawerToggle.onOptionsItemSelected(item)) {
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ @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]);
+ mActionBar.setTitle(Shakespeare.TITLES[position]);
+ mDrawerLayout.closeDrawer(mDrawer);
+ }
+ }
+
+ /**
+ * A drawer listener can be used to respond to drawer events such as becoming
+ * fully opened or closed. You should always prefer to perform expensive operations
+ * such as drastic relayout when no animation is currently in progress, either before
+ * or after the drawer animates.
+ *
+ * When using ActionBarDrawerToggle, all DrawerLayout listener methods should be forwarded
+ * if the ActionBarDrawerToggle is not used as the DrawerLayout listener directly.
+ */
+ private class DemoDrawerListener implements DrawerLayout.DrawerListener {
+ @Override
+ public void onDrawerOpened(View drawerView) {
+ mDrawerToggle.onDrawerOpened(drawerView);
+ mActionBar.onDrawerOpened();
+ }
+
+ @Override
+ public void onDrawerClosed(View drawerView) {
+ mDrawerToggle.onDrawerClosed(drawerView);
+ mActionBar.onDrawerClosed();
+ }
+
+ @Override
+ public void onDrawerSlide(View drawerView, float slideOffset) {
+ mDrawerToggle.onDrawerSlide(drawerView, slideOffset);
+ }
+
+ @Override
+ public void onDrawerStateChanged(int newState) {
+ mDrawerToggle.onDrawerStateChanged(newState);
+ }
+ }
+
+ /**
+ * Create a compatible helper that will manipulate the action bar if available.
+ */
+ private ActionBarHelper createActionBarHelper() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
+ return new ActionBarHelperICS();
+ } else {
+ return new ActionBarHelper();
+ }
+ }
+
+ /**
+ * Stub action bar helper; this does nothing.
+ */
+ private class ActionBarHelper {
+ public void init() {}
+ public void onDrawerClosed() {}
+ public void onDrawerOpened() {}
+ public void setTitle(CharSequence title) {}
+ }
+
+ /**
+ * Action bar helper for use on ICS and newer devices.
+ */
+ private class ActionBarHelperICS extends ActionBarHelper {
+ private final ActionBar mActionBar;
+ private CharSequence mDrawerTitle;
+ private CharSequence mTitle;
+
+ ActionBarHelperICS() {
+ mActionBar = getActionBar();
+ }
+
+ @Override
+ public void init() {
+ mActionBar.setDisplayHomeAsUpEnabled(true);
+ mActionBar.setHomeButtonEnabled(true);
+ mTitle = mDrawerTitle = getTitle();
+ }
+
+ /**
+ * When the drawer is closed we restore the action bar state reflecting
+ * the specific contents in view.
+ */
+ @Override
+ public void onDrawerClosed() {
+ super.onDrawerClosed();
+ mActionBar.setTitle(mTitle);
+ }
+
+ /**
+ * When the drawer is open we set the action bar to a generic title.
+ * The action bar should only contain data relevant at the top level of
+ * the nav hierarchy represented by the drawer, as the rest of your content
+ * will be dimmed down and non-interactive.
+ */
+ @Override
+ public void onDrawerOpened() {
+ super.onDrawerOpened();
+ mActionBar.setTitle(mDrawerTitle);
+ }
+
+ @Override
+ public void setTitle(CharSequence title) {
+ mTitle = title;
+ }
+ }
+}