一、tab+fragment的show()、hide()的使用
/**
*
* @author zhongwr
*
*/
public class AllBangTabAct extends BaseActivity implements RequestCallBack, JoinOrExitBangLister {
/** 当前选中的tab下标 */
private int currIndex = 0;
/** 当前选中的tab Textview */
private TextView tvCurrTab;
/** tab游标动画图片 */
private ImageView ivTabIndicator;
/** tab动画图片偏移量 */
private int offset = 0;
/** 返回、搜索 */
private ImageView ivBack, ivSearch;
/** 是否是b */
private boolean isMyBang = true;
/** 若首次进入不是b,则此帮类id不能为空 */
private int categoryId;
/** b集合 */
private ArrayList<MyBangItem> myBangList;
/** 或者其他tab(非b)对应的帮集合 */
private ArrayList<BangInfo> notMybangList;
private Context mContext;
private ViewPager vpFragmentContainer;
private TabBangFragmentAdapter fragmentPagerAdapter;
/** fragment集合 */
private List<Fragment> fragmentList;
/** tab栏view:所有tab的容器 */
private LinearLayout llTabContainer;
/** 所有帮的tab集合 */
private ArrayList<BangCategoryInfo> allBangTabList;
/** tab对应的view */
private List<TextView> tabTextViewList;
/***
*
* @description 启动当前act
* @author zhongwr
* @param categoryId
* 帮类id:若加载的不是b ,此id不能为空
* @param isMyBang
* 是不是b
*/
public static void startAllBangTabAct(Context context, boolean isMyBang, String categoryId) {
if (null != context) {
Intent intent = new Intent(context, AllBangTabAct.class);
intent.putExtra("isMyBang", isMyBang);
intent.putExtra("categoryId", categoryId);
context.startActivity(intent);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.all_bang_tab_act);
mContext = this;
initViews();
initListener();
initData(savedInstanceState);
}
/**
* 初始化View
*/
@Override
protected void initViews() {
ivTabIndicator = (ImageView) findViewById(R.id.iv_tab_indicator);
ivBack = (ImageView) findViewById(R.id.back_button);
ivSearch = (ImageView) findViewById(R.id.ivRight);
llTabContainer = (LinearLayout) findViewById(R.id.ll_all_tab_parent);
vpFragmentContainer = (ViewPager) findViewById(R.id.vp_tab_fragments_container);
}
private void initData(Bundle savedInstanceState) {
Intent intent = getIntent();
isMyBang = intent.getBooleanExtra("isMyBang", true);
categoryId = intent.getIntExtra("categoryId", 1);
tabTextViewList = new ArrayList<TextView>();
// 关闭预加载 :设置缓存fragment 的个数(实际有1个,缓存1个+正在显示的1个):好像然并卵
vpFragmentContainer.setOffscreenPageLimit(1);
fragmentPagerAdapter = new TabBangFragmentAdapter(super.getSupportFragmentManager(),
fragmentList = new ArrayList<Fragment>());
vpFragmentContainer.setAdapter(fragmentPagerAdapter);
// fragmentManager = getSupportFragmentManager();
requestAllTabAndBang();
}
private void initListener() {
ivSearch.setOnClickListener(this);
ivBack.setOnClickListener(this);
setClickToReloadListener(new Reload() {
@Override
public void OnReloadClick(View view) {// 点击重新加载
requestAllTabAndBang();
}
});
vpFragmentContainer.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
categoryId = allBangTabList.get(position).id;
startTabIndicatorAnim(position);
setSelectTabColor(tabTextViewList.get(position));
if (1 == categoryId && isJoinOrExitBang()) {// 我的帮:其他帮有加帮或退帮,则刷新我的帮页面
TabMyBangFragment myBangFragment = (TabMyBangFragment) fragmentList.get(position);
if (null != myBangFragment) {
myBangFragment.requesMyBang();
}
}
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.back_button:// 返回
finish();
break;
case R.id.ivRight:// 搜索
break;
default:
break;
}
}
/**
* tab点击监听
*/
public class MyOnClickListener implements View.OnClickListener {
private int tabIndex;// 当前选中的tabItem的索引
public MyOnClickListener(int tabIndex) {
this.tabIndex = tabIndex;
}
@Override
public void onClick(View v) {
if (tabIndex != currIndex) {
// viewpager 选中时,在监听器那执行游标动画
vpFragmentContainer.setCurrentItem(tabIndex);
}
}
};
/**
*
* @description 设置当前选中的tab颜色
* @author zhongwr
* @update 2015-11-3 下午9:08:31
*/
private void setSelectTabColor(TextView tvSelectedTab) {
if (null != tvCurrTab && null != tvSelectedTab) {
tvCurrTab.setTextColor(getResources().getColor(R.color.gray_7));
tvCurrTab = tvSelectedTab;
tvSelectedTab.setTextColor(getResources().getColor(R.color.red_1));
}
}
// 不结合viewpager,直接使用hide()、show()来切换,可以避免重新oncreateView
<span style="color:#ff0000;">//执行hide() show()方法时,会回调执行fragment中的onHiddenChanged()方法</span>
<span style="color:#ff0000;"> private void switchFragment(int tabIndex) {
FragmentTransaction transaction = fragmentManager.beginTransaction().setCustomAnimations(
android.R.anim.fade_in, android.R.anim.fade_out);
if (categoryId == 100) {//
if (null == myBangFragment) {
myBangFragment = (TabMyBangFragment) fragmentManager.findFragmentByTag(TAG_MY_BANG);
}
if (isJoinOrExitBang()) {// 退群或加群、重新加载首页clearJoinOrExitBang(); if (null != myBangFragment) {
fragmentManager.beginTransaction().remove(myBangFragment).commit(); myBangFragment = null; } }
// 如果加群或退群需要更新TabMyBangFragment ,则在TabMyBangFragment 的onHiddenChanged方法中,重新请求起的帮信息
if (null == myBangFragment) {
myBangFragment = TabMyBangFragment.newInstance(categoryId, false, null, null);
transaction.hide(currentFragment).add(R.id.fl_fragment_container, myBangFragment, TAG_MY_BANG).commit();
} else {
transaction.hide(currentFragment).show(myBangFragment).commit();
}
currentFragment = myBangFragment;
} else {
TabCategoryBangFragment currentTabFragment = (TabCategoryBangFragment) fragmentManager
.findFragmentByTag(TAG_NOT_MY_BANG + tabIndex);
if (null == currentTabFragment) {
currentTabFragment = TabCategoryBangFragment.newInstance(categoryId, false, null);
transaction.hide(currentFragment)
.add(R.id.fl_fragment_container, currentTabFragment, TAG_NOT_MY_BANG + tabIndex).commit();
} else {
transaction.hide(currentFragment).show(currentTabFragment).commit();
}
currentFragment = currentTabFragment;
}
}</span>
/**
* 被选中的tab的下标
*
* @author zhongwr
*/
private void startTabIndicatorAnim(int selectedTabIndex) {
int fromXDelta = offset * Math.abs(currIndex);
int toXDelta;
if (currIndex > selectedTabIndex) {// 点击左边标签
toXDelta = fromXDelta - offset * (currIndex - selectedTabIndex);
} else {// 点击右边标签
toXDelta = fromXDelta + offset * (selectedTabIndex - currIndex);
}
currIndex = selectedTabIndex;
Animation animation = new TranslateAnimation(fromXDelta, toXDelta, 0, 0);
animation.setFillAfter(true);// True:图片停在动画结束位置
animation.setDuration(300);
ivTabIndicator.startAnimation(animation);
}
/**
*
* @description 添加tab栏
* @author zhongwr
* @update 2015年9月1日 下午5:24:44
*/
@SuppressLint("ResourceAsColor")
private void addTabsAndFragments() {
if (!Tools.isListEmpty(allBangTabList)) {
llTabContainer.setVisibility(View.VISIBLE);
llTabContainer.removeAllViews();
int size = allBangTabList.size();
llTabContainer.setWeightSum(size);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(0,
ViewGroup.LayoutParams.WRAP_CONTENT, 1.0f);
// layoutParams.leftMargin = 100;
TextView tvTab = null;
BangCategoryInfo tabItem = null;
for (int i = 0; i < size; i++) {
tabItem = allBangTabList.get(i);
tvTab = createTabTextView(tabItem, layoutParams, i, size);
tvTab.setOnClickListener(new MyOnClickListener(tabItem.tabIndex));
tabTextViewList.add(tvTab);
if (categoryId == tabItem.id) {// 当前选中的
currIndex = tabItem.tabIndex;
tvCurrTab = tvTab;
tvTab.setTextColor(getResources().getColor(R.color.red_1));
if (tabItem.id == 1) {
fragmentList.add(TabMyBangFragment.newInstance(tabItem.id, true, myBangList, notMybangList));
} else {
fragmentList.add(TabCategoryBangFragment.newInstance(tabItem.id, true, notMybangList));
}
} else {
if (tabItem.id == 1) {
fragmentList.add(TabMyBangFragment.newInstance(tabItem.id, false, null, null));
} else {
fragmentList.add(TabCategoryBangFragment.newInstance(tabItem.id, false, null));
}
}
llTabContainer.addView(tvTab);
}
} else {
llTabContainer.setVisibility(View.GONE);
setReloadVisiable();
}
}
/**
*
* @description 创建分类的tab的textview
* @author zhongwr
* @update 2015年9月1日 下午5:31:05
*/
private TextView createTabTextView(BangCategoryInfo tabItem, LinearLayout.LayoutParams layoutParams, int position,
int size) {
TextView tvBangTab = new TextView(this);
tvBangTab.setText(tabItem.name);
tvBangTab.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13);
tvBangTab.setPadding(0, 17, 0, 17);
tvBangTab.setTextColor(getResources().getColor(R.color.gray_7));
// if (0 == position) {
// tvBangTab.setGravity(Gravity.LEFT);
// } else if (position == size - 1) {
// tvBangTab.setGravity(Gravity.RIGHT);
// } else {
tvBangTab.setGravity(Gravity.CENTER);
// }
if (null != layoutParams) {
tvBangTab.setLayoutParams(layoutParams);
}
return tvBangTab;
}
/**
*
* @author:zhongwr
* @Description :初始化tab游标所需参数
* @param :
* @return :void
*/
private void initTabIndicator() {
if (!Tools.isListEmpty(allBangTabList)) {
int screenW = Tools.getScreenSize(this).x;// 获取分辨率宽度
offset = screenW / allBangTabList.size();// 计算偏移量,每个item占据屏幕的宽度
Matrix matrix = new Matrix();
matrix.postTranslate(offset, 0);
ivTabIndicator.setImageMatrix(matrix);// 设置动画初始位置
ivTabIndicator.getLayoutParams().width = offset;
ivTabIndicator.setVisibility(View.VISIBLE);
if (!isMyBang) {// 如果不是bang,则选中的是这个下标
startTabIndicatorAnim(currIndex);
}
}
}
/***
*
* @Description : 请求帮类的第一页数据和所有tab的数据
* @author:zhongwr
* @param :
* @return :void
*/
private void requestAllTabAndBang() {
showLoadingDialog(mContext);
String url = null;
if (isMyBang) {// 请求数据
url = Define.host + Define.ALL_TAB_AND_MY_BANG;
executorService.execute(new LmbRequestRunabel(this, 1, url, null, this));
} else {
url = Define.host + Define.ALL_TAB_AND_CATEGORY_BANG;
LinkedHashMap<String, String> params = new LinkedHashMap<String, String>();
params.put("cid", categoryId + "");
params.put("mvc", "1");
executorService.execute(new LmbRequestRunabel(this, 2, url, params, this));
}
}
/**
* 请求开始时,执行
*/
@Override
public void onStart(int type) {
}
@Override
public void onFault(int type, String url, String result) {
dismissLoading(mContext);
setReloadVisiable();
}
@Override
public void onSuccess(int type, String url, Map<String, String> params, String result) {
try {
Type classOfT = new TypeToken<LmbRequestResult<AllBangItem>>() {
}.getType();
LmbRequestResult<AllBangItem> r = new Gson().fromJson(result, classOfT);
if ("0".equals(r.ret)) {// 成功
setclickToReloadGone();
parserALLBangResult(r);
addTabsAndFragments();
initTabIndicator();
fragmentPagerAdapter.notifyDataSetChanged();
vpFragmentContainer.setCurrentItem(currIndex);
} else {
}
setReloadVisiable();
} catch (JsonSyntaxException e) {
e.printStackTrace();
setReloadVisiable();
} catch (Exception e) {
e.printStackTrace();
setReloadVisiable();
} finally {
dismissLoading(mContext);
}
}
/**
*
* @description 解析返回成功的数据
* @author zhongwr
* @update 2015-10-31 下午2:59:14
*/
private void parserALLBangResult(LmbRequestResult<AllBangItem> r) throws Exception {
AllBangItem allBangTabItem = (AllBangItem) r.data;
if (null != allBangTabItem) {
myBangList = allBangTabItem.bang_list;// 如果不是b,则为null
notMybangList = allBangTabItem.bang;
BangCategoryContainerItem containerItem = allBangTabItem.bang_category;
if (null != containerItem) {
allBangTabList = containerItem.data;
categoryId = containerItem.curr;
if (null != allBangTabList && !allBangTabList.isEmpty()) {
int i = 0;
for (BangCategoryInfo categoryInfo : allBangTabList) {
categoryInfo.tabIndex = i;
if (containerItem.curr == categoryInfo.id) {//
currIndex = i;
}
i++;
}
}
}
}
}
private List<Integer> joinOrExitList;
/**
* 加b或者退出b成功
*/
@Override
public void joinOrExitBangOk(int bid) {
if (null == joinOrExitList) {
joinOrExitList = new ArrayList<Integer>();
}
if (joinOrExitList.contains(bid)) {// key已经存在
joinOrExitList.remove(bid);
} else {
joinOrExitList.add(bid);
}
}
/**
*
* @description 加帮或退帮操作:都要刷新我的帮
* @author zhongwr
* @update 2015-11-2 下午8:00:14
*/
protected boolean isJoinOrExitBang() {
if (!Tools.isListEmpty(joinOrExitList)) {
joinOrExitList.clear();// 清空加帮或退帮缓存数据
return true;
}
return false;
}
}
TabMyBangFragment extends TabBangBaseFragment优化如下:
TabMyBangFragment :
@Override
public View onCreateViewComplete(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (null == cacheFragmentView) {
View view = cacheFragmentView = inflater.inflate(R.layout.my_bang_fragment, null);
mActivity = getActivity();
initView(view);
initListener();
initData();
}
<pre name="code" class="java">// <span style="color:#ff0000;">当viewpager滑动的时候,很容易就执行OnDetach()把当前的fragment的view销毁,但是没销毁fragment及属性,所以可以通过cacheFragemntView来缓存加载过的view,///当要恢复时,直接使用,不过需要注意的是需要先销毁父布局中child,详见:onDestoryView()</span>
return cacheFragmentView; }/*@Override 基类已经执行了,不用再次执行public void onDestroyView() {// super.onDestroyView();ViewGroup parent = (ViewGroup) cacheFragmentView.getParent();if (null != parent) {// 必须先清除父布局中的child,否则会报错“当前父布局已经有了一个child,不能再添加”parent.removeAllViewsInLayout();}}*/
TabBangBaseFragment:
<span style="color:#333333;">private FrameLayout mViewContainer;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (null == mViewContainer) {
View view = inflater.inflate(R.layout.mam_base_main, null);
mViewContainer = (FrameLayout) view.findViewById(R.id.base_container);
}
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.MATCH_PARENT);
clickToReload = new ClickScreenToReload(getActivity());
clickToReload.setVisibility(View.GONE);
mViewContainer.addView(onCreateViewComplete(inflater, mViewContainer, savedInstanceState), lp);
mViewContainer.addView(clickToReload, lp);
return mViewContainer;
}
@Override
public void onDestroyView() {
super.onDestroyView();
ViewGroup parent = (ViewGroup) mViewContainer.getParent();
if (null != parent) {// 必须先清除父布局中的child,否则会报错“当前父布局已经有了一个child,不能再添加”
mViewContainer.removeAllViewsInLayout();
parent.removeView(mViewContainer);
}
}</span>