我目前正在使用具有“swipey-tabs”并使用以下 PagerAdapter 的应用程序:
public class TabsPagerAdapter extends FragmentPagerAdapter {
public TabsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int index) {
switch (index) {
case 0:
return new HomeFragment();
case 1:
return new ListFragment();
case 2:
return new ChartFragment();
}
return null;
}
@Override
public int getCount() {
return 3;
}
}
我正在使用以下代码与主要 Activity 中的一个 fragment 进行通信:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 1)
{
if (resultCode == Activity.RESULT_OK)
{
String className = data.getExtras().getString("class_name");
if (className.trim().length() > 0) {
HomeFragment homeFrag = (HomeFragment) getSupportFragmentManager().findFragmentById(R.id.home_fragment);
if(homeFrag != null) {
Log.d("MainActivity", "homeFrag is not null");
homeFrag.newClass(className);
}else{
Log.d("MainActivity", "homeFrag is null");
HomeFragment newFragment = new HomeFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.home_fragment, newFragment);
transaction.commit();
newFragment.newClass(className);
}
addSubjectToDataBase(className);
}
}
}
}
我的问题是,当我尝试与主要 Activity 的 fragment 通信时,我似乎同时存在多个 fragment 。当我改变屏幕的方向或重新启动 Activity 时,我得到了 fragment 的修改版本,但是当我来回滑动以查看 fragment 时,我得到了 fragment 的旧的、未修改的版本。 fragment 管理器似乎没有注册适配器创建的 fragment ,因为虽然我知道 fragment 已经创建,但 fragment 管理器总是返回一个空的主 fragment 。
我应该如何避免这个问题,与主要 Activity 的 fragment 通信的最佳方式是什么?
最佳答案
看完this post我为自己的问题制定了解决方案。问题在于,由于 FragmentPagerAdapter
管理自己的 fragment ,因此我尝试访问的 fragment 与 View 寻呼机使用的 fragment 不同。
我通过修改我的 PagerAdapter
找到了一种访问 View 寻呼机使用的 fragment 标签的方法:
public class TabsPagerAdapter extends FragmentPagerAdapter {
protected String homeTag;
protected String listTag;
protected String chartTag;
public TabsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int index) {
switch (index) {
case 0:
Log.d("Adapter", "returning new homeFragment");
return new HomeFragment();
case 1:
return new ListFragment();
case 2:
return new ChartFragment();
}
return null;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
switch (position){
case 0:
homeTag = createdFragment.getTag();
break;
case 1:
listTag = createdFragment.getTag();
break;
case 2:
chartTag = createdFragment.getTag();
break;
}
return createdFragment;
}
public String getHomeTag(){
return homeTag;
}
public String getListTag(){
return listTag;
}
public String getChartTag(){
return chartTag;
}
@Override
public int getCount() {
return 3;
}
}
然后,在我访问了正确的 fragment 标签后,修改我的代码以访问正确的 fragment 是一件简单的事情:
HomeFragment homeFrag = (HomeFragment) getSupportFragmentManager().findFragmentByTag(mAdapter.getHomeTag());
if(homeFrag != null) {
Log.d("MainActivity", "homeFrag is not null");
homeFrag.newClass(className);
}else{
Log.d("MainActivity", "homeFrag is null");
HomeFragment newFragment = new HomeFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.pager, newFragment, madapter.get);
transaction.commit();
newFragment.newClass(className);
关于android - 使用viewpager时如何与fragment通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31499164/