package org.aisen.android.ui.fragment;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.text.TextUtils;
import android.view.LayoutInflater;
import org.aisen.android.R;
import org.aisen.android.common.utils.ActivityHelper;
import org.aisen.android.common.utils.Logger;
import org.aisen.android.common.utils.SystemUtils;
import org.aisen.android.support.adapter.FragmentPagerAdapter;
import org.aisen.android.support.inject.ViewInject;
import org.aisen.android.ui.activity.basic.BaseActivity;
import org.aisen.android.ui.fragment.AStripTabsFragment.IStripTabInitData;
import org.aisen.android.ui.fragment.AStripTabsFragment.StripTabItem;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* Created by wangdan on 15-1-20.
*/
public abstract class ATabLayoutFragment<T extends StripTabItem> extends ABaseFragment
implements ViewPager.OnPageChangeListener {
static final String TAG = ATabLayoutFragment.class.getSimpleName();
public static final String SET_INDEX = "org.aisen.android.ui.SET_INDEX";// 默认选择第几个
@ViewInject(idStr = "tabLayout")
TabLayout tabLayout;
@ViewInject(idStr = "pager")
ViewPager viewPager;
MyViewPagerAdapter mViewPagerAdapter;
ArrayList<T> mItems;
Map<String, Fragment> fragments;
int mCurrentPosition = 0;
@Override
protected int inflateContentView() {
return R.layout.comm_ui_tablayout;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mCurrentPosition = viewPager.getCurrentItem();
outState.putSerializable("items", mItems);
outState.putInt("current", mCurrentPosition);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mItems = savedInstanceState == null ? generateTabs()
: (ArrayList<T>) savedInstanceState.getSerializable("items");
mCurrentPosition = savedInstanceState == null ? 0
: savedInstanceState.getInt("current");
}
@Override
protected void layoutInit(LayoutInflater inflater, final Bundle savedInstanceSate) {
super.layoutInit(inflater, savedInstanceSate);
setHasOptionsMenu(true);
if (delayGenerateTabs() == 0) {
setTab(savedInstanceSate);
}
else {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
setTab(savedInstanceSate);
}
}, delayGenerateTabs());
}
}
protected void setTab(final Bundle savedInstanceSate) {
if (getActivity() == null)
return;
if (savedInstanceSate == null) {
if (getArguments() != null && getArguments().containsKey(SET_INDEX)) {
mCurrentPosition = Integer.parseInt(getArguments().getSerializable(SET_INDEX).toString());
}
else {
if (configLastPositionKey() != null) {
// 记录了最后阅读的标签
String type = ActivityHelper.getShareData("PagerLastPosition" + configLastPositionKey(), "");
if (!TextUtils.isEmpty(type)) {
for (int i = 0; i < mItems.size(); i++) {
StripTabItem item = mItems.get(i);
if (item.getType().equals(type)) {
mCurrentPosition = i;
break;
}
}
}
}
}
}
Logger.w("strip-current-" + mCurrentPosition);
fragments = new HashMap<String, Fragment>();
if (mItems == null)
return;
for (int i = 0; i < mItems.size(); i++) {
Fragment fragment = getActivity().getFragmentManager().findFragmentByTag(makeFragmentName(i));
if (fragment != null) {
getActivity().getFragmentManager().beginTransaction()
.remove(fragment).commit();
}
// fragments.put(makeFragmentName(i), fragment);
}
mViewPagerAdapter = new MyViewPagerAdapter(getFragmentManager());
// viewPager.setOffscreenPageLimit(mViewPagerAdapter.getCount());
viewPager.setOffscreenPageLimit(0);
viewPager.setAdapter(mViewPagerAdapter);
if (mCurrentPosition >= mViewPagerAdapter.getCount())
mCurrentPosition = 0;
viewPager.addOnPageChangeListener(this);
viewPager.setCurrentItem(mCurrentPosition);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
tabLayout.setTabTextColors(Color.parseColor("#b3ffffff"), Color.WHITE);
tabLayout.setupWithViewPager(viewPager);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
tabLayout.setScrollPosition(mCurrentPosition, 0, true);
}
}, 150);
}
protected void destoryFragments() {
if (getActivity() != null) {
if (getActivity() instanceof BaseActivity) {
BaseActivity mainActivity = (BaseActivity) getActivity();
if (mainActivity.mIsDestoryed())
return;
}
try {
FragmentTransaction trs = getFragmentManager().beginTransaction();
Set<String> keySet = fragments.keySet();
for (String key : keySet) {
if (fragments.get(key) != null) {
trs.remove(fragments.get(key));
Logger.e("remove fragment , key = " + key);
}
}
trs.commit();
} catch (RuntimeException e) {
e.printStackTrace();
}
}
}
@Override
public void onPageScrolled(int i, float v, int i2) {
}
@Override
public void onPageSelected(int position) {
mCurrentPosition = position;
if (configLastPositionKey() != null) {
ActivityHelper.putShareData("PagerLastPosition" + configLastPositionKey(), mItems.get(position).getType());
}
// 查看是否需要拉取数据
Fragment fragment = getCurrentFragment();
if (fragment instanceof IStripTabInitData) {
((IStripTabInitData) fragment).onStripTabRequestData();
}
}
@Override
public void onPageScrollStateChanged(int i) {
}
protected String makeFragmentName(int position) {
return mItems.get(position).getTitle();
}
// 是否保留最后阅读的标签
protected String configLastPositionKey() {
return null;
}
abstract protected ArrayList<T> generateTabs();
abstract protected Fragment newFragment(T bean);
// 延迟一点初始化tabs,用于在首页切换菜单的时候,太多的tab页导致有点点卡顿
protected int delayGenerateTabs() {
return 0;
}
@Override
public void onDestroy() {
try {
destoryFragments();
viewPager.setAdapter(null);
mViewPagerAdapter = null;
} catch (Exception e) {
e.printStackTrace();
}
super.onDestroy();
}
public Fragment getCurrentFragment() {
if (mViewPagerAdapter == null || mViewPagerAdapter.getCount() < mCurrentPosition)
return null;
return fragments.get(makeFragmentName(mCurrentPosition));
}
public Fragment getFragment(String tabTitle) {
if (fragments == null || TextUtils.isEmpty(tabTitle))
return null;
for (int i = 0; i < mItems.size(); i++) {
if (tabTitle.equals(mItems.get(i).getTitle())) {
return fragments.get(makeFragmentName(i));
}
}
return null;
}
public Map<String, Fragment> getFragments() {
return fragments;
}
public ViewPager getViewPager() {
return viewPager;
}
public TabLayout getTabLayout() {
return tabLayout;
}
class MyViewPagerAdapter extends FragmentPagerAdapter {
public MyViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Fragment fragment = fragments.get(makeFragmentName(position));
if (fragment == null) {
fragment = newFragment(mItems.get(position));
fragments.put(makeFragmentName(position), fragment);
}
return fragment;
}
@Override
protected void freshUI(Fragment fragment) {
}
@Override
public int getCount() {
return mItems.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mItems.get(position).getTitle();
}
@Override
protected String makeFragmentName(int position) {
return ATabLayoutFragment.this.makeFragmentName(position);
}
}
}