package com.arialyy.frame.core;
import android.content.Context;
import android.content.Intent;
import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentContainer;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import com.arialyy.frame.module.AbsModule;
import com.arialyy.frame.module.IOCProxy;
import com.arialyy.frame.temp.AbsTempView;
import com.arialyy.frame.temp.OnTempBtClickListener;
import com.arialyy.frame.temp.TempView;
import com.arialyy.frame.util.ReflectionUtil;
import com.arialyy.frame.util.StringUtil;
import com.arialyy.frame.util.show.L;
import java.lang.reflect.Field;
import butterknife.ButterKnife;
/**
* Created by lyy on 2015/11/4.
* 基础Fragment
*/
public abstract class AbsFragment<VB extends ViewDataBinding> extends Fragment implements OnTempBtClickListener {
protected String TAG = "";
private VB mBind;
private IOCProxy mProxy;
protected View mRootView;
protected AbsActivity mActivity;
private ModuleFactory mModuleF;
protected boolean isInit;
protected AbsTempView mTempView;
protected boolean useTempView = true;
private ViewGroup mParent;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mBind = DataBindingUtil.inflate(inflater, setLayoutId(), container, false);
initFragment();
mRootView = mBind.getRoot();
return mRootView;
}
private void initFragment() {
TAG = StringUtil.getClassName(this);
mProxy = IOCProxy.newInstance(this);
mModuleF = ModuleFactory.newInstance();
ButterKnife.inject(this, mBind.getRoot());
if (useTempView) {
mTempView = new TempView(getContext());
mTempView.setBtListener(this);
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof AbsActivity) {
mActivity = (AbsActivity) context;
}
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Field field = ReflectionUtil.getField(getClass(), "mContainerId");
Field containerField = ReflectionUtil.getField(getFragmentManager().getClass(), "mContainer");
try {
int id = (int) field.get(this);
FragmentContainer container = (FragmentContainer) containerField.get(getFragmentManager());
mParent = (ViewGroup) container.onFindViewById(id);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
init(savedInstanceState);
isInit = true;
if (getUserVisibleHint()) {
onDelayLoad();
}
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Field field = ReflectionUtil.getField(getClass(), "mContainer");
try {
mParent = (ViewGroup) field.get(this);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser && isInit) {
isInit = false;
onDelayLoad();
}
}
protected abstract void init(Bundle savedInstanceState);
/**
* 是否使用填充界面
*
* @param useTempView
*/
protected void setUseTempView(boolean useTempView) {
this.useTempView = useTempView;
}
/**
* 设置自定义的TempView
*
* @param tempView
*/
protected void setCustomTempView(AbsTempView tempView) {
mTempView = tempView;
mTempView.setBtListener(this);
}
/**
* 显示占位布局
*
* @param type {@link TempView#ERROR}
* {@link TempView#DATA_NULL}
* {@link TempView#LOADING}
*/
protected void showTempView(int type) {
if (mTempView == null || !useTempView) {
return;
}
mTempView.setType(type);
if (mParent != null) {
int size = ViewGroup.LayoutParams.MATCH_PARENT;
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(size, size);
if (mParent instanceof ViewPager) {
ViewPager vp = (ViewPager) mParent;
int position = vp.getCurrentItem();
View child = vp.getChildAt(position);
if (child != null) {
if (child instanceof LinearLayout) {
LinearLayout ll = (LinearLayout) child;
ll.removeView(mTempView);
ll.addView(mTempView, 0, lp);
} else if (child instanceof RelativeLayout || child instanceof FrameLayout) {
ViewGroup vg = (ViewGroup) child;
vg.removeView(mTempView);
vg.addView(mTempView, lp);
} else {
L.e(TAG, "框架的填充只支持,LinearLayout、RelativeLayout、FrameLayout");
}
}
} else {
mParent.removeView(mTempView);
mParent.addView(mTempView, lp);
}
}
}
/**
* 关闭占位布局
*/
protected void hintTempView() {
hintTempView(0);
}
/**
* 延时关闭占位布局
*/
protected void hintTempView(int delay) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (mTempView == null || !useTempView) {
return;
}
mTempView.clearFocus();
if (mParent != null) {
if (mParent instanceof ViewPager) {
ViewPager vp = (ViewPager) mParent;
int position = vp.getCurrentItem();
View child = vp.getChildAt(position);
ViewGroup vg = (ViewGroup) child;
if (vg != null) {
vg.removeView(mTempView);
}
} else {
mParent.removeView(mTempView);
}
}
}
}, delay);
}
@Override
public void onBtTempClick(View view, int type) {
}
/**
* 获取填充View
*/
protected AbsTempView getTempView() {
return mTempView;
}
/**
* 获取binding对象
*/
protected VB getBinding() {
return mBind;
}
/**
* 获取Module
*
* @param clazz {@link AbsModule}
*/
protected <M extends AbsModule> M getModule(@NonNull Class<M> clazz) {
M module = mModuleF.getModule(getContext(), clazz);
mProxy.changeModule(module);
return module;
}
/**
* 获取Module
*
* @param clazz Module class0
* @param callback Module回调函数
* @param <M> {@link AbsModule}
* @return
*/
protected <M extends AbsModule> M getModule(@NonNull Class<M> clazz, @NonNull AbsModule.OnCallback callback) {
M module = mModuleF.getModule(getContext(), clazz);
module.setCallback(callback);
mProxy.changeModule(module);
return module;
}
/**
* 延时加载
*/
protected abstract void onDelayLoad();
/**
* 设置资源布局
*
* @return
*/
protected abstract int setLayoutId();
/**
* 数据回调
*/
protected abstract void dataCallback(int result, Object obj);
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
PermissionHelp.getInstance().handlePermissionCallback(requestCode, permissions, grantResults);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
PermissionHelp.getInstance().handleSpecialPermissionCallback(getContext(), requestCode, resultCode, data);
}
}