From 9495b026b62d81778edc3d58e4e31df08e52be8c Mon Sep 17 00:00:00 2001 From: seven332 Date: Mon, 9 Feb 2015 23:48:11 +0800 Subject: [PATCH] Improve save --- .../hippo/ehviewer/ui/ContentActivity.java | 8 +-- .../ehviewer/ui/fragment/SearchFragment.java | 33 +++++++++++- .../ehviewer/ui/scene/GalleryListScene.java | 11 ++++ app/src/main/java/com/hippo/scene/Scene.java | 17 ++++++ .../java/com/hippo/scene/StageActivity.java | 28 +++++++++- .../java/com/hippo/scene/StageLayout.java | 54 +++++++++++++++++++ .../java/com/hippo/widget/CheckTextView.java | 22 ++++++++ app/src/main/res/layout/activity_content.xml | 2 +- 8 files changed, 167 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/com/hippo/scene/StageLayout.java diff --git a/app/src/main/java/com/hippo/ehviewer/ui/ContentActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/ContentActivity.java index 04e187917..9cd5fb61c 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/ContentActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/ContentActivity.java @@ -21,11 +21,11 @@ import android.os.Bundle; import android.support.v4.view.ViewCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.widget.Toolbar; -import android.widget.FrameLayout; import com.hippo.ehviewer.R; import com.hippo.ehviewer.ui.scene.GalleryListScene; import com.hippo.scene.StageActivity; +import com.hippo.scene.StageLayout; import com.hippo.util.UiUtils; public class ContentActivity extends StageActivity { @@ -34,7 +34,7 @@ public class ContentActivity extends StageActivity { private DrawerLayout mDrawerLayout; private Toolbar mToolbar; - private FrameLayout mStage; + private StageLayout mStage; @Override protected void onCreate(Bundle savedInstanceState) { @@ -45,7 +45,7 @@ public class ContentActivity extends StageActivity { mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout); mToolbar = (Toolbar) mDrawerLayout.findViewById(R.id.toolbar); - mStage = (FrameLayout) mDrawerLayout.findViewById(R.id.stage); + mStage = (StageLayout) mDrawerLayout.findViewById(R.id.stage); setSupportActionBar(mToolbar); @@ -58,7 +58,7 @@ public class ContentActivity extends StageActivity { } @Override - public FrameLayout getStageView() { + public StageLayout getStageView() { return mStage; } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/fragment/SearchFragment.java b/app/src/main/java/com/hippo/ehviewer/ui/fragment/SearchFragment.java index 082afccc7..60b474963 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/fragment/SearchFragment.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/fragment/SearchFragment.java @@ -15,12 +15,16 @@ package com.hippo.ehviewer.ui.fragment; +import android.annotation.TargetApi; import android.app.Activity; +import android.os.Build; import android.os.Bundle; +import android.os.Parcelable; import android.support.v4.app.Fragment; import android.support.v4.view.ViewCompat; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; +import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -33,12 +37,15 @@ import com.hippo.ehviewer.R; import com.hippo.ehviewer.data.GalleryListUrlBuilder; import com.hippo.ehviewer.widget.AdvanceSearchTable; import com.hippo.ehviewer.widget.CategoryTable; +import com.hippo.util.Log; import com.hippo.util.UiUtils; import com.hippo.util.ViewUtils; import com.hippo.widget.PrefixEditText; public class SearchFragment extends Fragment implements CompoundButton.OnCheckedChangeListener { + private static final String VIEW_STATE_TAG = "android:view_state"; + private static final int SEARCH_TYPE_NORMAL = 0; private static final int SEARCH_TYPE_TAG = 1; private static final int SEARCH_TYPE_IMAGE = 2; @@ -59,6 +66,7 @@ public class SearchFragment extends Fragment implements CompoundButton.OnChecked private OnSearchListener mOnSearchListener; + private View mRootView; private RecyclerView mContainer; private View mNormalView; private CategoryTable mTableCategory; @@ -75,11 +83,24 @@ public class SearchFragment extends Fragment implements CompoundButton.OnChecked mOnSearchListener = listener; } + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + if (savedInstanceState != null && mRootView != null) { + SparseArray savedStates = savedInstanceState.getSparseParcelableArray(VIEW_STATE_TAG); + if (savedStates != null) { + mRootView.restoreHierarchyState(savedStates); + } + } + } + public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) { mActivity = getActivity(); - View mRootView = inflater.inflate(R.layout.fragment_search, container, false); + mRootView = inflater.inflate(R.layout.fragment_search, container, false); mContainer = (RecyclerView) mRootView.findViewById(R.id.search_container); @@ -92,6 +113,13 @@ public class SearchFragment extends Fragment implements CompoundButton.OnChecked return mRootView; } + @Override + public void onDestroyView() { + super.onDestroyView(); + + mRootView = null; + } + @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (buttonView == mCheckSpecifyAuthor) { @@ -153,6 +181,9 @@ public class SearchFragment extends Fragment implements CompoundButton.OnChecked @Override public SearchHolder onCreateViewHolder(ViewGroup parent, int viewType) { + + Log.d("TAG", "sdsd", new Exception("onCreateViewHolder")); + View view = mInflater.inflate(R.layout.search_category, parent, false); ViewCompat.setElevation(view, UiUtils.dp2pix(4)); // TODO diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java index 4e9f28641..1bf650dfa 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java @@ -15,6 +15,7 @@ package com.hippo.ehviewer.ui.scene; +import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; @@ -62,6 +63,16 @@ public class GalleryListScene extends Scene implements SearchFragment.OnSearchLi } + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + } + + @Override + protected void onRestoreInstanceState(Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + } + public class GalleryListPagerAdapter extends FragmentPagerAdapter { public GalleryListPagerAdapter(FragmentManager fm) { diff --git a/app/src/main/java/com/hippo/scene/Scene.java b/app/src/main/java/com/hippo/scene/Scene.java index 4dd11188a..0d288a13a 100644 --- a/app/src/main/java/com/hippo/scene/Scene.java +++ b/app/src/main/java/com/hippo/scene/Scene.java @@ -15,7 +15,10 @@ package com.hippo.scene; +import android.os.Bundle; +import android.os.Parcelable; import android.support.v4.app.FragmentManager; +import android.util.SparseArray; import android.view.View; import android.widget.FrameLayout; @@ -111,6 +114,20 @@ public abstract class Scene { finish(); } + protected void onSaveInstanceState(Bundle outState) { + SparseArray states = new SparseArray<>(); + mRootView.saveHierarchyState(states); + outState.putSparseParcelableArray(Integer.toHexString(hashCode()), states); + } + + protected void onRestoreInstanceState(Bundle savedInstanceState) { + SparseArray savedStates + = savedInstanceState.getSparseParcelableArray(Integer.toHexString(hashCode())); + if (savedStates != null) { + mRootView.restoreHierarchyState(savedStates); + } + } + /** * Return the FragmentManager for interacting with fragments associated * with StageActivity. diff --git a/app/src/main/java/com/hippo/scene/StageActivity.java b/app/src/main/java/com/hippo/scene/StageActivity.java index 39cf6a913..d792a79d9 100644 --- a/app/src/main/java/com/hippo/scene/StageActivity.java +++ b/app/src/main/java/com/hippo/scene/StageActivity.java @@ -15,7 +15,7 @@ package com.hippo.scene; -import android.widget.FrameLayout; +import android.os.Bundle; import com.hippo.ehviewer.ui.AbsActionBarActivity; @@ -30,7 +30,7 @@ public abstract class StageActivity extends AbsActionBarActivity { private Scene mRetainedScene = null; - public abstract FrameLayout getStageView(); + public abstract StageLayout getStageView(); private void pushScene(Class sceneClass) { Scene scene = null; @@ -155,6 +155,30 @@ public abstract class StageActivity extends AbsActionBarActivity { } } + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + + for (Scene scene : mSceneStack) { + scene.onSaveInstanceState(outState); + } + if (mCurrentScene != null) { + mCurrentScene.onSaveInstanceState(outState); + } + } + + @Override + protected void onRestoreInstanceState(Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + + for (Scene scene : mSceneStack) { + scene.onRestoreInstanceState(savedInstanceState); + } + if (mCurrentScene != null) { + mCurrentScene.onRestoreInstanceState(savedInstanceState); + } + } + interface SceneAction { public void doAction(); } diff --git a/app/src/main/java/com/hippo/scene/StageLayout.java b/app/src/main/java/com/hippo/scene/StageLayout.java new file mode 100644 index 000000000..9831768e3 --- /dev/null +++ b/app/src/main/java/com/hippo/scene/StageLayout.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2015 Hippo Seven + * + * 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 + * 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.hippo.scene; + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build; +import android.os.Parcelable; +import android.util.AttributeSet; +import android.util.SparseArray; +import android.widget.FrameLayout; + +public class StageLayout extends FrameLayout { + + public StageLayout(Context context) { + super(context); + } + + public StageLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public StageLayout(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public StageLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + @Override + protected void dispatchSaveInstanceState(SparseArray container) { + // Do nothing + } + + @Override + protected void dispatchRestoreInstanceState(SparseArray container) { + // Do nothing + } +} diff --git a/app/src/main/java/com/hippo/widget/CheckTextView.java b/app/src/main/java/com/hippo/widget/CheckTextView.java index 5425356e4..35149dd68 100644 --- a/app/src/main/java/com/hippo/widget/CheckTextView.java +++ b/app/src/main/java/com/hippo/widget/CheckTextView.java @@ -18,6 +18,8 @@ package com.hippo.widget; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; +import android.os.Bundle; +import android.os.Parcelable; import android.util.AttributeSet; import android.view.View; import android.view.View.OnClickListener; @@ -28,6 +30,9 @@ import com.nineoldandroids.animation.ObjectAnimator; public class CheckTextView extends TextView implements OnClickListener, Hotspotable { + private static final String STATE_KEY_SUPER = "super"; + private static final String STATE_KEY_CHECKED = "checked"; + private static final int MASK = 0x8a000000; private static final long ANIMATION_DURATION = 150; @@ -115,4 +120,21 @@ public class CheckTextView extends TextView implements OnClickListener, Hotspota return mChecked; } + @Override + public Parcelable onSaveInstanceState() { + final Bundle state = new Bundle(); + state.putParcelable(STATE_KEY_SUPER, super.onSaveInstanceState()); + state.putBoolean(STATE_KEY_CHECKED, mChecked); + return state; + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + if (state instanceof Bundle) { + final Bundle savedState = (Bundle) state; + super.onRestoreInstanceState(savedState.getParcelable(STATE_KEY_SUPER)); + mChecked = savedState.getBoolean(STATE_KEY_CHECKED); + } + } + } diff --git a/app/src/main/res/layout/activity_content.xml b/app/src/main/res/layout/activity_content.xml index a5e74e57a..c33f1fcff 100644 --- a/app/src/main/res/layout/activity_content.xml +++ b/app/src/main/res/layout/activity_content.xml @@ -33,7 +33,7 @@ android:minHeight="?attr/actionBarSize" android:background="?attr/colorPrimary"/> -