关于Fragment使用的那些坑,给出一个完美的填坑方式!源码相送
来源:互联网 发布:锻炼视力的软件 编辑:程序博客网 时间:2024/05/21 09:09
- 关于Fragment堆栈的管理已经写过十几次了
- 每次都有新的问题
- 但是这次不一样了,可以更好的管理Fragment
`
public class FuckFragment { public static final String CURRENT_FRAGMENT = "STATE_FRAGMENT_SHOW"; public static final String FRAGMENTS_TAG = "FRAGMENTS_TAG";//tag private AppCompatActivity appCompatActivity; private int fragmentLayoutId; private Bundle savedInstanceState;// private int currentIndex = 0; private String currentTag;//当前展示的fragment的类名,默认值一定要是第一个展示的fragment private BaseFragment currentFragment = new BaseFragment() { @Override public View initView(LayoutInflater inflater, Bundle savedInstanceState) { return null; } @Override public void initList() { } @Override public void setOnclick() { } }; private HashMap<String,BaseFragment> fragmentList; private ArrayList<String> fragmentTags; private FuckFragmentCallBack fuckFragmentCallBack; private FragmentManager fragmentManager; public FuckFragment(AppCompatActivity appCompatActivity, int fragmentLayoutId,String firstFragmentClassName, Bundle savedInstanceState){ this.appCompatActivity = appCompatActivity; this.fragmentLayoutId = fragmentLayoutId; this.savedInstanceState = savedInstanceState; fragmentList = new HashMap<>(); fragmentTags = new ArrayList<>(); fragmentManager = appCompatActivity.getSupportFragmentManager(); currentTag = firstFragmentClassName; } public void onCreate(FuckFragmentCallBack fuckFragmentCallBack){ this.fuckFragmentCallBack = fuckFragmentCallBack; fuckFragmentCallBack.initFragments(fragmentList); if(savedInstanceState == null){ //正常启动 showFragment(); }else{ //异常退出后恢复启动 restoreFragment(); } } /** * 异常退出时保存当前显示的Fragment名字 * @param outState */ public void onSaveInstanceState(Bundle outState){ outState.putString(CURRENT_FRAGMENT,currentTag);//保存当前显示的Fragment outState.putStringArrayList(FRAGMENTS_TAG,fragmentTags);//保存所有添加过的FragmentTag } /** * 正常显示fragment */ public void showFragment(){ FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); BaseFragment showFragment = fragmentList.get(currentTag); if(!showFragment.isAdded()){ fragmentTransaction.hide(currentFragment); currentFragment.hind(); String tag = showFragment.getClass().getSimpleName();//获取fragment的绝对类名 fragmentTransaction.add(fragmentLayoutId,showFragment,tag); fragmentTags.add(tag);//保存已经添加过的fragment类名,作为tag Log.e("FuckFragment","showFragment :add tag:"+tag); fragmentTransaction.show(fragmentList.get(currentTag)); fragmentList.get(currentTag).show(); }else{ currentFragment.hind(); fragmentTransaction.hide(currentFragment); fragmentTransaction.show(fragmentList.get(currentTag)); fragmentList.get(currentTag).show(); } currentFragment = fragmentList.get(currentTag); fragmentTransaction.commit(); fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);//标准动画 } /** * 恢复Fragment */ private void restoreFragment(){ currentTag = savedInstanceState.getString(CURRENT_FRAGMENT,currentTag); fragmentTags = savedInstanceState.getStringArrayList(FRAGMENTS_TAG); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); for(int i = 0 ; i < fragmentTags.size() ; i ++){ String tag = fragmentTags.get(i); Log.e("FuckFragment","restoreFragment:tag:"+tag);// tag = 类名 BaseFragment outFragment = (BaseFragment) fragmentManager.findFragmentByTag(tag); if(outFragment != null){ fragmentList.put(tag,outFragment);//替换 } /** * 遍历所有被保存的fragment * ps:只会保存已经展示过的 */ } for(String fragmentTag : fragmentList.keySet()){ if(fragmentTag.equals(currentTag)){ fragmentTransaction.show(fragmentList.get(fragmentTag)); fragmentList.get(fragmentTag).show(); }else{ fragmentTransaction.hide(fragmentList.get(fragmentTag)); fragmentList.get(fragmentTag).hind(); } } fragmentTransaction.commit(); currentFragment = fragmentList.get(currentTag); } public void selectFragment(String className){ if(!currentTag.equals(className)){ currentTag = className; showFragment(); } } /** * 获取当前显示的fragment的名字 * @return */ public String getCurrentTag() { return currentTag; } public BaseFragment getFragment(String simpleName){ return fragmentList.get(simpleName); } public interface FuckFragmentCallBack{ /** * 类名 = key * 实例 = value * @param fragmentList */ public void initFragments(HashMap<String,BaseFragment> fragmentList); }}
- 下面是自定义的BaseFragment
public abstract class BaseFragment extends Fragment { private Context context; private BaseToastView toastView; private HomeActivity homeActivity; @Override public void onAttach(Context context) { super.onAttach(context); this.context = context; this.homeActivity = (HomeActivity)context; } @Override public Context getContext() { return context; } public HomeActivity getHomeActivity(){ return homeActivity; } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { toastView = new BaseToastView(getContext()); View contentView = initView(inflater,savedInstanceState); initList(); setOnclick(); return contentView; } public abstract View initView(LayoutInflater inflater,Bundle savedInstanceState); public abstract void initList(); public abstract void setOnclick(); public void toast(String msg){ toastView.getToast().show(msg); } public void show(){ } public void hind(){ }}
阅读全文
1 0
- 关于Fragment使用的那些坑,给出一个完美的填坑方式!源码相送
- Android中关于Fragment的那些事、那些坑
- Fragment的填坑之旅
- 那些年一起填过的坑
- 关于Fragment的那些事儿
- Android填坑之旅(第二篇) 关于Fragment中getActivity为Null的问题
- BMap的使用填坑
- [巨坑]那些年没有填的坑qwq
- 填一个坑。关于把ruby编译到android上的一个遗留问题。
- 关于点赞问题的填坑。
- 一次关于SingleTask的填坑
- 关于AIDL基础的填坑
- Android实战技巧:Fragment的那些坑
- Android实战技巧:Fragment的那些坑
- Android实战技巧:Fragment的那些坑
- Fragment嵌套Fragment时遇到的那些坑
- 关于Fragment的使用
- 在viewpager的fragment里面填一个fragment里的RecyleView的点击事件
- Java IO 字符流 缓冲区
- 设计模式之单例模式
- Linux curl命令详解
- 记录一下spring boot application properties
- Linux 停止当前正在运行程序
- 关于Fragment使用的那些坑,给出一个完美的填坑方式!源码相送
- 102. Binary Tree Level Order Traversal
- 细说mysql索引
- 考试卷子详情
- VS2010编写exe程序,在其他电脑上无法运行,提示缺少mfc100.dll的解决办法
- 策略模式
- codevs 1164 || NOIP 2007 统计数字 模拟 解题报告
- HDU Bone Collector (01背包,裸题)
- python生成业务报表实例