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 name="ActionBar" parent="@style/Widget.AppCompat.ActionBar">
<item name="android:background">@color/actionbar</item>
</style> </style>
</resources> </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 name="ActionBar" parent="@style/Widget.AppCompat.ActionBar">
<item name="android:background">@color/actionbar</item>
</style> </style>
</resources> </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,9 +26,11 @@ 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 {
@ -35,8 +40,8 @@ public class NavigationDrawerFragment extends Fragment {
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";
@ -65,13 +70,16 @@ public class NavigationDrawerFragment extends Fragment {
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
// awareness of the
// drawer. See PREF_USER_LEARNED_DRAWER for details. // drawer. See PREF_USER_LEARNED_DRAWER for details.
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity()); SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences(getActivity());
mUserLearnedDrawer = sp.getBoolean(PREF_USER_LEARNED_DRAWER, false); mUserLearnedDrawer = sp.getBoolean(PREF_USER_LEARNED_DRAWER, false);
if (savedInstanceState != null) { if (savedInstanceState != null) {
mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION); mCurrentSelectedPosition = savedInstanceState
.getInt(STATE_SELECTED_POSITION);
mFromSavedInstanceState = true; mFromSavedInstanceState = true;
} }
@ -82,7 +90,8 @@ public class NavigationDrawerFragment extends Fragment {
@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
// actions in the action bar.
setHasOptionsMenu(true); setHasOptionsMenu(true);
} }
@ -91,41 +100,46 @@ public class NavigationDrawerFragment extends Fragment {
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
.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
selectItem(position); selectItem(position);
} }
}); });
mDrawerListView.setAdapter(new ArrayAdapter<String>( mDrawerListView.setAdapter(new ArrayAdapter<String>(getActionBar()
getActionBar().getThemedContext(), .getThemedContext(), android.R.layout.simple_list_item_1,
android.R.layout.simple_list_item_1, android.R.id.text1, 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 fragmentId
* @param drawerLayout The DrawerLayout containing this fragment's UI. * The android:id of this fragment in its activity's layout.
* @param drawerLayout
* The DrawerLayout containing this fragment's UI.
*/ */
public void setUp(int fragmentId, DrawerLayout drawerLayout) { public void setUp(int fragmentId, DrawerLayout drawerLayout) {
mFragmentContainerView = getActivity().findViewById(fragmentId); mFragmentContainerView = getActivity().findViewById(fragmentId);
mDrawerLayout = drawerLayout; 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
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
GravityCompat.START);
// set up the drawer's list view with items and click listener // set up the drawer's list view with items and click listener
ActionBar actionBar = getActionBar(); ActionBar actionBar = getActionBar();
@ -134,12 +148,17 @@ public class NavigationDrawerFragment extends Fragment {
// 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, /* "open drawer" description for accessibility */ R.string.navigation_drawer_open, /*
R.string.navigation_drawer_close /* "close drawer" description for accessibility */ * "open drawer" description for
* accessibility
*/
R.string.navigation_drawer_close /*
* "close drawer" description for
* accessibility
*/
) { ) {
@Override @Override
public void onDrawerClosed(View drawerView) { public void onDrawerClosed(View drawerView) {
@ -148,7 +167,8 @@ public class NavigationDrawerFragment extends Fragment {
return; return;
} }
getActivity().supportInvalidateOptionsMenu(); // calls onPrepareOptionsMenu() getActivity().supportInvalidateOptionsMenu(); // calls
// onPrepareOptionsMenu()
} }
@Override @Override
@ -159,19 +179,23 @@ public class NavigationDrawerFragment extends Fragment {
} }
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
// prevent auto-showing
// the navigation drawer automatically in the future. // the navigation drawer automatically in the future.
mUserLearnedDrawer = true; mUserLearnedDrawer = true;
SharedPreferences sp = PreferenceManager SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences(getActivity()); .getDefaultSharedPreferences(getActivity());
sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).commit(); 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
// them to the drawer,
// per the navigation drawer design guidelines. // per the navigation drawer design guidelines.
if (!mUserLearnedDrawer && !mFromSavedInstanceState) { if (!mUserLearnedDrawer && !mFromSavedInstanceState) {
mDrawerLayout.openDrawer(mFragmentContainerView); mDrawerLayout.openDrawer(mFragmentContainerView);
@ -207,7 +231,8 @@ public class NavigationDrawerFragment extends Fragment {
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.");
} }
} }
@ -232,8 +257,10 @@ public class NavigationDrawerFragment extends Fragment {
@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
// showGlobalContextActionBar, which controls the top-left area of the
// action bar.
if (mDrawerLayout != null && isDrawerOpen()) { if (mDrawerLayout != null && isDrawerOpen()) {
inflater.inflate(R.menu.global, menu); inflater.inflate(R.menu.global, menu);
showGlobalContextActionBar(); showGlobalContextActionBar();
@ -248,7 +275,8 @@ public class NavigationDrawerFragment extends Fragment {
} }
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)
.show();
return true; return true;
} }
@ -256,8 +284,9 @@ public class NavigationDrawerFragment extends Fragment {
} }
/** /**
* 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() { private void showGlobalContextActionBar() {
ActionBar actionBar = getActionBar(); ActionBar actionBar = getActionBar();
@ -270,8 +299,32 @@ public class NavigationDrawerFragment extends Fragment {
return ((ActionBarActivity) getActivity()).getSupportActionBar(); return ((ActionBarActivity) getActivity()).getSupportActionBar();
} }
public void setInsets(View view) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
return;
SystemBarTintManager tintManager = new SystemBarTintManager(getActivity());
SystemBarTintManager.SystemBarConfig config = tintManager.getConfig();
view.setPadding(0, config.getPixelInsetTop(true),
config.getPixelInsetRight(), config.getPixelInsetBottom());
}
@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. * Callbacks interface that all activities using this fragment must
* implement.
*/ */
public static interface NavigationDrawerCallbacks { public static interface NavigationDrawerCallbacks {
/** /**