如图是一个很常见的界面:
我们在一个Activity顶部放了一个SlidingTabLayout 底下是一个ViewPager用于切换对应的Fragment,比如我们需要一个新建联系人的按钮,最简单的做法是Fragment里面的列表下直接放一个按钮,但是如果我们的代码已经高度封装了,并且已经多处引用,我们不可能在封装里面去写,或者直接再换一个加底部按钮的再封装一次。其实最好的办法是直接在这个Activity底部去加一个按钮,然后判断当前具体在哪个Fragment里,我们最先想到的自然是instanceof这个关键字,用于判断当前属于哪个Fragment,但是FragmentPagerAdapter也没有类似getCurrentFragment这种可以直接用于判断的方法啊。
这里介绍一个方法,FragmentPagerAdapter这个类对应的一个方法setPrimaryItem(ViewGroup container, int position, Object object)可以满足我们当前的需求。
public class ViewPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragments;
private List<String> mTabs;
private Fragment mCurrentFragment;
public ViewPagerAdapter(FragmentManager fm, List<Fragment> fragments, List<String> tabs) {
super(fm);
this.fragments = fragments;
this.mTabs = tabs;
}
@Override
public CharSequence getPageTitle(int position) {
return mTabs.get(position);
}
@Override
public int getCount() {
if (fragments != null) {
return fragments.size();
} else {
return 0;
}
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getItemPosition(Object object) {
return super.getItemPosition(object);
}
//用于区分具体属于哪个fragment
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
mCurrentFragment = (Fragment) object;
super.setPrimaryItem(container, position, object);
}
public Fragment getCurrentFragment() {
return mCurrentFragment;
}
}
而我们要做的就是在对应的Activity里去调用这个getCurrentFragment()结合instanceof去做判断就可以了。
/**
* 地址管理
*/
public class AddressManagerActivity extends BaseActivity {
@BindView(R.id.tablayout)
SlidingTabLayout mTablayout;
@BindView(R.id.viewpager)
ViewPager mViewpager;
@BindView(R.id.tv_contacts)
TextView contacts; //新建联系人
private ViewPagerAdapter mAdapter;
@Override
protected void getBundleExtras(Intent intent) {
}
@Override
protected View getLoadingTargetView() {
return null;
}
@Override
protected int getContentViewLayoutId() {
return R.layout.activity_address_manager;
}
@Override
protected void initViewAndData() {
setToolBarTitle(getString(R.string.address));
List<Fragment> fragments = new ArrayList<>();
fragments.add(new RecipientFragment());
fragments.add(new ConsignorFragment());
List<String> tabs = new ArrayList<>();
tabs.add(getString(R.string.recipient));
tabs.add(getString(R.string.consignor));
mAdapter = new ViewPagerAdapter(getSupportFragmentManager(), fragments, tabs);
mViewpager.setAdapter(mAdapter);
mTablayout.setViewPager(mViewpager);
}
@OnClick({R.id.tv_contacts})
void click(View view) {
Intent intent = null;
switch (view.getId()) {
case R.id.tv_contacts:
if (mAdapter.getCurrentFragment() instanceof RecipientFragment) {
intent = new Intent(this, BuildRecipientActivity.class);
startActivity(intent);
} else {
intent = new Intent(this, BuildConsignorActivity.class);
startActivity(intent);
}
break;
}
}
}
RecipientFragment是收件人列表,因为这里仅有两个Fragment所以就直接用else做判断,如果超过两个就要分开判断了。