package com.m.ui.fragment;
import java.io.Serializable;
import org.android.loader.BitmapLoader;
import org.android.loader.core.BitmapOwner;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import com.m.R;
import com.m.common.settings.SettingUtility;
import com.m.support.Inject.InjectUtility;
import com.m.support.Inject.ViewInject;
import com.m.support.bizlogic.ABaseBizlogic.CacheMode;
import com.m.support.task.ITaskManager;
import com.m.support.task.TaskException;
import com.m.support.task.TaskManager;
import com.m.support.task.WorkTask;
import com.m.ui.activity.BaseActivity;
import com.m.ui.utils.ViewUtils;
public abstract class ABaseFragment extends Fragment implements ITaskManager, BitmapOwner {
static final String TAG = ABaseFragment.class.getSimpleName();
protected enum ABaseTaskState {
none, prepare, falid, success, finished, canceled
}
private ViewGroup rootView;// 根视图
private TaskManager taskManager;// 管理线程
@ViewInject(idStr = "layoutLoading")
View loadingLayout;// 加载中视图
@ViewInject(idStr = "layoutLoadFailed")
View loadFailureLayout;// 加载失败视图
@ViewInject(idStr = "layoutContent")
View contentLayout;// 内容视图
@ViewInject(idStr = "layoutEmpty")
View emptyLayout;// 空视图
// 标志是否ContentView是否为空
private boolean contentEmpty = false;
private AFragmentHelper fragmentHelper;
public ABaseFragment() {
try {
if (SettingUtility.getSetting("fragment_lifecycle") != null) {
Class<?> clazz = Class.forName(SettingUtility.getStringSetting("fragment_lifecycle"));
fragmentHelper = (AFragmentHelper) clazz.newInstance();
fragmentHelper.setBaseFragment(this);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (activity instanceof BaseActivity)
((BaseActivity) activity).addFragment(toString(), this);
if (fragmentHelper != null)
fragmentHelper.onAttach(activity);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
taskManager = new TaskManager();
if (savedInstanceState != null)
taskManager.restore(savedInstanceState);
if (fragmentHelper != null)
fragmentHelper.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (inflateContentView() > 0) {
rootView = (ViewGroup) inflater.inflate(inflateContentView(), null);
rootView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
if (fragmentHelper != null) {
rootView = (ViewGroup) fragmentHelper.onCreateView(inflater, rootView, savedInstanceState);
fragmentHelper.layoutInit(rootView, inflater, savedInstanceState);
}
_layoutInit(inflater, savedInstanceState);
layoutInit(inflater, savedInstanceState);
return rootView;
}
return super.onCreateView(inflater, container, savedInstanceState);
}
/**
* 根视图
*
* @return
*/
public ViewGroup getRootView() {
return rootView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (savedInstanceState == null)
requestData();
if (fragmentHelper != null)
fragmentHelper.onActivityCreated(savedInstanceState);
}
@Override
public void onDetach() {
super.onDetach();
if (getActivity() != null && getActivity() instanceof BaseActivity)
((BaseActivity) getActivity()).removeFragment(this.toString());
}
@Override
public void onResume() {
super.onResume();
if (fragmentHelper != null)
fragmentHelper.onResume();
}
/**
* Action的home被点击了
*
* @return
*/
public boolean onHomeClick() {
return onBackClick();
}
/**
* 返回按键被点击了
*
* @return
*/
public boolean onBackClick() {
return false;
}
/**
* 初次创建时默认会调用一次
*/
public void requestData() {
}
/**
* A*Fragment重写这个方法
*
* @param inflater
* @param savedInstanceSate
*/
void _layoutInit(LayoutInflater inflater, Bundle savedInstanceSate) {
InjectUtility.initInjectedView(this, rootView);
if (emptyLayout != null) {
View reloadView = emptyLayout.findViewById(R.id.layoutReload);
if (reloadView != null)
setOnClickListener(reloadView, null);
}
if (loadFailureLayout != null) {
View reloadView = loadFailureLayout.findViewById(R.id.layoutReload);
if (reloadView != null)
setOnClickListener(reloadView, null);
}
setViewVisiable(loadingLayout, View.GONE);
setViewVisiable(loadFailureLayout, View.GONE);
setViewVisiable(emptyLayout, View.GONE);
if (isContentEmpty()) {
if (savedInstanceSate != null) {
requestData();
}
else {
setViewVisiable(emptyLayout, View.VISIBLE);
setViewVisiable(contentLayout, View.GONE);
}
}
else {
setViewVisiable(contentLayout, View.VISIBLE);
}
}
/**
* 子类重写这个方法,初始化视图
*
* @param inflater
* @param savedInstanceSate
*/
protected void layoutInit(LayoutInflater inflater, Bundle savedInstanceSate) {
}
protected View findViewById(int viewId) {
if (rootView == null)
return null;
return rootView.findViewById(viewId);
}
protected void setOnClickListener(View v, Object tag) {
if (v == null)
return;
v.setTag(tag);
v.setOnClickListener(viewOnClickListener);
}
protected void setOnClickListener(int viewId, Object tag) {
setOnClickListener(findViewById(viewId), tag);
}
abstract protected int inflateContentView();
OnClickListener viewOnClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
onViewClicked(v);
}
};
public void setContentEmpty(boolean empty) {
this.contentEmpty = empty;
}
public boolean isContentEmpty() {
return contentEmpty;
}
/**
* 视图点击回调,子类重写
*
* @param view
*/
public void onViewClicked(View view) {
if (view.getId() == R.id.layoutReload)
requestData();
else if (view.getId() == R.id.layoutRefresh)
requestData();
}
void setViewVisiable(View v, int visibility) {
if (v != null)
v.setVisibility(visibility);
}
/**
* 根据{@link ABaseTask} 的加载状态,刷新视图
*
* @param state
* @param obj
* 附带辅助的数据,根据状态定义
*/
protected void taskStateChanged(ABaseTaskState state, Serializable tag) {
// 开始Task
if (state == ABaseTaskState.prepare) {
if (isContentEmpty()) {
setViewVisiable(loadingLayout, View.VISIBLE);
setViewVisiable(contentLayout, View.GONE);
}
else {
setViewVisiable(loadingLayout, View.GONE);
setViewVisiable(contentLayout, View.VISIBLE);
}
setViewVisiable(emptyLayout, View.GONE);
setViewVisiable(loadFailureLayout, View.GONE);
}
// Task成功
else if (state == ABaseTaskState.success) {
setViewVisiable(loadingLayout, View.GONE);
if (isContentEmpty()) {
setViewVisiable(emptyLayout, View.VISIBLE);
}
else {
setViewVisiable(contentLayout, View.VISIBLE);
}
}
// 取消Task
else if (state == ABaseTaskState.canceled) {
if (isContentEmpty()) {
setViewVisiable(loadingLayout, View.GONE);
setViewVisiable(emptyLayout, View.VISIBLE);
}
}
// Task失败
else if (state == ABaseTaskState.falid) {
if (isContentEmpty()) {
setViewVisiable(emptyLayout, View.GONE);
setViewVisiable(loadingLayout, View.GONE);
setViewVisiable(loadFailureLayout, View.VISIBLE);
if (tag != null && loadFailureLayout != null)
ViewUtils.setTextViewValue(loadFailureLayout, R.id.txtLoadFailed, tag.toString());
}
}
// Task结束
else if (state == ABaseTaskState.finished) {
}
}
/**
* 以Toast形式显示一个消息
*
* @param msg
*/
protected void showMessage(CharSequence msg) {
if (!TextUtils.isEmpty(msg))
ViewUtils.showMessage(msg.toString());
}
/**
* 参照{@linkplain #showMessage(String)}
*
* @param msgId
*/
protected void showMessage(int msgId) {
if (getActivity() != null)
showMessage(getString(msgId));
}
/**
* Fragment主要的刷新任务线程,定义任务加载流程,耦合Fragment各个状态下的视图刷新方法
* {@link ABaseFragment#taskStateChanged(ABaseTaskState, Object)}
*
* @author wangdan
*
* @param <Params>
* @param <Progress>
* @param <Result>
*/
protected abstract class ABaseTask<Params, Progress, Result> extends WorkTask<Params, Progress, Result> {
public ABaseTask(String taskId) {
super(taskId, ABaseFragment.this);
}
@Override
protected void onPrepare() {
super.onPrepare();
taskStateChanged(ABaseTaskState.prepare, null);
}
@Override
protected void onSuccess(Result result) {
super.onSuccess(result);
// 默认加载数据成功,且ContentView有数据展示
ABaseFragment.this.setContentEmpty(resultIsEmpty(result));
taskStateChanged(ABaseTaskState.success, null);
}
@Override
protected void onFailure(TaskException exception) {
super.onFailure(exception);
taskStateChanged(ABaseTaskState.falid, exception.getMessage());
}
@Override
protected void onFinished() {
super.onFinished();
taskStateChanged(ABaseTaskState.finished, null);
}
/**
* 返回数据是否空
*
* @param result
* @return
*/
protected boolean resultIsEmpty(Result result) {
return result == null ? true : false;
}
}
@Override
public void onDestroy() {
super.onDestroy();
removeAllTask(true);
BitmapLoader.getInstance().cancelPotentialTask(this);
}
@Override
final public void addTask(@SuppressWarnings("rawtypes") WorkTask task) {
taskManager.addTask(task);
}
@Override
final public void removeTask(String taskId, boolean cancelIfRunning) {
taskManager.removeTask(taskId, cancelIfRunning);
}
@Override
final public void removeAllTask(boolean cancelIfRunning) {
taskManager.removeAllTask(cancelIfRunning);
}
@Override
final public int getTaskCount(String taskId) {
return taskManager.getTaskCount(taskId);
}
/**
* 初步定义,当Task执行BizLogic方法时,第一次创建时拉取缓存,其他都只拉取网络
*
* @param task
* @return
*/
final protected CacheMode getTaskCacheMode(@SuppressWarnings("rawtypes") WorkTask task) {
if (task == null || !TextUtils.isEmpty(task.getTaskId()))
return getTaskCount(task.getTaskId()) == 1 ? CacheMode.auto : CacheMode.disable;
return CacheMode.disable;
}
protected void cleatTaskCount(String taskId) {
taskManager.cleatTaskCount(taskId);
}
public boolean onTouchEvent(MotionEvent event) {
return false;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (taskManager != null)
taskManager.save(outState);
}
/**
* 是否显示图片接口实现
*/
@Override
public boolean canDisplay() {
return true;
}
public AFragmentHelper getFragmentHelper() {
return fragmentHelper;
}
}