您的位置:首页 > 移动开发 > Android开发

Fragment管理的工具类

2015-06-20 23:51 316 查看
对于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() {
}
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;
}
}

}


如果有什么问题,请指教。

资源下载地址

点击下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息