/* * Copyright (c) 2015 [1076559197@qq.com | tchen0707@gmail.com] * * 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 * distributed under the License is distributed on an "AS IS" BASIS, * 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.dreamspace.uucampus.ui.base; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import com.dreamspace.uucampus.R; import com.dreamspace.uucampus.common.VaryViewHelperController; import com.dreamspace.uucampus.common.utils.CommonUtils; import java.lang.reflect.Field; import butterknife.ButterKnife; import retrofit.RetrofitError; /** * Author: Tau.Chen * Email: 1076559197@qq.com | tauchen1990@gmail.com * Date: 2015/4/13. * Description: */ public abstract class BaseLazyFragment extends Fragment { /** * Log tag */ protected static String TAG_LOG = null; /** * Screen information */ protected int mScreenWidth = 0; protected int mScreenHeight = 0; protected float mScreenDensity = 0.0f; /** * context */ protected Context mContext = null; private boolean isFirstResume = true; private boolean isFirstVisible = true; private boolean isFirstInvisible = true; private boolean isPrepared; private VaryViewHelperController mVaryViewHelperController = null; @Override public void onAttach(Activity activity) { super.onAttach(activity); mContext = activity; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TAG_LOG = this.getClass().getSimpleName(); } @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { if (getContentViewLayoutID() != 0) { return inflater.inflate(getContentViewLayoutID(), null); } else { return super.onCreateView(inflater, container, savedInstanceState); } } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ButterKnife.bind(this, view); if (null != getLoadingTargetView()) { mVaryViewHelperController = new VaryViewHelperController(getLoadingTargetView()); } DisplayMetrics displayMetrics = new DisplayMetrics(); getActivity().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); mScreenDensity = displayMetrics.density; mScreenHeight = displayMetrics.heightPixels; mScreenWidth = displayMetrics.widthPixels; initViewsAndEvents(); } @Override public void onDestroyView() { super.onDestroyView(); ButterKnife.unbind(this); } @Override public void onDestroy() { super.onDestroy(); } @Override public void onDetach() { super.onDetach(); // for bug ---> java.lang.IllegalStateException: Activity has been destroyed try { Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager"); childFragmentManager.setAccessible(true); childFragmentManager.set(this, null); } catch (NoSuchFieldException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); initPrepare(); } @Override public void onResume() { super.onResume(); if (isFirstResume) { isFirstResume = false; return; } if (getUserVisibleHint()) { onUserVisible(); } } @Override public void onPause() { super.onPause(); if (getUserVisibleHint()) { onUserInvisible(); } } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { if (isFirstVisible) { isFirstVisible = false; initPrepare(); } else { onUserVisible(); } } else { if (isFirstInvisible) { isFirstInvisible = false; onFirstUserInvisible(); } else { onUserInvisible(); } } } private synchronized void initPrepare() { if (isPrepared) { onFirstUserVisible(); } else { isPrepared = true; } } /** * when fragment is visible for the first time, here we can do some initialized work or refresh data only once */ protected abstract void onFirstUserVisible(); /** * this method like the fragment's lifecycle method onResume() */ protected abstract void onUserVisible(); /** * when fragment is invisible for the first time */ private void onFirstUserInvisible() { // here we do not recommend do something } /** * this method like the fragment's lifecycle method onPause() */ protected abstract void onUserInvisible(); /** * get loading target view */ protected abstract View getLoadingTargetView(); /** * init all views and add events */ protected abstract void initViewsAndEvents(); /** * bind layout resource file * * @return id of layout resource */ protected abstract int getContentViewLayoutID(); /** * get the support fragment manager * * @return */ protected FragmentManager getSupportFragmentManager() { return getActivity().getSupportFragmentManager(); } /** * startActivity * * @param clazz */ protected void readyGo(Class<?> clazz) { Intent intent = new Intent(getActivity(), clazz); startActivity(intent); getActivity().overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left); } /** * startActivity with bundle * * @param clazz * @param bundle */ protected void readyGo(Class<?> clazz, Bundle bundle) { Intent intent = new Intent(getActivity(), clazz); if (null != bundle) { intent.putExtras(bundle); } startActivity(intent); getActivity().overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left); } /** * startActivityForResult * * @param clazz * @param requestCode */ protected void readyGoForResult(Class<?> clazz, int requestCode) { Intent intent = new Intent(getActivity(), clazz); startActivityForResult(intent, requestCode); getActivity().overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left); } /** * startActivityForResult with bundle * * @param clazz * @param requestCode * @param bundle */ protected void readyGoForResult(Class<?> clazz, int requestCode, Bundle bundle) { Intent intent = new Intent(getActivity(), clazz); if (null != bundle) { intent.putExtras(bundle); } startActivityForResult(intent, requestCode); getActivity().overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left); } /** * show toast * * @param msg */ protected void showToast(String msg) { if (null != msg && !CommonUtils.isEmpty(msg)) { Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT).show(); // Snackbar.make(((Activity) mContext).getWindow().getDecorView(), msg, Snackbar.LENGTH_SHORT).show(); } } protected void showNetWorkError() { showToast(getResources().getString(R.string.network_error_tips)); } /** * toggle show loading * * @param toggle */ protected void toggleShowLoading(boolean toggle, String msg) { if (null == mVaryViewHelperController) { throw new IllegalArgumentException("You must return a right target view for loading"); } if (toggle) { mVaryViewHelperController.showLoading(msg); } else { mVaryViewHelperController.restore(); } } /** * toggle show empty * * @param toggle */ protected void toggleShowEmpty(boolean toggle, String msg, View.OnClickListener onClickListener) { if (null == mVaryViewHelperController) { throw new IllegalArgumentException("You must return a right target view for loading"); } if (toggle) { mVaryViewHelperController.showEmpty(msg, onClickListener); } else { mVaryViewHelperController.restore(); } } /** * toggle show error * * @param toggle */ protected void toggleShowError(boolean toggle, String msg, View.OnClickListener onClickListener) { if (null == mVaryViewHelperController) { throw new IllegalArgumentException("You must return a right target view for loading"); } if (toggle) { mVaryViewHelperController.showError(msg, onClickListener); } else { mVaryViewHelperController.restore(); } } /** * toggle show network error * * @param toggle */ protected void toggleNetworkError(boolean toggle, View.OnClickListener onClickListener) { if (null == mVaryViewHelperController) { throw new IllegalArgumentException("You must return a right target view for loading"); } if (toggle) { mVaryViewHelperController.showNetworkError(onClickListener); } else { mVaryViewHelperController.restore(); } } protected void toggleRestore(){ mVaryViewHelperController.restore(); } protected void showInnerError(RetrofitError error) { if (error != null) if(error.getBody() == null){ showToast(getString(R.string.request_time_out)); }else{ showToast(CommonUtils.getErrorInfo(error).getReason()); } } }