android 在 fragmentpager 中禁用片段 0
android disable fragment 0 in fragmentpager
我希望能够在满足某些条件时不允许切换到自定义 FragmentPagerAdapter 中的 3 个片段之一。不幸的是我没有找到任何帮助。
我宁愿不删除并重新添加片段(第 0 项),因为此条件可以随时在 FragmentActivity 内更改,并且我需要片段能够接收和处理消息。
有什么建议吗?有什么不明白的请追问。
编辑:分享一些代码
主要activity:
@Override
protected void onResume() {
super.onResume();
...
_sectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager(), this, cardnumber, pin);
_viewPager = (ViewPager) findViewById(R.id.pager);
_viewPager.setAdapter(_sectionsPagerAdapter);
_viewPager.setOnPageChangeListener(_sectionsPagerAdapter);
_viewPager.setCurrentItem(1);
_viewPager.setOffscreenPageLimit(2);
这看起来有点粗鲁,但确实有效
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
Bundle args = new Bundle();
switch (position) {
case CUSTOMER_DETAILS_PAGE:
// fragment = _fragments.get(TRLIST_PAGE);
fragment = new UserDetailFragment();
args.putString("TAG", "details");
break;
case BALANCE_PAGE:
// fragment = _fragments.get(BALANCE_PAGE);
fragment = new BalanceFragment();
args.putString("TAG", "balance");
break;
case TRLIST_PAGE:
// fragment = _fragments.get(TRLIST_PAGE);
fragment = new TrListFragment();
args.putString("TAG", "trlist");
break;
default:
break;
}
_listeners.put(position, (MyTabSelectedListener) fragment);
// fragment = (Fragment) _listeners.get(position);
args.putString("cardnumber", _cardnumber);
args.putString("pin", _pin);
fragment.setArguments(args);
return fragment;
}
我想限制对 CUSTOMER_DETAILS_PAGE 的访问,因为无论如何它都是空的。
在阅读了 corsair992-s 的回答后 and looking at the CWAC-Pager source code here https://github.com/commonsguy/cwac-pager 我设法找到了我要找的东西。
关键是更改 getItemPosition
函数(我以前甚至没有使用过)来获取 TAG 参数(在 getItem
中设置) 从碎片中识别它们:
@Override
public int getItemPosition(Object item) {
Fragment fragment = (Fragment) item;
String title = fragment.getArguments().getString("TAG");
int position = tabs.indexOf(title);
if (position >= 0) {
return position;
} else {
return POSITION_NONE;
}
首先我为每个选项卡定义标签和一个列表以按出现顺序保存它们:
public static final String CUSTOMER_DETAILS_PAGE = "detail";
public static final String BALANCE_PAGE = "balance";
public static final String TRLIST_PAGE = "trlist";
List<String> tabs = new ArrayList<String>();
之后,我将它们按原来的顺序添加到构造函数中:
tabs.add(CUSTOMER_DETAILS_PAGE);
tabs.add(BALANCE_PAGE);
tabs.add(TRLIST_PAGE);
当我需要隐藏一个选项卡时,我只是将它从列表中删除并通知适配器:
public void disableUserDetail() {
tabs.remove(tabs.indexOf(CUSTOMER_DETAILS_PAGE));
notifyDataSetChanged();
}
我的片段专门去左边(开头),但很容易改变:
public void enableUserDetail() {
tabs.add(0, CUSTOMER_DETAILS_PAGE);
notifyDataSetChanged();
}
我不得不更改 getItem
和 getPageTitle
以使用选项卡列表和 TAG 常量作为标识符(我还包括 arguments for getItemPosition
):
@Override
public Fragment getItem(int position) {
String id = tabs.get(position);
Fragment fragment = null;
Bundle args = new Bundle();
if (id.equals(CUSTOMER_DETAILS_PAGE)) {
fragment = new UserDetailFragment();
args.putString("TAG", CUSTOMER_DETAILS_PAGE);
...
@Override
public CharSequence getPageTitle(int position) {
Locale l = Locale.getDefault();
String id = tabs.get(position);
if (id.equals(CUSTOMER_DETAILS_PAGE)) {
return _ctx.getString(R.string.title_section1).toUpperCase(l);
...
我希望能够在满足某些条件时不允许切换到自定义 FragmentPagerAdapter 中的 3 个片段之一。不幸的是我没有找到任何帮助。
我宁愿不删除并重新添加片段(第 0 项),因为此条件可以随时在 FragmentActivity 内更改,并且我需要片段能够接收和处理消息。
有什么建议吗?有什么不明白的请追问。
编辑:分享一些代码
主要activity:
@Override
protected void onResume() {
super.onResume();
...
_sectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager(), this, cardnumber, pin);
_viewPager = (ViewPager) findViewById(R.id.pager);
_viewPager.setAdapter(_sectionsPagerAdapter);
_viewPager.setOnPageChangeListener(_sectionsPagerAdapter);
_viewPager.setCurrentItem(1);
_viewPager.setOffscreenPageLimit(2);
这看起来有点粗鲁,但确实有效
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
Bundle args = new Bundle();
switch (position) {
case CUSTOMER_DETAILS_PAGE:
// fragment = _fragments.get(TRLIST_PAGE);
fragment = new UserDetailFragment();
args.putString("TAG", "details");
break;
case BALANCE_PAGE:
// fragment = _fragments.get(BALANCE_PAGE);
fragment = new BalanceFragment();
args.putString("TAG", "balance");
break;
case TRLIST_PAGE:
// fragment = _fragments.get(TRLIST_PAGE);
fragment = new TrListFragment();
args.putString("TAG", "trlist");
break;
default:
break;
}
_listeners.put(position, (MyTabSelectedListener) fragment);
// fragment = (Fragment) _listeners.get(position);
args.putString("cardnumber", _cardnumber);
args.putString("pin", _pin);
fragment.setArguments(args);
return fragment;
}
我想限制对 CUSTOMER_DETAILS_PAGE 的访问,因为无论如何它都是空的。
在阅读了 corsair992-s 的回答后 and looking at the CWAC-Pager source code here https://github.com/commonsguy/cwac-pager 我设法找到了我要找的东西。
关键是更改 getItemPosition
函数(我以前甚至没有使用过)来获取 TAG 参数(在 getItem
中设置) 从碎片中识别它们:
@Override
public int getItemPosition(Object item) {
Fragment fragment = (Fragment) item;
String title = fragment.getArguments().getString("TAG");
int position = tabs.indexOf(title);
if (position >= 0) {
return position;
} else {
return POSITION_NONE;
}
首先我为每个选项卡定义标签和一个列表以按出现顺序保存它们:
public static final String CUSTOMER_DETAILS_PAGE = "detail";
public static final String BALANCE_PAGE = "balance";
public static final String TRLIST_PAGE = "trlist";
List<String> tabs = new ArrayList<String>();
之后,我将它们按原来的顺序添加到构造函数中:
tabs.add(CUSTOMER_DETAILS_PAGE);
tabs.add(BALANCE_PAGE);
tabs.add(TRLIST_PAGE);
当我需要隐藏一个选项卡时,我只是将它从列表中删除并通知适配器:
public void disableUserDetail() {
tabs.remove(tabs.indexOf(CUSTOMER_DETAILS_PAGE));
notifyDataSetChanged();
}
我的片段专门去左边(开头),但很容易改变:
public void enableUserDetail() {
tabs.add(0, CUSTOMER_DETAILS_PAGE);
notifyDataSetChanged();
}
我不得不更改 getItem
和 getPageTitle
以使用选项卡列表和 TAG 常量作为标识符(我还包括 arguments for getItemPosition
):
@Override
public Fragment getItem(int position) {
String id = tabs.get(position);
Fragment fragment = null;
Bundle args = new Bundle();
if (id.equals(CUSTOMER_DETAILS_PAGE)) {
fragment = new UserDetailFragment();
args.putString("TAG", CUSTOMER_DETAILS_PAGE);
...
@Override
public CharSequence getPageTitle(int position) {
Locale l = Locale.getDefault();
String id = tabs.get(position);
if (id.equals(CUSTOMER_DETAILS_PAGE)) {
return _ctx.getString(R.string.title_section1).toUpperCase(l);
...