diff options
author | Adam Powell <adamp@google.com> | 2013-02-20 11:51:00 -0800 |
---|---|---|
committer | Adam Powell <adamp@google.com> | 2013-04-18 17:31:30 -0700 |
commit | 98c5d4a228a45a3240afe82f269bb90f91b8e6a5 (patch) | |
tree | 4a22fd2a9c6fc7bb11b95799f50eaecd9a3422fb /samples/Support4Demos/src/com/example/android/supportv4/widget/DrawerLayoutActivity.java | |
parent | 2c0001e62c749d987a20e48c76eb4e3736209aee (diff) | |
download | android_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.java | 244 |
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; + } + } +} |