Fragment管理的工具类
来源:互联网 发布:php php_self 编辑:程序博客网 时间:2024/06/05 08:11
对于Fragment的使用,如果是用ViewPager加载的话,管理起来很方便,因为只有继承FragmentPagerAdapter,修改一点东西就可以了。
但是如果是FragmentManger,使用add()、hide()管理起来有点麻烦。于是我就仿FragmentPagerAdapter,写了一个SHFragmentAdapter管理显示的fragment
可以延时加载的。
其实很简单而已,下面是代码
SHFragmentAdapter
package com.example.administrator.frag;import android.content.Context;import android.os.Bundle;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentManager;import android.support.v4.app.FragmentTransaction;import java.util.ArrayList;import java.util.List;/** * 通过show hide 显示Fragment的适配器,可以延时加载,只有使用AbsFragment才有用 * Created by Administrator on 2015/6/17. */public class SHFragmentAdapter { private FragmentManager mFragmentManager = null; private List<PageInfo> mTabs = null; private int containerId = 0; private Context mContext = null; private Fragment mCurrentPrimaryItem = null; private OnPageChangeListener onPageChangeListener; public void setOnPageChangeListener(OnPageChangeListener onPageChangeListener) { this.onPageChangeListener = onPageChangeListener; } public SHFragmentAdapter(FragmentManager manager, int contentId, Context context) { this.mFragmentManager = manager; this.containerId = contentId; mContext = context; mTabs = new ArrayList<PageInfo>(2); } /** * * @param tag * @param clasz * @param bundle */ public void addTag(String tag, Class<? extends Fragment> clasz, Bundle bundle) { mTabs.add(new PageInfo(null, tag, clasz, bundle)); } private Fragment getItem(int position) { PageInfo info = mTabs.get(position); return Fragment.instantiate(mContext, info.clss.getName(), info.args); } public long getItemId(int position) { return position; }// private void setPrimaryItem(Fragment fragment) {// if (fragment != mCurrentPrimaryItem) {// if (mCurrentPrimaryItem != null) {// mCurrentPrimaryItem.setMenuVisibility(false);// mCurrentPrimaryItem.setUserVisibleHint(false);// }// if (fragment != null) {// fragment.setMenuVisibility(true);// fragment.setUserVisibleHint(true);// }// mCurrentPrimaryItem = fragment;// }// }// private Fragment instantiateItem(int containerId, int position) {// final long itemId = getItemId(position);// // Do we already have this fragment?// String name = makeFragmentName(containerId, itemId);// Fragment fragment = mFragmentManager.findFragmentByTag(name);// if (fragment == null) {// fragment = getItem(position);// FragmentTransaction transaction = mFragmentManager.beginTransaction();// transaction.add(containerId, fragment, makeFragmentName(containerId, itemId));// transaction.commitAllowingStateLoss();// }// return fragment;// } public Fragment getCurrentItem() { return mCurrentPrimaryItem; } private static String makeFragmentName(int viewId, long id) { return "android:switcher:" + viewId + ":" + id; } public void setCurrentItem(int position) { final long itemId = getItemId(position); // Do we already have this fragment? String name = makeFragmentName(containerId, itemId); Fragment fragment = mFragmentManager.findFragmentByTag(name); if (fragment != null && fragment == mCurrentPrimaryItem) { return; } FragmentTransaction transaction = mFragmentManager.beginTransaction(); if (fragment == null) { fragment = getItem(position); transaction.add(containerId, fragment, makeFragmentName(containerId, itemId)); } if (mCurrentPrimaryItem != null) { transaction.hide(mCurrentPrimaryItem); } transaction.show(fragment); transaction.commitAllowingStateLoss(); if (mCurrentPrimaryItem != null) { mCurrentPrimaryItem.setMenuVisibility(false); mCurrentPrimaryItem.setUserVisibleHint(false); } if (fragment != null) { fragment.setMenuVisibility(true); fragment.setUserVisibleHint(true); } mCurrentPrimaryItem = fragment; if (onPageChangeListener != null) { onPageChangeListener.onPageChangeAfter(position); } } public interface OnPageChangeListener { public void onPageChangeAfter(int position); }}
添加Fragment通过 addTag, 切换时可以调用 setCurrentItem,就可以切换到不同fragment。
下面是AbsFragment
package com.example.administrator.frag;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;/** * Created by Administrator on 2015/5/28. */public abstract class AbsFragment extends Fragment { public static final byte INIT_NOT = 0x00; //未加载 public static final byte INIT_ING = 0x01; //加载中 public static final byte INIT_FINISH = 0x02; //加载完成 protected View mRootView; protected byte initState = INIT_NOT; protected abstract int getLayoutId(); //第一次可见加载 protected abstract void onFirstVisiableLoad(); private Handler mPriHandler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 1: //可见 onVisiable(); break; case 2: //不可见 onInvisiable(); break; case 3: //第一次加载 if (initState == INIT_NOT) { initState = INIT_ING; onFirstVisiableLoad(); initState = INIT_FINISH; mPriHandler.sendEmptyMessage(1); } break; } } }; @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { mRootView = inflater.inflate(getLayoutId(), container, false); return mRootView; } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { if (initState == INIT_FINISH) { mPriHandler.sendEmptyMessage(1); } else if (initState == INIT_NOT) { mPriHandler.sendEmptyMessageDelayed(3, 100);//延迟0.1秒加载 } } else { if (initState == INIT_FINISH) { mPriHandler.sendEmptyMessage(2); } else { mPriHandler.removeMessages(3); } } } //当可见 protected void onVisiable() { } //当不可见 protected void onInvisiable() { } public View findViewById(int id) { if (mRootView != null) { return mRootView.findViewById(id); } return null; }}
下面是使用方法
package com.example.administrator.frag;import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.view.View;import com.example.administrator.frag.page.FragOne;import com.example.administrator.frag.page.FragTwo;public class FragActivity extends ActionBarActivity implements View.OnClickListener { SHFragmentAdapter adapter = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.frag_main); adapter = new SHFragmentAdapter(getSupportFragmentManager(), R.id.container, this); adapter.addTag("one", FragOne.class, null); adapter.addTag("two", FragTwo.class, null); adapter.setCurrentItem(0); findViewById(R.id.one).setOnClickListener(this); findViewById(R.id.two).setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.one: adapter.setCurrentItem(0); break; case R.id.two: adapter.setCurrentItem(1); break; } }}
如果有什么问题,请指教。
资源下载地址
点击下载
0 0
- Fragment管理的工具类
- fragment嵌套fragment的管理
- Fragment 工具类,搞定Fragment的基本使用
- Android 自定义Fragment切换管理类,自动管理Fragment的生命周期,支持FragmentActivity和Fragment里面嵌套fragment
- Code Fragment-一些工具类的特点
- fragment的管理
- fragment的管理
- Fragment替换工具类
- Fragment相关工具类
- Fragment工具类
- 抽象类管理fragment
- Fragment的回退栈管理分析
- Fragment的BackStack管理过程
- (5)Fragment回退栈的管理
- Code Fragment-设置自己的Logger工具类
- 控制底部切换不同fragment的工具类
- 在用FragmentController类管理Fragment时报的RutimeError
- Android Fragment管理类,操作Fragment的增加、删除、替换、隐藏、显示等
- Struts2获取Web容器资源的方式 访问request,session
- Cygwin中使用ncurses库
- VS高亮显示无扩展名源码文件
- java基础—IO流——将一些字符写入到指定硬盘上的目录中去:
- 输入输出
- Fragment管理的工具类
- 最大自序和问题
- 为什么基类中的析构函数要声明为虚析构函数?
- 小白的柳州麻将黑科技.Part1 = 你不知道的门清
- iOS图片拉伸技巧
- android TextView 设置部分文字背景色和文字颜色
- CENTOS 基本安装-切换到root用户;非图形界面启动;设置静态IP;PSCP文件传输
- java笔记25 File类、递归、Properties
- SCU 4440