对于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;
}
}
}
如果有什么问题,请指教。
资源下载地址
本文介绍了一种通过自定义适配器管理Fragment的方法,包括如何添加Fragment、切换Fragment以及实现延时加载的功能。适用于需要灵活管理多个Fragment的应用场景。
1052

被折叠的 条评论
为什么被折叠?



