| /* |
| * Copyright (C) 2014 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.app; |
| |
| import com.example.android.supportv7.R; |
| import com.example.android.supportv7.Shakespeare; |
| |
| 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.ActionBar; |
| import android.support.v7.app.ActionBarDrawerToggle; |
| import android.support.v7.app.AppCompatActivity; |
| import android.view.MenuItem; |
| import android.view.View; |
| import android.widget.AdapterView; |
| import android.widget.ArrayAdapter; |
| import android.widget.ListView; |
| import android.widget.TextView; |
| |
| public class ActionBarWithDrawerLayout extends AppCompatActivity { |
| 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.action_bar_drawer_layout); |
| mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); |
| mDrawer = (ListView) findViewById(R.id.start_drawer); |
| mContent = (TextView) findViewById(R.id.content_text); |
| |
| mDrawerLayout.setDrawerListener(new DemoDrawerListener()); |
| |
| // 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()); |
| |
| 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.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() { |
| return new ActionBarHelper(); |
| } |
| |
| /** |
| * Action bar helper for use on ICS and newer devices. |
| */ |
| private class ActionBarHelper { |
| private final ActionBar mActionBar; |
| private CharSequence mDrawerTitle; |
| private CharSequence mTitle; |
| |
| ActionBarHelper() { |
| mActionBar = getSupportActionBar(); |
| } |
| |
| public void init() { |
| mActionBar.setDisplayHomeAsUpEnabled(true); |
| mActionBar.setDisplayShowHomeEnabled(false); |
| mTitle = mDrawerTitle = getTitle(); |
| } |
| |
| /** |
| * When the drawer is closed we restore the action bar state reflecting |
| * the specific contents in view. |
| */ |
| public void 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. |
| */ |
| public void onDrawerOpened() { |
| mActionBar.setTitle(mDrawerTitle); |
| } |
| |
| public void setTitle(CharSequence title) { |
| mTitle = title; |
| } |
| } |
| } |