首先创建BaseActivity
@Override
protected final void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutId());
parsePresenter();
initView();
initData();
}
parsePresenter 具体代码实现
protected void parsePresenter(){
// 通过getGenericSuperclass方法可以获取当前对象的直接超类的 Type
Type genericSuperclass = this.getClass().getGenericSuperclass();
//获得第一个实现类中所有泛型参数的集合
Type[] actualTypeArguments = ((ParameterizedType) genericSuperclass).getActualTypeArguments();
//获得实现接口中第一个泛型的参数
Class<P> tClass = (Class<P>) actualTypeArguments[0];
try {
//通过Java的动态代理来创建对象
presenter = tClass.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
};
管理Fragment的类 传入的fragment必须继承BaseFragment
/**
*
* @param container 容器
* @param fragmentClass 更换的fragment
* @param bundle 传递的参数
* @param isReplace 是否替换
* @param isBack 是否添加到后退栈
*/
public void changeFragment(int container,Class<? extends BaseFragment> fragmentClass,Bundle bundle,boolean isReplace,boolean isBack){
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
//获取Fragment类的名字
String simpleName = fragmentClass.getSimpleName();
//根据别名去栈中查找Fragment 如果存在肯定不为null
BaseFragment fragment = (BaseFragment) fragmentManager.findFragmentByTag(simpleName);
if(fragment == null){
try {
fragment = fragmentClass.newInstance();
transaction.add(container,fragment,simpleName);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
//如果不为null就传递参数
if(bundle != null)
fragment.setBundle(bundle);
//隐藏上一个Fragment
if (lastFragment != null)
transaction.hide(lastFragment);
//true 替换 false 隐藏显示
if(isReplace){
transaction.replace(container,fragment,simpleName);
}else {
//显示当前Fragment
transaction.show(fragment);
}
//是否添加到回退栈
if(isBack)
transaction.addToBackStack(simpleName);
lastFragment = fragment;
transaction.commit();
}
判断是否为首页fragment 不返回直接退出程序
@Override
public void onBackPressed() {
FragmentManager manager = getSupportFragmentManager();
int backStackEntryCount = manager.getBackStackEntryCount();
if(backStackEntryCount>0){
manager.popBackStackImmediate();
int count = manager.getBackStackEntryCount();
if(count>0){
FragmentManager.BackStackEntry backStackEntry = manager.getBackStackEntryAt( count- 1);
String name = backStackEntry.getName();
BaseFragment fragment = (BaseFragment) manager.findFragmentByTag(name);
lastFragment = fragment;
if("AFragment".equals(name)){
android.os.Process.killProcess(android.os.Process.myPid());
// onKeyDown(KeyEvent.KEYCODE_BACK,event);
}
}
}
}
BaseActivity整体代码(里面有mvp 忽略不计)
package com.example.ypc.mytext.base;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.widget.Toast;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public abstract class BaseActivity<P extends BasePresenter> extends AppCompatActivity {
protected P presenter;
@Override
protected final void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutId());
parsePresenter();
presenter.attach(this);
initView();
initData();
}
protected void parsePresenter(){
// 通过getGenericSuperclass方法可以获取当前对象的直接超类的 Type
Type genericSuperclass = this.getClass().getGenericSuperclass();
//获得第一个实现类中所有泛型参数的集合
Type[] actualTypeArguments = ((ParameterizedType) genericSuperclass).getActualTypeArguments();
//获得实现接口中第一个泛型的参数
Class<P> tClass = (Class<P>) actualTypeArguments[0];
try {
//通过Java的动态代理来创建对象
presenter = tClass.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
};
/**
*
* @param container 容器
* @param fragmentClass 更换的fragment
* @param bundle 传递的参数
* @param isReplace 是否替换
* @param isBack 是否添加到后退栈
*/
public void changeFragment(int container,Class<? extends BaseFragment> fragmentClass,Bundle bundle,boolean isReplace,boolean isBack){
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
//获取Fragment类的名字
String simpleName = fragmentClass.getSimpleName();
//根据别名去栈中查找Fragment 如果存在肯定不为null
BaseFragment fragment = (BaseFragment) fragmentManager.findFragmentByTag(simpleName);
if(fragment == null){
try {
fragment = fragmentClass.newInstance();
transaction.add(container,fragment,simpleName);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
//如果不为null就传递参数
if(bundle != null)
fragment.setBundle(bundle);
//隐藏上一个Fragment
if (lastFragment != null)
transaction.hide(lastFragment);
//true 替换 false 隐藏显示
if(isReplace){
transaction.replace(container,fragment,simpleName);
}else {
//显示当前Fragment
transaction.show(fragment);
}
//是否添加到回退栈
if(isBack)
transaction.addToBackStack(simpleName);
lastFragment = fragment;
transaction.commit();
}
@Override
public void onBackPressed() {
FragmentManager manager = getSupportFragmentManager();
int backStackEntryCount = manager.getBackStackEntryCount();
if(backStackEntryCount>0){
manager.popBackStackImmediate();
int count = manager.getBackStackEntryCount();
if(count>0){
FragmentManager.BackStackEntry backStackEntry = manager.getBackStackEntryAt( count- 1);
String name = backStackEntry.getName();
BaseFragment fragment = (BaseFragment) manager.findFragmentByTag(name);
lastFragment = fragment;
if("AFragment".equals(name)){
android.os.Process.killProcess(android.os.Process.myPid());
// onKeyDown(KeyEvent.KEYCODE_BACK,event);
}
}
}
}
//退出时的时间
private long mExitTime;
//对返回键进行监听
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
exit();
return true;
}
return super.onKeyDown(keyCode, event);
}
public void exit() {
if ((System.currentTimeMillis() - mExitTime) > 2000) {
Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();
mExitTime = System.currentTimeMillis();
} else {
finish();
System.exit(0);
}
}
private BaseFragment lastFragment;
protected abstract void initData();
protected abstract void initView();
public abstract int getLayoutId();
@Override
protected void onDestroy() {
super.onDestroy();
presenter.decath();
}
}
BaseFragment的代码
package com.example.ypc.mytext.base;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public abstract class BaseFragment extends Fragment {
private Bundle bundle;
public Bundle getBundle() {
return bundle;
}
public void setBundle(Bundle bundle) {
this.bundle = bundle;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(getLayoutId(), container, false);
initView(view);
initData();
return view;
}
protected abstract void initData();
protected abstract void initView(View view);
public abstract int getLayoutId();
}
MainActivity 具体实现
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
changeFragment(R.id.fl, AFragment.class,null,false,true);
}
});