Fragment管理的工具类
2015-06-20 23:51
316 查看
对于Fragment的使用,如果是用ViewPager加载的话,管理起来很方便,因为只有继承FragmentPagerAdapter,修改一点东西就可以了。
但是如果是FragmentManger,使用add()、hide()管理起来有点麻烦。于是我就仿FragmentPagerAdapter,写了一个SHFragmentAdapter管理显示的fragment
可以延时加载的。
其实很简单而已,下面是代码
SHFragmentAdapter
添加Fragment通过 addTag, 切换时可以调用 setCurrentItem,就可以切换到不同fragment。
下面是AbsFragment
下面是使用方法
如果有什么问题,请指教。
资源下载地址
点击下载
但是如果是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() { } 4000 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; } } }
如果有什么问题,请指教。
资源下载地址
点击下载
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories