|
/* |
|
* 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.navigationdrawer; |
|
|
|
import android.app.Fragment; |
|
import android.app.FragmentManager; |
|
import android.app.SearchManager; |
|
import android.content.Intent; |
|
import android.content.res.Configuration; |
|
import android.net.Uri; |
|
import android.os.Bundle; |
|
import android.support.v4.app.ActionBarDrawerToggle; |
|
import android.support.v4.view.GravityCompat; |
|
import android.support.v4.widget.DrawerLayout; |
|
import android.support.v7.app.ActionBarActivity; |
|
import android.support.v7.widget.LinearLayoutManager; |
|
import android.support.v7.widget.RecyclerView; |
|
import android.view.Menu; |
|
import android.view.MenuItem; |
|
import android.view.View; |
|
import android.widget.Toast; |
|
import android.support.v7.widget.Toolbar; |
|
|
|
import java.util.Locale; |
|
|
|
/** |
|
* This example illustrates a common usage of the DrawerLayout widget |
|
* in the Android support library. |
|
* <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. The |
|
* ActionBarDrawerToggle facilitates this behavior. |
|
* Items within the drawer should fall into one of two categories:</p> |
|
* <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/> |
|
* <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 NavigationDrawerActivity extends ActionBarActivity implements OpenspaceListFragment.OnFragmentInteractionListener,AllMapFragment.OnFragmentInteractionListener,PlanetAdapter.OnItemClickListener { |
|
private DrawerLayout mDrawerLayout; |
|
private RecyclerView mDrawerList; |
|
private ActionBarDrawerToggle mDrawerToggle; |
|
|
|
private CharSequence mDrawerTitle; |
|
private CharSequence mTitle; |
|
private String[] mPlanetTitles; |
|
|
|
@Override |
|
protected void onCreate(Bundle savedInstanceState) { |
|
super.onCreate(savedInstanceState); |
|
setContentView(R.layout.activity_navigation_drawer); |
|
|
|
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); |
|
setSupportActionBar(toolbar); |
|
|
|
mTitle = mDrawerTitle = getTitle(); |
|
mPlanetTitles = getResources().getStringArray(R.array.menu_array); |
|
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); |
|
mDrawerList = (RecyclerView) findViewById(R.id.left_drawer); |
|
|
|
// set a custom shadow that overlays the main content when the drawer opens |
|
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); |
|
// improve performance by indicating the list if fixed size. |
|
mDrawerList.setHasFixedSize(true); |
|
mDrawerList.setLayoutManager(new LinearLayoutManager(this)); |
|
|
|
// set up the drawer's list view with items and click listener |
|
mDrawerList.setAdapter(new PlanetAdapter(mPlanetTitles, this)); |
|
// enable ActionBar app icon to behave as action to toggle nav drawer |
|
|
|
// ActionBarDrawerToggle ties together the the proper interactions |
|
// between the sliding drawer and the action bar app icon |
|
mDrawerToggle = new ActionBarDrawerToggle( |
|
this, /* host Activity */ |
|
mDrawerLayout, /* DrawerLayout object */ |
|
R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */ |
|
R.string.drawer_open, /* "open drawer" description for accessibility */ |
|
R.string.drawer_close /* "close drawer" description for accessibility */ |
|
) { |
|
public void onDrawerClosed(View view) { |
|
getSupportActionBar().setTitle(mTitle); |
|
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() |
|
} |
|
|
|
public void onDrawerOpened(View drawerView) { |
|
getSupportActionBar().setTitle(mDrawerTitle); |
|
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() |
|
} |
|
}; |
|
mDrawerLayout.setDrawerListener(mDrawerToggle); |
|
|
|
// enable ActionBar app icon to behave as action to toggle nav drawer |
|
getSupportActionBar().setDisplayHomeAsUpEnabled(true); |
|
getSupportActionBar().setHomeButtonEnabled(true); |
|
|
|
if (savedInstanceState == null) { |
|
selectItem(0); |
|
} |
|
} |
|
|
|
|
|
@Override |
|
public boolean onCreateOptionsMenu(Menu menu) { |
|
// Inflate the menu; this adds items to the action bar if it is present. |
|
getMenuInflater().inflate(R.menu.navigation_drawer, menu); |
|
return true; |
|
} |
|
|
|
/* Called whenever we call invalidateOptionsMenu() */ |
|
@Override |
|
public boolean onPrepareOptionsMenu(Menu menu) { |
|
// If the nav drawer is open, hide action items related to the content view |
|
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList); |
|
menu.findItem(R.id.action_websearch).setVisible(!drawerOpen); |
|
return super.onPrepareOptionsMenu(menu); |
|
} |
|
|
|
@Override |
|
public boolean onOptionsItemSelected(MenuItem item) { |
|
// The action bar home/up action should open or close the drawer. |
|
// ActionBarDrawerToggle will take care of this. |
|
if (mDrawerToggle.onOptionsItemSelected(item)) { |
|
return true; |
|
} |
|
// Handle action buttons |
|
switch (item.getItemId()) { |
|
case R.id.action_websearch: |
|
// create intent to perform web search for this planet |
|
Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); |
|
intent.putExtra(SearchManager.QUERY, getActionBar().getTitle()); |
|
// catch event that there's no activity to handle intent |
|
if (intent.resolveActivity(getPackageManager()) != null) { |
|
startActivity(intent); |
|
} else { |
|
Toast.makeText(this, R.string.app_not_available, Toast.LENGTH_LONG).show(); |
|
} |
|
return true; |
|
default: |
|
return super.onOptionsItemSelected(item); |
|
} |
|
} |
|
|
|
/* The click listener for RecyclerView in the navigation drawer */ |
|
@Override |
|
public void onClick(View view, int position) { |
|
selectItem(position); |
|
} |
|
|
|
private void selectItem(int position) { |
|
// update the main content by replacing fragments |
|
FragmentManager fragmentManager = getFragmentManager(); |
|
switch (position) { |
|
case 0: |
|
// Find all |
|
Fragment openspaceListFragment = OpenspaceListFragment.newInstance("123", "456"); |
|
|
|
fragmentManager.beginTransaction() |
|
.replace(R.id.content_frame, openspaceListFragment) |
|
.commit(); |
|
setTitle("All Open Spaces"); |
|
break; |
|
case 1: |
|
// Find Nearby |
|
Fragment allMapFragment = AllMapFragment.newInstance("123", "456"); |
|
|
|
fragmentManager.beginTransaction() |
|
.replace(R.id.content_frame, allMapFragment) |
|
.commit(); |
|
setTitle("Nearby"); |
|
break; |
|
} |
|
|
|
// update selected item title, then close the drawer |
|
mDrawerLayout.closeDrawer(mDrawerList); |
|
} |
|
|
|
@Override |
|
public void setTitle(CharSequence title) { |
|
mTitle = title; |
|
getSupportActionBar().setTitle(mTitle); |
|
} |
|
|
|
/** |
|
* When using the ActionBarDrawerToggle, you must call it during |
|
* onPostCreate() and onConfigurationChanged()... |
|
*/ |
|
|
|
@Override |
|
protected void onPostCreate(Bundle savedInstanceState) { |
|
super.onPostCreate(savedInstanceState); |
|
// Sync the toggle state after onRestoreInstanceState has occurred. |
|
mDrawerToggle.syncState(); |
|
} |
|
|
|
@Override |
|
public void onConfigurationChanged(Configuration newConfig) { |
|
super.onConfigurationChanged(newConfig); |
|
// Pass any configuration change to the drawer toggls |
|
mDrawerToggle.onConfigurationChanged(newConfig); |
|
} |
|
|
|
@Override |
|
public void onFragmentInteraction(String id) { |
|
|
|
|
|
} |
|
|
|
@Override |
|
public void onFragmentInteraction(Uri uri) { |
|
|
|
} |
|
} |