package com.mfh.comna.view; import android.app.ActionBar; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import com.mfh.comna.api.utils.MLog; import com.mfh.comna.comn.logic.IBaseViewComponent; import com.mfh.comna.comn.logic.IFragmentSelect; import com.mfh.comna.comn.logic.ISubActivityMenuCheck; import com.mfh.comna.comn.logic.MyMultiAsyncTask; import com.mfh.comna.comn.logic.UpdateResultsRunable; import com.mfh.comna.utils.DialogUtil; import com.umeng.analytics.MobclickAgent; import java.util.Date; import butterknife.ButterKnife; /** * 自定义的FragmentActive基类,包含自定义actionbar等 * * @author zhangyz created on 2013-4-10 * @since Framework 1.0 */ public abstract class BaseFragmentActive extends FragmentActivity implements OnClickListener, IBaseViewComponent<Object, Object>, IFragmentSelect, ISubActivityMenuCheck { protected ActionBar mActionBar; private Handler mHandler = null;//用于异步更新界面 private DialogUtil dialogUtil; protected BaseFragment curFragment = null; /** * 获取面板的layout布局号 * @return * @author zhangyz created on 2013-4-5 */ public abstract int getLayoutId(); /** * 设置标题 * @author zhangyz created on 2013-4-10 * */ protected void initActionBar(ActionBar actionBar) { //actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); actionBar.setDisplayHomeAsUpEnabled(true); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getLayoutId()); //使用ButterKnife工具 ButterKnife.bind(this); mActionBar = this.getActionBar();// (ActionBar)this.findViewById(R.id.gd_action_bar); if (mActionBar != null) initActionBar(mActionBar); } @Override protected void onPause() { super.onPause(); MobclickAgent.onPause(this); } @Override protected void onResume() { super.onResume(); MobclickAgent.onResume(this); } /** * 在指定的位置显示一个fragment * @param fragment * @param targetContainer * @param bAdd 是增加还是替换 * @return 返回添加后的fragment的id * @author zhangyz created on 2013-4-16 */ public int showFragment(Integer targetContainer, BaseFragment fragment, boolean bAdd) { FragmentManager fm = getSupportFragmentManager(); FragmentTransaction fc = fm.beginTransaction(); String tag = Long.toString(new Date().getTime());//tag,下面两个地方都用到,重用一个名。便于再后面backUpFragment中使用。 if (bAdd) { fc.add(targetContainer, fragment, tag); } else { //java.lang.IllegalStateException: Can't change tag of fragment SurroundFragment{43311878 #0 id=0x7f07006e 1430104071999}: was 1430104071999 now 1430104446542 fc.replace(targetContainer, fragment, tag); } //注:使用 popBackStack()可将fragment从后台堆栈中弹出 (模拟用户按下BACK 命令). fc.addToBackStack(tag);//把当前操作的这个fragment加入返回堆栈,tag代表起个名字;后面按回退键时需要。 fc.commit(); curFragment = fragment; return fragment.getId(); } public int showFragment(Integer targetContainer, BaseFragment fragment, boolean tagEnabled, boolean bPopBackStack) { FragmentManager fm = getSupportFragmentManager(); FragmentTransaction fc = fm.beginTransaction(); if(tagEnabled){ String tag = Long.toString(new Date().getTime());//tag,下面两个地方都用到,重用一个名。便于再后面backUpFragment中使用。 fc.replace(targetContainer, fragment, tag); if(bPopBackStack){ fc.addToBackStack(tag);//把当前操作的这个fragment加入返回堆栈,tag代表起个名字;后面按回退键时需要。 } } else{ fc.replace(targetContainer, fragment); } fc.commit(); curFragment = fragment; return fragment.getId(); } /** * 显示指定Fragment * TODO:java.lang.IllegalStateException: Fragment already added: SurroundFragment{43243e60 #1 id=0x7f07006e} * */ public int showFragmentWithoutTag(Integer targetContainer, BaseFragment fragment, boolean bAdd) { FragmentManager fm = getSupportFragmentManager(); // fm.popBackStack(); FragmentTransaction fc = fm.beginTransaction(); if (bAdd) { fc.add(targetContainer, fragment); } else { fc.replace(targetContainer, fragment); } //注:使用 popBackStack()可将fragment从后台堆栈中弹出 (模拟用户按下BACK 命令). // fc.addToBackStack(null);//把当前操作的这个fragment加入返回堆栈,tag代表起个名字;后面按回退键时需要。 fc.commit(); curFragment = fragment; return fragment.getId(); } public int showFragmentWithTag(Integer targetContainer, BaseFragment fragment, boolean bAdd, String tag) { FragmentManager fm = getSupportFragmentManager(); FragmentTransaction fc = fm.beginTransaction(); if (bAdd) { fc.add(targetContainer, fragment, tag); } else { fc.replace(targetContainer, fragment, tag); } //注:使用 popBackStack()可将fragment从后台堆栈中弹出 (模拟用户按下BACK 命令). fc.addToBackStack(tag);//把当前操作的这个fragment加入返回堆栈,tag代表起个名字;后面按回退键时需要。 fc.commit(); curFragment = fragment; return fragment.getId(); } @Override public void OnFragmentSelected(Fragment fmt) { //invalidateOptionsMenu();//当fragmentActive下面的fragment本身也createOptionMenu时,系统框架会自动失效。 if (fmt instanceof BaseFragment) { curFragment = (BaseFragment)fmt; } } protected BaseFragmentActive getThis() { return this; } /** * 提供一个给子类继承的机会。 * @return * @author zhangyz created on 2013-4-20 */ public BaseFragment getCurFragment() { return curFragment; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); if (resultCode == IBaseViewComponent.RETURN_CODE_NULL) return; //说明直接返回。 BaseFragment newerFmt = getCurFragment(); if (newerFmt != null) curFragment = newerFmt; if (curFragment != null) { curFragment.onFragmentResult(requestCode, resultCode, intent); } } protected DialogUtil getDialogUtil() { if (dialogUtil == null) dialogUtil = new DialogUtil(this); return dialogUtil; } /** * 回退fragment * @return * @author zhangyz created on 2013-5-18 */ protected boolean backUpFragment() { FragmentManager fm = getSupportFragmentManager(); int haveCount = fm.getBackStackEntryCount(); if (curFragment != null && haveCount > 1) {//保留第一个 if (fm.popBackStackImmediate()) {//立即弹出 haveCount = fm.getBackStackEntryCount(); if (haveCount > 0) { String fmTagName = fm.getBackStackEntryAt(haveCount - 1).getName();//addBackStack时使用的名字 curFragment = (BaseFragment)fm.findFragmentByTag(fmTagName);//加入Fragment时使用的名字 } else curFragment = null; } return true; } else return false; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: /* * Intent intent = new Intent(this, MainActivity.class); * intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); */ if (!backUpFragment()) { this.setResult(RETURN_CODE_NULL, null);//返回为0 this.finish();//结束当前activity } return true; default: return super.onOptionsItemSelected(item); } } /** * 提示消息,稍后自动关闭 * @param message 提示消息 * @author zhangyz created on 2013-4-12 */ protected void showHint(CharSequence message) { getDialogUtil().showHint(message); } /** * 提示消息,点击确定后关闭 * @param message 提示消息 */ protected void showMessage(CharSequence message){ getDialogUtil().showMessage(message); } protected void showYesNoDialog(CharSequence message, DialogInterface.OnClickListener listen) { getDialogUtil().showYesNoDialog(message, listen); } /** * 显示一个典型的两按钮的询问对话框 * @param title * @param message * @return ture:选择了是: false:选择了否 * @author zhangyz created on 2013-4-5 */ protected void showYesNoDialog(CharSequence title, CharSequence message, DialogInterface.OnClickListener listen) { getDialogUtil().showYesNoDialog(title, message, listen); } @Override public void doAsyncTask() { new MyMultiAsyncTask<Object, Object>(this).execute(); } @Override public void doAsyncTaskWithParam(Object... param) { new MyMultiAsyncTask<Object, Object>(this).execute(param); } @Override public void doAsyncTask(int taskKind) { new MyMultiAsyncTask<Object, Object>(this, taskKind).execute(); } @Override public void doAsyncTask(int taskKind, Object... param) { new MyMultiAsyncTask<Object, Object>(this, taskKind).execute(param); } @Override public void doAsyncUpdateUi(Object... param) { if (mHandler == null) mHandler = new Handler(); mHandler.post(new UpdateResultsRunable<Object>(this, param)); } @Override public Object doInBackground(int taskKind, Object... params) { return null; } @Override public ProgressDialog onPreExecute(int taskKind) { // 开启进度条 return ProgressDialog.show(this, "请稍等...", "正在处理中...", true); } @Override public void onPostExecute(int taskKind, Object result, Object...params) { } @Override public void onProgressUpdate(int taskKind, Integer... values) { } @Override public void onClick(View arg0) { } @Override public void doInBackgroundException(int taskKind, Throwable ex, Object... params) { ex.printStackTrace(); // Toast.makeText(this, "执行出错:" + ex.getMessage(), Toast.LENGTH_SHORT).show(); MLog.e(ex.toString()); } @Override public boolean OnOptionsMenuItemCheck(int groupId, int menuId) { return true; } @Override public boolean setGroupVisible(Menu menu) { return false; } }