package com.minggo.pluto.fragment;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Toast;
import com.minggo.pluto.bitmap.BitmapDisplayConfig;
import com.minggo.pluto.bitmap.FinalBitmap;
import com.minggo.pluto.common.CommonAsyncTask;
import com.minggo.pluto.dialog.PlutoDialog;
import com.minggo.pluto.util.NetworkUtils;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
/**
* fragment的基类
* @author minggo
* @time 2014-12-3下午3:59:14
*/
public abstract class PlutoFragment extends ProgressFragment implements IFragment,FragmentUserVisibleController.UserVisibleCallback{
private boolean isInit; // 是否可以开始加载数据
private boolean isCreated;
private boolean isStatistics = true; // 是否统计
protected String simpleName = getClass().getSimpleName();
private FragmentUserVisibleController userVisibleController;
private Toast toast = null;
protected Handler mUiHandler = new UiHandler(this);
protected FinalBitmap finalBitmap;
protected BitmapDisplayConfig bitmapDisplayConfig;
protected PlutoDialog loadingDialog;
private static class UiHandler extends Handler {
private final WeakReference<PlutoFragment> mFragmentReference;
public UiHandler(PlutoFragment activity) {
mFragmentReference = new WeakReference<PlutoFragment>(activity);
}
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (mFragmentReference.get() != null) {
mFragmentReference.get().handleUiMessage(msg);
}
}
}
public PlutoFragment() {
userVisibleController = new FragmentUserVisibleController(this, this);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
isCreated = true;
initLoadingDialog();
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
isInit = true;
userVisibleController.activityCreated();
}
@Override
public void onResume() {
super.onResume();
userVisibleController.resume();
if (getUserVisibleHint()) {
if (isInit && isCreated) {
isInit = false;// 加载数据完成
//System.out.println("应该去加载数据了");
showData();
}
}
if (getUserVisibleHint()) {
statistics(true);
}
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
userVisibleController.setUserVisibleHint(isVisibleToUser);
// 每次切换fragment时调用的方法
if (isVisibleToUser) {
if (isInit&&isCreated) {
isInit = false;//加载数据完成
// System.out.println("应该去加载数据了");
showData();
}
}
if (isResumed()) {
statistics(getUserVisibleHint());
}
}
@Override
public void onPause() {
super.onPause();
userVisibleController.pause();
if (getUserVisibleHint()) {
statistics(false);
}
}
/**
* 友盟统计
* @param isStart
*/
public void statistics(boolean isStart){
if (isStatistics()) {
}
}
/**
* 取消指定异步任务
*
* @param asyncTasks
*/
protected void cancelAsyncTask(CommonAsyncTask<?, ?, ?>... asyncTasks) {
for (CommonAsyncTask<?, ?, ?> asyncTask : asyncTasks) {
if (asyncTask != null && !asyncTask.isCancelled()) {
asyncTask.cancel(true);
}
}
}
protected abstract void showData();
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public void setupActions(ArrayList<String> actions) {
}
/**
* 处理更新UI任务
*
* @param msg
*/
public void handleUiMessage(Message msg) {
}
@Override
public void handleBroadcast(Context context, Intent intent) {
}
/**
* 发送UI更新操作
*
* @param msg
*/
protected void sendUiMessage(Message msg) {
mUiHandler.sendMessage(msg);
}
protected void sendUiMessageDelayed(Message msg, long delayMillis) {
mUiHandler.sendMessageDelayed(msg, delayMillis);
}
/**
* 发送UI更新操作
*
* @param what
*/
protected void sendEmptyUiMessage(int what) {
mUiHandler.sendEmptyMessage(what);
}
protected void sendEmptyUiMessageDelayed(int what, long delayMillis) {
mUiHandler.sendEmptyMessageDelayed(what, delayMillis);
}
protected void removeUiMessage(int what) {
mUiHandler.removeMessages(what);
}
protected Message obtainUiMessage() {
return mUiHandler.obtainMessage();
}
/**
* 显示一个Toast类型的消息
*
* @param msg 显示的消息
*/
public void showToast(final String msg) {
if (getActivity() != null) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
if (toast == null) {
toast = Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT);
} else {
toast.setText(msg);
toast.setDuration(Toast.LENGTH_SHORT);
}
toast.show();
}
});
}
}
/**
* 显示{@link Toast}通知
*
* @param strResId 字符串资源id
*/
public void showToast(final int strResId) {
String text = getString(strResId);
showToast(text);
}
/**
* 隐藏软键盘
*/
protected void hideSoftInput(Context context) {
InputMethodManager manager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
// manager.toggleSoftInput(InputMethodManager.HIDE_NOT_ALWAYS, 0);
if (getActivity().getCurrentFocus() != null) {
manager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
}
}
public boolean isStatistics() {
return isStatistics;
}
/**
* Fragment嵌套Fragment,父Fragment不进行统计<br><br>
* 要在onCreated方法之前设置才起作用,否则首次失效
* @param statistics 默认为true,为false不进行统计
*/
public void setStatistics(boolean statistics) {
isStatistics = statistics;
}
/**
* 显示软键盘
*/
protected void showSoftInput() {
InputMethodManager manager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
manager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
}
@Override
public void setWaitingShowToUser(boolean waitingShowToUser) {
userVisibleController.setWaitingShowToUser(waitingShowToUser);
}
@Override
public boolean isWaitingShowToUser() {
return userVisibleController.isWaitingShowToUser();
}
@Override
public boolean isVisibleToUser() {
return userVisibleController.isVisibleToUser();
}
@Override
public void callSuperSetUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
}
@Override
public void onVisibleToUserChanged(boolean isVisibleToUser, boolean invokeInResumeOrPause) {
}
/**
* 检测网络是否可用
*/
public boolean isNetworkConnected() {
return NetworkUtils.isNetworkConnected(this.getContext());
}
private void initLoadingDialog(){
loadingDialog = new PlutoDialog(this.getContext(),PlutoDialog.LOADING);
}
}