package cn.mutils.app.ui; import android.content.Context; import android.content.Intent; import android.util.AttributeSet; import android.view.View; import android.widget.FrameLayout; import java.util.ArrayList; import java.util.List; import cn.mutils.app.event.listener.OnActivityResultListener; import cn.mutils.app.event.listener.OnSelectedChangeListener; import cn.mutils.app.ui.core.ICachedViewManager; import cn.mutils.app.ui.core.IFragmenter; import cn.mutils.app.ui.core.IStateView; import cn.mutils.app.ui.core.IStateViewManager; import cn.mutils.app.ui.core.UICore; import cn.mutils.core.event.Dispatcher; @SuppressWarnings({"unused", "UnusedAssignment", "RedundantIfStatement"}) public class FragmenterFrame extends FrameLayout implements IStateView, IStateViewManager, ICachedViewManager { protected boolean mCreateDispatched; protected List<View> mCachedViews = new ArrayList<View>(); /** * -1 for default */ protected int mSelectedIndex = -1; protected OnSelectedChangeListener mOnSelectedChangeListener; protected IStateViewManager mManager; protected Dispatcher mDispatcher = new Dispatcher(); public FragmenterFrame(Context context) { super(context); } public FragmenterFrame(Context context, AttributeSet attrs) { super(context, attrs); } public FragmenterFrame(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } protected void setDisplayedChild(int whichChild) { if (whichChild >= getChildCount()) { whichChild = 0; } else if (whichChild < 0) { whichChild = getChildCount() - 1; } boolean hasFocus = getFocusedChild() != null; showOnly(whichChild); if (hasFocus) { requestFocus(FOCUS_FORWARD); } } protected void showOnly(int childIndex) { final int count = getChildCount(); for (int i = 0; i < count; i++) { final View child = getChildAt(i); if (i == childIndex) { if (child.getVisibility() != View.VISIBLE) { child.setVisibility(View.VISIBLE); } } else { if (child.getAnimation() != null) { child.clearAnimation(); } if (child.getVisibility() != View.GONE) { child.setVisibility(View.GONE); } } } } public void setOnSelectedChangeListener(OnSelectedChangeListener listener) { mOnSelectedChangeListener = listener; } @Override public IStateView getSelectedView() { if (mSelectedIndex >= 0 && mSelectedIndex < mCachedViews.size()) { View v = mCachedViews.get(mSelectedIndex); if (v instanceof IStateView) { return (IStateView) v; } } return null; } public int getSelectedIndex() { return this.mSelectedIndex; } public void setSelectedIndex(int selectedIndex) { if (!mCreateDispatched) { this.onCreate(); } if (selectedIndex < 0 || selectedIndex >= this.mCachedViews.size()) { return; } if (selectedIndex == mSelectedIndex) { return; } // first time if (mSelectedIndex == -1) { mSelectedIndex = selectedIndex; View v = mCachedViews.get(mSelectedIndex); afterSelectedFirstTime(); this.setDisplayedChild(this.indexOfChild(v)); return; } // preSelecting View view = null; if (mSelectedIndex >= 0) { view = mCachedViews.get(mSelectedIndex); if (view instanceof IStateView) { if (view instanceof IFragmenter) { ((IFragmenter) view).setLocked(true); } ((IStateView) view).onPause(); ((IStateView) view).onStop(); } } view = mCachedViews.get(selectedIndex); if (view instanceof IStateView) { if (view instanceof IFragmenter) { ((IFragmenter) view).setLocked(false); } ((IStateView) view).onStart(); } if (this.indexOfChild(view) < 0) { this.addView(view); } setDisplayedChild(this.indexOfChild(view)); // post selecting if (view instanceof IStateView) { if (view instanceof IFragmenter) { ((IFragmenter) view).setLocked(false); } ((IStateView) view).onResume(); } mSelectedIndex = selectedIndex; afterSelected(); if (mOnSelectedChangeListener != null) { mOnSelectedChangeListener.onChanged(this, mSelectedIndex); } } protected void afterSelectedFirstTime() { } protected void afterSelected() { View view = mCachedViews.get(mSelectedIndex); for (int i = this.getChildCount() - 1; i >= 0; i--) { View childView = this.getChildAt(i); if (childView.equals(view)) { continue; } if (childView instanceof IFragmenter) { IFragmenter fragment = (IFragmenter) childView; fragment.setLocked(false); fragment.setFragmentVisible(false); } } } protected void afterCreated() { } @Override protected void onFinishInflate() { super.onFinishInflate(); for (int i = 0, size = this.getChildCount(); i < size; i++) { View v = this.getChildAt(i); mCachedViews.add(v); if (v instanceof IStateView) { this.bind((IStateView) v); } } } @Override public void onCreate() { if (mCreateDispatched) { return; } mCreateDispatched = true; for (View v : mCachedViews) { if (v instanceof IStateView) { UICore.dispatchCreate((IStateView) v); } } afterCreated(); } @Override public void onStart() { UICore.dispatchStart(this); } @Override public void onResume() { UICore.dispatchResume(this); } @Override public void onPause() { UICore.dispatchPause(this); } @Override public void onStop() { UICore.dispatchStop(this); } @Override public void onDestroy() { for (View v : mCachedViews) { if (v instanceof IStateView) { ((IStateView) v).onDestroy(); } } } @Override public boolean onInterceptBackPressed() { if (UICore.interceptBackPressed(this)) { return true; } return false; } @Override public void startActivity(Intent intent) { UICore.startActivity(this, intent); } @Override public void startActivityForResult(Intent intent, int requestCode) { UICore.startActivityForResult(this, intent, requestCode); } @Override public void onActivityResult(Context context, int requestCode, int resultCode, Intent data) { UICore.onActivityResult(this, requestCode, resultCode, data); } @Override public IStateViewManager getManager() { return mManager; } @Override public void setManager(IStateViewManager manager) { mManager = manager; } @Override public void bind(IStateView stateView) { stateView.setManager(this); } @Override public void notify(Object message) { if (mManager != null) { mManager.notify(message); } } @Override public <T extends View> T findViewById(int id, Class<T> viewClass) { return UICore.findViewById(this, id, viewClass); } @Override public List<IStateView> getBindStateViews() { return null; } @Override public boolean redirectToSelectedView() { return true; } @Override public boolean isCreateDispatched() { return mCreateDispatched; } @Override public void setCreateDispatched(boolean dispatched) { mCreateDispatched = dispatched; } @Override public List<OnActivityResultListener> getOnActivityResultListeners() { return mDispatcher.getListeners(OnActivityResultListener.EVENT_TYPE, OnActivityResultListener.class); } @Override public void addOnActivityResultListener(OnActivityResultListener listener) { mDispatcher.addListener(OnActivityResultListener.EVENT_TYPE, listener); } @Override public void removeOnActivityResultListener(OnActivityResultListener listener) { mDispatcher.removeListener(OnActivityResultListener.EVENT_TYPE, listener); } @Override public List<View> getCachedViews() { return mCachedViews; } }