From c306efc912bb2a3628a5c4c554db6c743ffe120b Mon Sep 17 00:00:00 2001 From: Victor Date: Thu, 9 Jan 2014 22:35:19 +0200 Subject: [PATCH] =?UTF-8?q?MenuDrawer=20=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=91=D0=BD=20=D0=BD=D0=B0=20Navigation=20Drawer.=20=D0=9F?= =?UTF-8?q?=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D0=B0=20API=20v8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project.properties | 2 +- res/layout/actions.xml | 8 - res/layout/activity_main.xml | 24 +++ res/layout/content.xml | 6 - res/values/strings.xml | 5 + src/com/annimon/client/MainActivity.java | 187 +++++++++++++----- .../client/fragments/DiaryFragment.java | 2 +- .../client/fragments/ForumFragment.java | 3 +- .../client/fragments/MailFragment.java | 4 +- 9 files changed, 176 insertions(+), 65 deletions(-) delete mode 100644 res/layout/actions.xml create mode 100644 res/layout/activity_main.xml delete mode 100644 res/layout/content.xml diff --git a/project.properties b/project.properties index 1545a51..dfabdf1 100644 --- a/project.properties +++ b/project.properties @@ -12,4 +12,4 @@ # Project target. target=android-19 -android.library.reference.1=../menudrawer +android.library.reference.1=../android-support-v7-appcompat diff --git a/res/layout/actions.xml b/res/layout/actions.xml deleted file mode 100644 index 1c2fed8..0000000 --- a/res/layout/actions.xml +++ /dev/null @@ -1,8 +0,0 @@ - - \ No newline at end of file diff --git a/res/layout/activity_main.xml b/res/layout/activity_main.xml new file mode 100644 index 0000000..8086c44 --- /dev/null +++ b/res/layout/activity_main.xml @@ -0,0 +1,24 @@ + + + + + + + \ No newline at end of file diff --git a/res/layout/content.xml b/res/layout/content.xml deleted file mode 100644 index 3e9cfcb..0000000 --- a/res/layout/content.xml +++ /dev/null @@ -1,6 +0,0 @@ - - \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index 7c91595..d9bfdc1 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -19,5 +19,10 @@ Почта Блокнот + + 1.1 + Открыть панель навигации + Закрыть панель навигации + diff --git a/src/com/annimon/client/MainActivity.java b/src/com/annimon/client/MainActivity.java index b3051b5..fd83ff3 100644 --- a/src/com/annimon/client/MainActivity.java +++ b/src/com/annimon/client/MainActivity.java @@ -1,9 +1,17 @@ package com.annimon.client; -import android.app.Fragment; -import android.app.FragmentTransaction; import android.os.Bundle; import android.app.Activity; +import android.content.res.Configuration; +import android.support.v4.app.ActionBarDrawerToggle; +import android.support.v4.app.ActivityCompat; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentActivity; +import android.support.v4.app.FragmentManager; +import android.support.v4.view.GravityCompat; +import android.support.v4.widget.DrawerLayout; +import android.support.v7.app.ActionBarActivity; +import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -17,65 +25,133 @@ import com.annimon.client.fragments.DiaryFragment; import com.annimon.client.fragments.ForumFragment; import com.annimon.client.fragments.MailFragment; -import net.simonvt.menudrawer.MenuDrawer; -import net.simonvt.menudrawer.Position; - -public class MainActivity extends Activity { - - private MenuDrawer menuDrawer; +public class MainActivity extends ActionBarActivity { + + private static final String STATE_CURRENT_DRAWER_INDEX = "cur_drawer_index"; + + private DrawerLayout mDrawerLayout; + private ListView mDrawerList; + private ActionBarDrawerToggle mDrawerToggle; + + private CharSequence mTitle; + private ActionsAdapter mAdapter; + + private int mCurrentDrawerIndex; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + + setContentView(R.layout.activity_main); + + mTitle = getTitle(); + mCurrentDrawerIndex = -1; + mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); + mDrawerList = (ListView) findViewById(R.id.left_drawer); - getActionBar().setDisplayHomeAsUpEnabled(true); - getActionBar().setHomeButtonEnabled(true); - - menuDrawer = MenuDrawer.attach(this, MenuDrawer.Type.BEHIND, Position.LEFT, MenuDrawer.MENU_DRAG_WINDOW); - menuDrawer.setContentView(R.layout.content); - menuDrawer.setMenuView(R.layout.actions); - menuDrawer.setMenuSize(300); - - final ActionsAdapter adapter = new ActionsAdapter(this); - adapter.addActions(getResources().getStringArray(R.array.main_actions), + // Fill navigation drawer menu + mAdapter = new ActionsAdapter(this); + mAdapter.addActions(getResources().getStringArray(R.array.main_actions), getResources().getStringArray(R.array.main_actions_path)); - final ListView viewActionsList = (ListView) findViewById(R.id.actions); - viewActionsList.setAdapter(adapter); - viewActionsList.setOnItemClickListener(new AdapterView.OnItemClickListener() { - - @Override - public void onItemClick(AdapterView av, View v, int position, long flags) { - showFragment(adapter.getAction(position)); - Toast.makeText(getApplicationContext(), adapter.getAction(position).getName(), Toast.LENGTH_SHORT).show(); - } - }); - - menuDrawer.peekDrawer(); + mDrawerList.setAdapter(mAdapter); + mDrawerList.setOnItemClickListener(mItemClickListener); + + if (mDrawerLayout != null) { + mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); + } + + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setHomeButtonEnabled(true); + + if (mDrawerLayout != null) { + mDrawerToggle = new ActionBarDrawerToggle( + MainActivity.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); + // Creates call to onPrepareOptionsMenu() + ActivityCompat.invalidateOptionsMenu(MainActivity.this); + } + + public void onDrawerOpened(View drawerView) { + getSupportActionBar().setTitle(R.string.app_name); + ActivityCompat.invalidateOptionsMenu(MainActivity.this); + } + }; + mDrawerLayout.setDrawerListener(mDrawerToggle); + } + if (savedInstanceState == null) { + selectMenuItem(0); + } } - - + @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.main, menu); - return true; + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putInt(STATE_CURRENT_DRAWER_INDEX, mCurrentDrawerIndex); + } + + @Override + public void onRestoreInstanceState(Bundle savedInstanceState) { + mCurrentDrawerIndex = savedInstanceState.getInt(STATE_CURRENT_DRAWER_INDEX, -1); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: - menuDrawer.toggleMenu(); + changeDrawerOpeningState(); return true; } return super.onOptionsItemSelected(item); } - - private void showFragment(Action action) { - Fragment fragment = null; - - final String path = action.getPath(); + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + // Sync the toggle state after onRestoreInstanceState has occurred. + if (mDrawerToggle != null) { + mDrawerToggle.syncState(); + } + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + // Pass any configuration change to the drawer toggles + if (mDrawerToggle != null) { + mDrawerToggle.onConfigurationChanged(newConfig); + } + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_MENU) { + changeDrawerOpeningState(); + return true; + } + return super.onKeyDown(keyCode, event); + } + + private void changeDrawerOpeningState() { + if (mDrawerLayout == null) return; + boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList); + if (drawerOpen) mDrawerLayout.closeDrawer(mDrawerList); + else mDrawerLayout.openDrawer(mDrawerList); + } + + private void selectMenuItem(int position) { + Action action = mAdapter.getAction(position); + if (action == null) return; + + final String path = action.getPath(); + Fragment fragment = null; if ("forum".equals(path)) { fragment = new ForumFragment(); } else if ("diary".equals(path)) { @@ -85,10 +161,31 @@ public class MainActivity extends Activity { } if (fragment == null) return; - - final FragmentTransaction tr = getFragmentManager().beginTransaction(); - tr.replace(R.id.content, fragment); - tr.commit(); + + FragmentManager fragmentManager = getSupportFragmentManager(); + fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit(); + + // Update selected item and title, then close the drawer + mDrawerList.setItemChecked(position, true); + mTitle = action.getName(); + setTitle(mTitle); + getSupportActionBar().setTitle(mTitle); + if (mDrawerLayout != null) { + mDrawerLayout.closeDrawer(mDrawerList); + } } + private AdapterView.OnItemClickListener mItemClickListener = new AdapterView.OnItemClickListener() { + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + if (position != mCurrentDrawerIndex) { + mCurrentDrawerIndex = position; + selectMenuItem(position); + } else { + changeDrawerOpeningState(); + } + } + }; + } diff --git a/src/com/annimon/client/fragments/DiaryFragment.java b/src/com/annimon/client/fragments/DiaryFragment.java index 98e9de8..6865b86 100644 --- a/src/com/annimon/client/fragments/DiaryFragment.java +++ b/src/com/annimon/client/fragments/DiaryFragment.java @@ -1,7 +1,7 @@ package com.annimon.client.fragments; -import android.app.Fragment; import android.os.Bundle; +import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/src/com/annimon/client/fragments/ForumFragment.java b/src/com/annimon/client/fragments/ForumFragment.java index f5a4383..feebcde 100644 --- a/src/com/annimon/client/fragments/ForumFragment.java +++ b/src/com/annimon/client/fragments/ForumFragment.java @@ -1,8 +1,9 @@ package com.annimon.client.fragments; import java.util.List; -import android.app.ListFragment; import android.os.Bundle; +import android.support.v4.app.ListFragment; + import com.annimon.client.adapters.ForumPostAdapter; import com.annimon.client.entities.ForumPost; import com.annimon.client.tasks.ForumPostLoader; diff --git a/src/com/annimon/client/fragments/MailFragment.java b/src/com/annimon/client/fragments/MailFragment.java index 55d4352..607bc8b 100644 --- a/src/com/annimon/client/fragments/MailFragment.java +++ b/src/com/annimon/client/fragments/MailFragment.java @@ -1,10 +1,8 @@ package com.annimon.client.fragments; -import android.app.ListFragment; import android.os.Bundle; - +import android.support.v4.app.ListFragment; import com.annimon.client.utils.MoreListHelper; - import java.util.ArrayList; public class MailFragment extends ListFragment {