Don't use immersive mode, all you really gain is a bit of screen space.

Plus, backwards compatibility will be so much easier now!
This commit is contained in:
Bradlee Speice 2014-04-13 20:25:54 -04:00
parent 3d76bb9e18
commit 0fb72d416f
9 changed files with 330 additions and 228 deletions

Binary file not shown.

View File

@ -14,7 +14,9 @@
<FrameLayout <FrameLayout
android:id="@+id/container" android:id="@+id/container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:clipToPadding="false" />
<!-- <!--
android:layout_gravity="start" tells DrawerLayout to treat android:layout_gravity="start" tells DrawerLayout to treat
@ -33,6 +35,8 @@
android:name="org.bspeice.minimalbible.NavigationDrawerFragment" android:name="org.bspeice.minimalbible.NavigationDrawerFragment"
android:layout_width="@dimen/navigation_drawer_width" android:layout_width="@dimen/navigation_drawer_width"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:clipToPadding="false"
android:layout_gravity="start" /> android:layout_gravity="start" />
</android.support.v4.widget.DrawerLayout> </android.support.v4.widget.DrawerLayout>

View File

@ -1,5 +1,6 @@
<ListView xmlns:android="http://schemas.android.com/apk/res/android" <ListView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/list_nav_drawer"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="#cccc" android:background="#cccc"

View File

@ -5,7 +5,13 @@
AppBaseTheme from res/values/styles.xml on API 11+ devices. AppBaseTheme from res/values/styles.xml on API 11+ devices.
--> -->
<style name="AppBaseTheme" parent="Theme.AppCompat.Light"> <style name="AppBaseTheme" parent="Theme.AppCompat.Light">
<!-- API 11 theme customizations can go here. --> <!-- API 11 theme customizations can go here. -->
<item name="android:actionBarStyle">@style/ActionBar</item>
</style> </style>
</resources> <style name="ActionBar" parent="@style/Widget.AppCompat.ActionBar">
<item name="android:background">@color/actionbar</item>
</style>
</resources>

View File

@ -6,7 +6,13 @@
res/values-v11/styles.xml on API 14+ devices. res/values-v11/styles.xml on API 14+ devices.
--> -->
<style name="AppBaseTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <style name="AppBaseTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- API 14 theme customizations can go here. --> <!-- API 14 theme customizations can go here. -->
<item name="android:actionBarStyle">@style/ActionBar</item>
</style> </style>
</resources> <style name="ActionBar" parent="@style/Widget.AppCompat.ActionBar">
<item name="android:background">@color/actionbar</item>
</style>
</resources>

20
res/values-v19/styles.xml Normal file
View File

@ -0,0 +1,20 @@
<resources>
<!--
Base application theme for API 19+. This theme completely replaces
AppBaseTheme from BOTH res/values/styles.xml and
res/values-v11/styles.xml on API 19+ devices.
-->
<style name="AppBaseTheme" parent="Theme.AppCompat.Light">
<!-- API 19 theme customizations can go here. -->
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
<item name="android:actionBarStyle">@style/ActionBar</item>
</style>
<style name="ActionBar" parent="@style/Widget.AppCompat.ActionBar">
<item name="android:background">@color/actionbar</item>
</style>
</resources>

5
res/values/colors.xml Normal file
View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="statusbar">#ffdddddd</color>
<color name="actionbar">#dddddddd</color>
</resources>

View File

@ -1,21 +1,21 @@
package org.bspeice.minimalbible; package org.bspeice.minimalbible;
import com.readystatesoftware.systembartint.SystemBarTintManager;
import android.app.Activity; import android.app.Activity;
import android.support.v7.app.ActionBarActivity; import android.graphics.Color;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.content.Context;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.view.Gravity; import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.support.v4.widget.DrawerLayout;
import android.widget.ArrayAdapter;
import android.widget.TextView; import android.widget.TextView;
public class BibleViewer extends ActionBarActivity implements public class BibleViewer extends ActionBarActivity implements
@ -45,6 +45,13 @@ public class BibleViewer extends ActionBarActivity implements
// Set up the drawer. // Set up the drawer.
mNavigationDrawerFragment.setUp(R.id.navigation_drawer, mNavigationDrawerFragment.setUp(R.id.navigation_drawer,
(DrawerLayout) findViewById(R.id.drawer_layout)); (DrawerLayout) findViewById(R.id.drawer_layout));
// Only set the tint if the device is running KitKat or above
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
SystemBarTintManager tintManager = new SystemBarTintManager(this);
tintManager.setStatusBarTintEnabled(true);
tintManager.setStatusBarTintColor(getResources().getColor(R.color.statusbar));
}
} }
@Override @Override

View File

@ -1,5 +1,7 @@
package org.bspeice.minimalbible; package org.bspeice.minimalbible;
import com.readystatesoftware.systembartint.SystemBarTintManager;
import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBarActivity;
import android.app.Activity; import android.app.Activity;
import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBar;
@ -9,6 +11,7 @@ import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.DrawerLayout;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -23,260 +26,310 @@ import android.widget.ListView;
import android.widget.Toast; import android.widget.Toast;
/** /**
* Fragment used for managing interactions for and presentation of a navigation drawer. * Fragment used for managing interactions for and presentation of a navigation
* See the <a href="https://developer.android.com/design/patterns/navigation-drawer.html#Interaction"> * drawer. See the <a href=
* design guidelines</a> for a complete explanation of the behaviors implemented here. * "https://developer.android.com/design/patterns/navigation-drawer.html#Interaction"
* > design guidelines</a> for a complete explanation of the behaviors
* implemented here.
*/ */
public class NavigationDrawerFragment extends Fragment { public class NavigationDrawerFragment extends Fragment {
/** /**
* Remember the position of the selected item. * Remember the position of the selected item.
*/ */
private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position"; private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position";
/** /**
* Per the design guidelines, you should show the drawer on launch until the user manually * Per the design guidelines, you should show the drawer on launch until the
* expands it. This shared preference tracks this. * user manually expands it. This shared preference tracks this.
*/ */
private static final String PREF_USER_LEARNED_DRAWER = "navigation_drawer_learned"; private static final String PREF_USER_LEARNED_DRAWER = "navigation_drawer_learned";
/** /**
* A pointer to the current callbacks instance (the Activity). * A pointer to the current callbacks instance (the Activity).
*/ */
private NavigationDrawerCallbacks mCallbacks; private NavigationDrawerCallbacks mCallbacks;
/** /**
* Helper component that ties the action bar to the navigation drawer. * Helper component that ties the action bar to the navigation drawer.
*/ */
private ActionBarDrawerToggle mDrawerToggle; private ActionBarDrawerToggle mDrawerToggle;
private DrawerLayout mDrawerLayout; private DrawerLayout mDrawerLayout;
private ListView mDrawerListView; private ListView mDrawerListView;
private View mFragmentContainerView; private View mFragmentContainerView;
private int mCurrentSelectedPosition = 0; private int mCurrentSelectedPosition = 0;
private boolean mFromSavedInstanceState; private boolean mFromSavedInstanceState;
private boolean mUserLearnedDrawer; private boolean mUserLearnedDrawer;
public NavigationDrawerFragment() { public NavigationDrawerFragment() {
} }
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
// Read in the flag indicating whether or not the user has demonstrated awareness of the // Read in the flag indicating whether or not the user has demonstrated
// drawer. See PREF_USER_LEARNED_DRAWER for details. // awareness of the
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity()); // drawer. See PREF_USER_LEARNED_DRAWER for details.
mUserLearnedDrawer = sp.getBoolean(PREF_USER_LEARNED_DRAWER, false); SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences(getActivity());
mUserLearnedDrawer = sp.getBoolean(PREF_USER_LEARNED_DRAWER, false);
if (savedInstanceState != null) { if (savedInstanceState != null) {
mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION); mCurrentSelectedPosition = savedInstanceState
mFromSavedInstanceState = true; .getInt(STATE_SELECTED_POSITION);
} mFromSavedInstanceState = true;
}
// Select either the default item (0) or the last selected item. // Select either the default item (0) or the last selected item.
selectItem(mCurrentSelectedPosition); selectItem(mCurrentSelectedPosition);
} }
@Override @Override
public void onActivityCreated (Bundle savedInstanceState) { public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState); super.onActivityCreated(savedInstanceState);
// Indicate that this fragment would like to influence the set of actions in the action bar. // Indicate that this fragment would like to influence the set of
setHasOptionsMenu(true); // actions in the action bar.
} setHasOptionsMenu(true);
}
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { Bundle savedInstanceState) {
mDrawerListView = (ListView) inflater.inflate( mDrawerListView = (ListView) inflater.inflate(
R.layout.fragment_navigation_drawer, container, false); R.layout.fragment_navigation_drawer, container, false);
mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { mDrawerListView
@Override .setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { @Override
selectItem(position); public void onItemClick(AdapterView<?> parent, View view,
} int position, long id) {
}); selectItem(position);
mDrawerListView.setAdapter(new ArrayAdapter<String>( }
getActionBar().getThemedContext(), });
android.R.layout.simple_list_item_1, mDrawerListView.setAdapter(new ArrayAdapter<String>(getActionBar()
android.R.id.text1, .getThemedContext(), android.R.layout.simple_list_item_1,
new String[]{ android.R.id.text1, new String[] {
getString(R.string.title_section1), getString(R.string.title_section1),
getString(R.string.title_section2), getString(R.string.title_section2),
getString(R.string.title_section3), getString(R.string.title_section3), }));
})); mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
mDrawerListView.setItemChecked(mCurrentSelectedPosition, true); return mDrawerListView;
return mDrawerListView; }
}
public boolean isDrawerOpen() { public boolean isDrawerOpen() {
return mDrawerLayout != null && mDrawerLayout.isDrawerOpen(mFragmentContainerView); return mDrawerLayout != null
} && mDrawerLayout.isDrawerOpen(mFragmentContainerView);
}
/** /**
* Users of this fragment must call this method to set up the navigation drawer interactions. * Users of this fragment must call this method to set up the navigation
* * drawer interactions.
* @param fragmentId The android:id of this fragment in its activity's layout. *
* @param drawerLayout The DrawerLayout containing this fragment's UI. * @param fragmentId
*/ * The android:id of this fragment in its activity's layout.
public void setUp(int fragmentId, DrawerLayout drawerLayout) { * @param drawerLayout
mFragmentContainerView = getActivity().findViewById(fragmentId); * The DrawerLayout containing this fragment's UI.
mDrawerLayout = drawerLayout; */
public void setUp(int fragmentId, DrawerLayout drawerLayout) {
mFragmentContainerView = getActivity().findViewById(fragmentId);
mDrawerLayout = drawerLayout;
// set a custom shadow that overlays the main content when the drawer opens // set a custom shadow that overlays the main content when the drawer
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); // opens
// set up the drawer's list view with items and click listener mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
GravityCompat.START);
// set up the drawer's list view with items and click listener
ActionBar actionBar = getActionBar(); ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true); actionBar.setHomeButtonEnabled(true);
// ActionBarDrawerToggle ties together the the proper interactions // ActionBarDrawerToggle ties together the the proper interactions
// between the navigation drawer and the action bar app icon. // between the navigation drawer and the action bar app icon.
mDrawerToggle = new ActionBarDrawerToggle( mDrawerToggle = new ActionBarDrawerToggle(getActivity(), /* host Activity */
getActivity(), /* host Activity */ mDrawerLayout, /* DrawerLayout object */
mDrawerLayout, /* DrawerLayout object */ R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */
R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */ R.string.navigation_drawer_open, /*
R.string.navigation_drawer_open, /* "open drawer" description for accessibility */ * "open drawer" description for
R.string.navigation_drawer_close /* "close drawer" description for accessibility */ * accessibility
) { */
@Override R.string.navigation_drawer_close /*
public void onDrawerClosed(View drawerView) { * "close drawer" description for
super.onDrawerClosed(drawerView); * accessibility
if (!isAdded()) { */
return; ) {
} @Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
if (!isAdded()) {
return;
}
getActivity().supportInvalidateOptionsMenu(); // calls onPrepareOptionsMenu() getActivity().supportInvalidateOptionsMenu(); // calls
} // onPrepareOptionsMenu()
}
@Override @Override
public void onDrawerOpened(View drawerView) { public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView); super.onDrawerOpened(drawerView);
if (!isAdded()) { if (!isAdded()) {
return; return;
} }
if (!mUserLearnedDrawer) { if (!mUserLearnedDrawer) {
// The user manually opened the drawer; store this flag to prevent auto-showing // The user manually opened the drawer; store this flag to
// the navigation drawer automatically in the future. // prevent auto-showing
mUserLearnedDrawer = true; // the navigation drawer automatically in the future.
SharedPreferences sp = PreferenceManager mUserLearnedDrawer = true;
.getDefaultSharedPreferences(getActivity()); SharedPreferences sp = PreferenceManager
sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).commit(); .getDefaultSharedPreferences(getActivity());
} sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true)
.commit();
}
getActivity().supportInvalidateOptionsMenu(); // calls onPrepareOptionsMenu() getActivity().supportInvalidateOptionsMenu(); // calls
} // onPrepareOptionsMenu()
}; }
};
// If the user hasn't 'learned' about the drawer, open it to introduce them to the drawer, // If the user hasn't 'learned' about the drawer, open it to introduce
// per the navigation drawer design guidelines. // them to the drawer,
if (!mUserLearnedDrawer && !mFromSavedInstanceState) { // per the navigation drawer design guidelines.
mDrawerLayout.openDrawer(mFragmentContainerView); if (!mUserLearnedDrawer && !mFromSavedInstanceState) {
} mDrawerLayout.openDrawer(mFragmentContainerView);
}
// Defer code dependent on restoration of previous instance state. // Defer code dependent on restoration of previous instance state.
mDrawerLayout.post(new Runnable() { mDrawerLayout.post(new Runnable() {
@Override @Override
public void run() { public void run() {
mDrawerToggle.syncState(); mDrawerToggle.syncState();
} }
}); });
mDrawerLayout.setDrawerListener(mDrawerToggle); mDrawerLayout.setDrawerListener(mDrawerToggle);
} }
private void selectItem(int position) { private void selectItem(int position) {
mCurrentSelectedPosition = position; mCurrentSelectedPosition = position;
if (mDrawerListView != null) { if (mDrawerListView != null) {
mDrawerListView.setItemChecked(position, true); mDrawerListView.setItemChecked(position, true);
} }
if (mDrawerLayout != null) { if (mDrawerLayout != null) {
mDrawerLayout.closeDrawer(mFragmentContainerView); mDrawerLayout.closeDrawer(mFragmentContainerView);
} }
if (mCallbacks != null) { if (mCallbacks != null) {
mCallbacks.onNavigationDrawerItemSelected(position); mCallbacks.onNavigationDrawerItemSelected(position);
} }
} }
@Override @Override
public void onAttach(Activity activity) { public void onAttach(Activity activity) {
super.onAttach(activity); super.onAttach(activity);
try { try {
mCallbacks = (NavigationDrawerCallbacks) activity; mCallbacks = (NavigationDrawerCallbacks) activity;
} catch (ClassCastException e) { } catch (ClassCastException e) {
throw new ClassCastException("Activity must implement NavigationDrawerCallbacks."); throw new ClassCastException(
} "Activity must implement NavigationDrawerCallbacks.");
} }
}
@Override @Override
public void onDetach() { public void onDetach() {
super.onDetach(); super.onDetach();
mCallbacks = null; mCallbacks = null;
} }
@Override @Override
public void onSaveInstanceState(Bundle outState) { public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition); outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition);
} }
@Override @Override
public void onConfigurationChanged(Configuration newConfig) { public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig); super.onConfigurationChanged(newConfig);
// Forward the new configuration the drawer toggle component. // Forward the new configuration the drawer toggle component.
mDrawerToggle.onConfigurationChanged(newConfig); mDrawerToggle.onConfigurationChanged(newConfig);
} }
@Override @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// If the drawer is open, show the global app actions in the action bar. See also // If the drawer is open, show the global app actions in the action bar.
// showGlobalContextActionBar, which controls the top-left area of the action bar. // See also
if (mDrawerLayout != null && isDrawerOpen()) { // showGlobalContextActionBar, which controls the top-left area of the
inflater.inflate(R.menu.global, menu); // action bar.
showGlobalContextActionBar(); if (mDrawerLayout != null && isDrawerOpen()) {
} inflater.inflate(R.menu.global, menu);
super.onCreateOptionsMenu(menu, inflater); showGlobalContextActionBar();
} }
super.onCreateOptionsMenu(menu, inflater);
}
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
if (mDrawerToggle.onOptionsItemSelected(item)) { if (mDrawerToggle.onOptionsItemSelected(item)) {
return true; return true;
} }
if (item.getItemId() == R.id.action_example) { if (item.getItemId() == R.id.action_example) {
Toast.makeText(getActivity(), "Example action.", Toast.LENGTH_SHORT).show(); Toast.makeText(getActivity(), "Example action.", Toast.LENGTH_SHORT)
return true; .show();
} return true;
}
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
/** /**
* Per the navigation drawer design guidelines, updates the action bar to show the global app * Per the navigation drawer design guidelines, updates the action bar to
* 'context', rather than just what's in the current screen. * show the global app 'context', rather than just what's in the current
*/ * screen.
private void showGlobalContextActionBar() { */
ActionBar actionBar = getActionBar(); private void showGlobalContextActionBar() {
actionBar.setDisplayShowTitleEnabled(true); ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); actionBar.setDisplayShowTitleEnabled(true);
actionBar.setTitle(R.string.app_name); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
} actionBar.setTitle(R.string.app_name);
}
private ActionBar getActionBar() { private ActionBar getActionBar() {
return ((ActionBarActivity) getActivity()).getSupportActionBar(); return ((ActionBarActivity) getActivity()).getSupportActionBar();
} }
/** public void setInsets(View view) {
* Callbacks interface that all activities using this fragment must implement. if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
*/ return;
public static interface NavigationDrawerCallbacks { SystemBarTintManager tintManager = new SystemBarTintManager(getActivity());
/** SystemBarTintManager.SystemBarConfig config = tintManager.getConfig();
* Called when an item in the navigation drawer is selected. view.setPadding(0, config.getPixelInsetTop(true),
*/ config.getPixelInsetRight(), config.getPixelInsetBottom());
void onNavigationDrawerItemSelected(int position); }
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// This could also be a ScrollView
ListView list = (ListView) view.findViewById(R.id.list_nav_drawer);
// This could also be set in your layout, allows the list items to
// scroll through the bottom padded area (navigation bar)
list.setClipToPadding(false);
// Sets the padding to the insets (include action bar and navigation bar
// padding for the current device and orientation)
setInsets(list);
}
/**
* Callbacks interface that all activities using this fragment must
* implement.
*/
public static interface NavigationDrawerCallbacks {
/**
* Called when an item in the navigation drawer is selected.
*/
void onNavigationDrawerItemSelected(int position);
}
} }