1、将所有Activity统一到一个base(主题AppCompatTheme),layout和contentView统一处理
2、MainActivity tab切换方式的重构 3、下一步更改toolbar实现方式,然后再是尽量用fragment替换
This commit is contained in:
318
app/src/main/java/com/gh/base/BaseAppCompatActivity.java
Normal file
318
app/src/main/java/com/gh/base/BaseAppCompatActivity.java
Normal file
@ -0,0 +1,318 @@
|
||||
package com.gh.base;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.*;
|
||||
import android.view.View;
|
||||
import com.gh.common.util.*;
|
||||
import com.gh.gamecenter.R;
|
||||
|
||||
|
||||
/**
|
||||
* @author CsHeng
|
||||
*/
|
||||
abstract class BaseAppCompatActivity extends BaseAppCompatActivityLog implements FragmentNavigationDelegate,
|
||||
OnBackPressedListener {
|
||||
|
||||
protected static final String ARGS_FRAGMENT_NAME = "frgName";
|
||||
protected static final String ARGS_FRAGMENT_BUNDLE = "frgBundle";
|
||||
|
||||
protected static Intent getReorderToFrontIntent(Context context, Class<? extends Activity> cls) {
|
||||
final Intent intent = new Intent(context, cls);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
return intent;
|
||||
}
|
||||
|
||||
protected static Intent clearTop(Context context, Class<? extends Activity> cls) {
|
||||
final Intent intent = getReorderToFrontIntent(context, cls);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||
return intent;
|
||||
}
|
||||
|
||||
protected static void showActivity(Context context, Class<? extends Activity> cls) {
|
||||
final Intent intent = getReorderToFrontIntent(context, cls);
|
||||
context.startActivity(intent);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据传进来的fragment class和bundle extra来决定跳转到哪一个fragment
|
||||
*
|
||||
* @param context
|
||||
* @param fragment fragment.getCanonicalName()
|
||||
* @param bundle fragment的构造参数
|
||||
* @return
|
||||
*/
|
||||
protected static Intent getFragmentIntent(Context context, Class<? extends Activity> activity,
|
||||
Class<? extends Fragment> fragment, Bundle bundle) {
|
||||
final Intent intent = getReorderToFrontIntent(context, activity);
|
||||
intent.putExtra(ARGS_FRAGMENT_NAME, fragment.getCanonicalName());
|
||||
intent.putExtra(ARGS_FRAGMENT_BUNDLE, bundle);
|
||||
return intent;
|
||||
}
|
||||
|
||||
/**
|
||||
* 启动Fragment
|
||||
*
|
||||
* @param context
|
||||
* @param fragment
|
||||
* @param bundle
|
||||
*/
|
||||
protected static void startFragment(Context context, Class<? extends Activity> activity,
|
||||
Class<? extends Fragment> fragment, Bundle bundle) {
|
||||
context.startActivity(getFragmentIntent(context, activity, fragment, bundle));
|
||||
}
|
||||
|
||||
protected static void startFragmentForResult(Context context, Class<? extends Activity> activity,
|
||||
Class<? extends Fragment> fragment, Bundle bundle, int requestCode) {
|
||||
if (context instanceof Activity) {
|
||||
((Activity) context).startActivityForResult(getFragmentIntent(context, activity, fragment, bundle),
|
||||
requestCode);
|
||||
}
|
||||
}
|
||||
|
||||
protected static void startFragment(Context context, Class<? extends Activity> activity,
|
||||
Class<? extends Fragment> fragment) {
|
||||
startFragment(context, activity, fragment, null);
|
||||
}
|
||||
|
||||
protected abstract int getLayoutId();
|
||||
|
||||
/**
|
||||
* 1、判断当前是否存在某Fragment,例如下载管理器已经在栈中,则不重新启动,而将其带到最上层 (FindFragmentWithTag)
|
||||
* 2、支持URI调用?
|
||||
* 是否需要重新导向到其他Activity
|
||||
*/
|
||||
protected void handleRedirectIntent(Intent intent) {
|
||||
try {
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodWithParams(this, intent.toUri(Intent.URI_INTENT_SCHEME));
|
||||
}
|
||||
|
||||
// 1、根据从网页抓取到的Intent跳转进来,处理custom uri
|
||||
// final Uri uri = intent.getData();
|
||||
// if (uri != null && SchemeConstants.SCHEME_FFSS.equals(uri.getScheme())) {
|
||||
// handleRedirectFromUri(uri);
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// // 2、根据序列化的数据来重新构建Fragment实例,若没有,则是旧的形式来决定传参
|
||||
// final String fragmentName = intent.getStringExtra(ARGS_FRAGMENT_NAME);
|
||||
// if (AppDebugConfig.IS_DEBUG) {
|
||||
// AppDebugConfig.logMethodWithParams(this, fragmentName);
|
||||
// }
|
||||
// if (!TextUtils.isEmpty(fragmentName)) {
|
||||
// final Bundle args = intent.getBundleExtra(ARGS_FRAGMENT_BUNDLE);
|
||||
// final Fragment fragment = Fragment.instantiate(this, fragmentName, args);
|
||||
// if (fragment instanceof DialogFragment) {
|
||||
// ((DialogFragment) fragment).show(getSupportFragmentManager(), fragmentName);
|
||||
// } else {
|
||||
// getSupportFragmentManager().beginTransaction().replace(R.id.layout_activity_content, fragment)
|
||||
// .commitAllowingStateLoss();
|
||||
// }
|
||||
// }
|
||||
} catch (Throwable e) {
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodWithParams(this, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void handleRedirectFromUri(Uri uri) {
|
||||
try {
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodWithParams(this, uri, uri.getHost(), uri.getPath(), uri.getEncodedQuery());
|
||||
}
|
||||
// switch (uri.getPath()) {
|
||||
// case SchemeConstants.PATH_OPEN_GAME: {
|
||||
// /**
|
||||
// * 对于联运游戏:传入的game_id为0,game_url为对应的游戏链接,aid传联运游戏的aid
|
||||
// * 对于非联运游戏:传入非联运游戏的game_id,game_url不传,aid传0
|
||||
// */
|
||||
// GameModel game = new GameModel();
|
||||
// int gameId = Integer.parseInt(uri.getQueryParameter(SchemeConstants.PARAMS_GAMEID));
|
||||
// game.setId(gameId);
|
||||
//// if (AppDebugConfig.IS_DEBUG) {
|
||||
//// int debugId = 1049;
|
||||
//// game.setId(debugId);
|
||||
//// }
|
||||
// if (gameId == 0) {
|
||||
// // cooperate
|
||||
// int aid = Integer.parseInt(uri.getQueryParameter(SchemeConstants.PARAMS_AID));
|
||||
// game.setAid(aid);
|
||||
// String gameUrl = uri.getQueryParameter(SchemeConstants.PARAMS_GAMEURL);
|
||||
// game.setUrl(gameUrl);
|
||||
// }
|
||||
// ApiRequester.requestGameDetail(this, game);
|
||||
//
|
||||
// break;
|
||||
// }
|
||||
// case SchemeConstants.PATH_OPEN_ARTICLE: {
|
||||
//
|
||||
// String url = uri.getQueryParameter(SchemeConstants.PARAMS_ARTICLE_URL);
|
||||
// String title = uri.getQueryParameter(SchemeConstants.PARAMS_ARTICLE_TITLE);
|
||||
//
|
||||
// if (!TextUtils.isEmpty(url) && !TextUtils.isEmpty(title)) {
|
||||
// Bundle args = new Bundle();
|
||||
// args.putString(Fragment_Browser_Web.ARGS_URL, url);
|
||||
// args.putString(Fragment_Browser_Web.ARGS_TITLE, getString(R.string.title_article_detail));
|
||||
// CommonActivity.startFragment(this, Fragment_Browser_Web.class, args);
|
||||
// }
|
||||
//
|
||||
// break;
|
||||
// }
|
||||
// default:
|
||||
// break;
|
||||
// }
|
||||
} catch (Exception e) {
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
// Debug_SDK.e(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onHandleBackPressed() {
|
||||
onBackPressed();
|
||||
return true;
|
||||
}
|
||||
|
||||
protected boolean handleBackPressed() {
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodWithParams(this);
|
||||
}
|
||||
final Fragment curFragment = getTopFragment();
|
||||
if (curFragment instanceof OnBackPressedListener &&
|
||||
((OnBackPressedListener) curFragment).onHandleBackPressed()) {
|
||||
return true;
|
||||
}
|
||||
if (popFragment()) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
protected View mContentView;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
mContentView = getLayoutInflater().inflate(getLayoutId(), null);
|
||||
setContentView(getLayoutId());
|
||||
if (savedInstanceState == null) {
|
||||
handleRedirectIntent(getIntent());
|
||||
}
|
||||
AppManager.getInstance().addActivity(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
AppManager.getInstance().finishActivity(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addFragment(Fragment fragment) {
|
||||
getSupportFragmentManager().beginTransaction().add(R.id.layout_activity_content, fragment)
|
||||
.addToBackStack(fragment.toString()).commitAllowingStateLoss();
|
||||
Util_System_Keyboard.hideSoftKeyboard(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void replaceFragment(Fragment toReplace) {
|
||||
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
|
||||
ft.replace(R.id.layout_activity_content, toReplace).addToBackStack(toReplace.toString());
|
||||
ft.commitAllowingStateLoss();
|
||||
Util_System_Keyboard.hideSoftKeyboard(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeFragment(Fragment toRemove) {
|
||||
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
|
||||
ft.replace(R.id.layout_activity_content, toRemove).addToBackStack(toRemove.toString());
|
||||
ft.commitAllowingStateLoss();
|
||||
Util_System_Keyboard.hideSoftKeyboard(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showFragment(Fragment toShow) {
|
||||
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
|
||||
ft.show(toShow).addToBackStack(toShow.toString());
|
||||
ft.commitAllowingStateLoss();
|
||||
Util_System_Keyboard.hideSoftKeyboard(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void hideFragment(Fragment toHide) {
|
||||
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
|
||||
ft.show(toHide).addToBackStack(toHide.toString());
|
||||
ft.commitAllowingStateLoss();
|
||||
Util_System_Keyboard.hideSoftKeyboard(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean popFragment() {
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodWithParams(this, getSupportFragmentManager().getBackStackEntryCount());
|
||||
}
|
||||
final int backStackCount = getSupportFragmentManager().getBackStackEntryCount();
|
||||
if (backStackCount > 0) {
|
||||
Util_System_Keyboard.hideSoftKeyboard(this);
|
||||
getSupportFragmentManager().popBackStack();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void popFragmentToBase() {
|
||||
getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
|
||||
}
|
||||
|
||||
public Fragment getTopFragment() {
|
||||
return getSupportFragmentManager().findFragmentById(R.id.layout_activity_content);
|
||||
}
|
||||
|
||||
/**
|
||||
* forward ActivityResultListener to fragments this activity hosts
|
||||
*
|
||||
* @param requestCode
|
||||
* @param resultCode
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodWithParams(this, requestCode, resultCode, data);
|
||||
}
|
||||
final Fragment fragment = getTopFragment();
|
||||
if (fragment != null) {
|
||||
fragment.onActivityResult(requestCode, resultCode, data);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodWithParams(this);
|
||||
}
|
||||
if (handleBackPressed()) {
|
||||
return;
|
||||
}
|
||||
// default finish activity
|
||||
Util_System_Keyboard.hideSoftKeyboard(this);
|
||||
finish();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onNewIntent(Intent intent) {
|
||||
super.onNewIntent(intent);
|
||||
setIntent(intent);
|
||||
handleRedirectIntent(intent);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user