Java 处理具有多个场景的TabLayout
我正在使用Java 处理具有多个场景的TabLayout,java,android,android-viewpager,android-tablayout,fragmentstatepageradapter,Java,Android,Android Viewpager,Android Tablayout,Fragmentstatepageradapter,我正在使用TabLayout+ViewPager来显示一些选项卡。根据服务器响应,我想创建两种可能的方案:第一种方案有三个选项卡,第二种方案只有两个,“删除”位置0中的选项卡 由于我正在“删除”第一个选项卡,所有依赖位置来执行与特定片段相关的任何操作的方法都会过时,并且可能会失败instanceof检查 例如,这是FragmentStatePagerAdapter中的getItem,目前不处理第二种场景: @Override public Fragment getItem(int positio
TabLayout
+ViewPager
来显示一些选项卡。根据服务器响应,我想创建两种可能的方案:第一种方案有三个选项卡,第二种方案只有两个,“删除”位置0中的选项卡
由于我正在“删除”第一个选项卡,所有依赖位置来执行与特定片段相关的任何操作的方法都会过时,并且可能会失败instanceof
检查
例如,这是FragmentStatePagerAdapter
中的getItem
,目前不处理第二种场景:
@Override
public Fragment getItem(int position) {
AbstractFragment fragment;
switch (position) {
case 0:
fragment = new MainFragment();
break;
case 1:
fragment = new MessagesFragment();
break;
case 2:
fragment = new SearchFragment();
break;
default:
return null;
}
return fragment;
}
MainActivity
中的侦听器示例(在第二种情况下,检查将失败):
我唯一的想法是检查
MainActivity
和getItem
中每个侦听器中的服务器响应(即是否有两个或三个选项卡),我认为这是一个糟糕的解决方案。有没有更好的方法来处理这个问题?因为只有很少的选项卡,一个好方法是列出要显示的片段:
List<AbstractFragment> fragments = new ArrayList<>();
if (showFirstTab) {
fragments.add(new MainFragment());
}
fragments.add(new MessagesFragment());
fragments.add(new SearchFragment());
当您需要获取特定片段时,您可以获取片段
列表,并在其上迭代测试实例
如果有帮助,请告诉我。您可以使用自定义片段寻呼机适配器按位置获取片段
public abstract class FragmentPagerAdapter extends PagerAdapter {
private static final String TAG = "FragmentPagerAdapter";
private static final boolean DEBUG = false;
private final FragmentManager mFragmentManager;
private FragmentTransaction mCurTransaction = null;
private Fragment mCurrentPrimaryItem = null;
private String mAdapterClassName;
protected FragmentPagerAdapter(FragmentManager fm, String adapterClassName) {
mFragmentManager = fm;
mAdapterClassName = adapterClassName;
}
/**
* Return the Fragment associated with a specified position.
*/
protected abstract Fragment getItem(int position);
@Override
public void startUpdate(ViewGroup container) {
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
// Do we already have this fragment?
String name = makeFragmentTag(position);
Fragment fragment = mFragmentManager.findFragmentByTag(name);
if (fragment != null) {
mCurTransaction.attach(fragment);
} else {
fragment = getItem(position);
mCurTransaction.add(container.getId(), fragment,
makeFragmentTag(position));
}
if (fragment != mCurrentPrimaryItem) {
fragment.setMenuVisibility(false);
fragment.setUserVisibleHint(false);
}
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
mCurTransaction.detach((Fragment) object);
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
Fragment fragment = (Fragment) object;
if (fragment != mCurrentPrimaryItem) {
if (mCurrentPrimaryItem != null) {
mCurrentPrimaryItem.setMenuVisibility(false);
mCurrentPrimaryItem.setUserVisibleHint(false);
}
if (fragment != null) {
fragment.setMenuVisibility(true);
fragment.setUserVisibleHint(true);
}
mCurrentPrimaryItem = fragment;
}
}
@Override
public void finishUpdate(ViewGroup container) {
if (mCurTransaction != null) {
mCurTransaction.commitAllowingStateLoss();
mCurTransaction = null;
mFragmentManager.executePendingTransactions();
}
}
@Override
public boolean isViewFromObject(View view, Object object) {
return ((Fragment) object).getView() == view;
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void restoreState(Parcelable state, ClassLoader loader) {
}
/**
* Return a unique identifier for the item at the given position.
* <p/>
* <p>The default implementation returns the given position.
* Subclasses should override this method if the positions of items can change.</p>
*
* @param position Position within this adapter
* @return Unique identifier for the item at position
*/
private long getItemId(int position) {
return position;
}
public String makeFragmentTag(int position) {
return "purplle:switcher:" + mAdapterClassName + ":" + position;
}
public static String makeFragmentTag(int position,String adapterClassName) {
return "purplle:switcher:" + adapterClassName + ":" + position;
}
}
@这解决了你的问题吗?如果是,请接受答案
@Override
public Fragment getItem(int position) {
if (fragments.size() > position) {
return fragments.get(position);
}
return null;
}
public abstract class FragmentPagerAdapter extends PagerAdapter {
private static final String TAG = "FragmentPagerAdapter";
private static final boolean DEBUG = false;
private final FragmentManager mFragmentManager;
private FragmentTransaction mCurTransaction = null;
private Fragment mCurrentPrimaryItem = null;
private String mAdapterClassName;
protected FragmentPagerAdapter(FragmentManager fm, String adapterClassName) {
mFragmentManager = fm;
mAdapterClassName = adapterClassName;
}
/**
* Return the Fragment associated with a specified position.
*/
protected abstract Fragment getItem(int position);
@Override
public void startUpdate(ViewGroup container) {
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
// Do we already have this fragment?
String name = makeFragmentTag(position);
Fragment fragment = mFragmentManager.findFragmentByTag(name);
if (fragment != null) {
mCurTransaction.attach(fragment);
} else {
fragment = getItem(position);
mCurTransaction.add(container.getId(), fragment,
makeFragmentTag(position));
}
if (fragment != mCurrentPrimaryItem) {
fragment.setMenuVisibility(false);
fragment.setUserVisibleHint(false);
}
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
mCurTransaction.detach((Fragment) object);
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
Fragment fragment = (Fragment) object;
if (fragment != mCurrentPrimaryItem) {
if (mCurrentPrimaryItem != null) {
mCurrentPrimaryItem.setMenuVisibility(false);
mCurrentPrimaryItem.setUserVisibleHint(false);
}
if (fragment != null) {
fragment.setMenuVisibility(true);
fragment.setUserVisibleHint(true);
}
mCurrentPrimaryItem = fragment;
}
}
@Override
public void finishUpdate(ViewGroup container) {
if (mCurTransaction != null) {
mCurTransaction.commitAllowingStateLoss();
mCurTransaction = null;
mFragmentManager.executePendingTransactions();
}
}
@Override
public boolean isViewFromObject(View view, Object object) {
return ((Fragment) object).getView() == view;
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void restoreState(Parcelable state, ClassLoader loader) {
}
/**
* Return a unique identifier for the item at the given position.
* <p/>
* <p>The default implementation returns the given position.
* Subclasses should override this method if the positions of items can change.</p>
*
* @param position Position within this adapter
* @return Unique identifier for the item at position
*/
private long getItemId(int position) {
return position;
}
public String makeFragmentTag(int position) {
return "purplle:switcher:" + mAdapterClassName + ":" + position;
}
public static String makeFragmentTag(int position,String adapterClassName) {
return "purplle:switcher:" + adapterClassName + ":" + position;
}
}
getSupportFragmentManager().findFragmentByTag(mPagerAdapter.makeFragmentTag(0) //Postion of fragment to access