我目前正在使用具有“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;
}
}
我正在使用以下代码与主要活动中的一个片段进行通信:
@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);
}
}
}
}
我的问题是,当我尝试与主要活动中的片段进行通信时,我似乎同时存在多个片段。当我改变屏幕的方向或重新启动活动时,我得到了片段的修改版本,但是当我来回扫描以查看片段时,我得到片段的旧的,未修改的版本。片段管理器似乎没有注册适配器创建的片段,因为虽然我知道片段已经创建,但片段管理器总是返回一个空的home片段。
我应该如何避免这个问题,与主要活动中的片段进行通信的最佳方式是什么?
答案 0 :(得分:1)
阅读this post后,我找到了解决自己问题的方法。问题是,由于FragmentPagerAdapter
管理自己的片段,我尝试访问的片段与视图寻呼机使用的片段不同。
我通过修改我的修改PagerAdapter
来找到一种访问视图寻呼机使用的片段标签的方法:
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;
}
}
然后,在我访问正确的片段标记后,修改我的代码以访问正确的片段是一件简单的事情:
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);
答案 1 :(得分:0)
这不优雅,但我会做这样的事情(也许有人会发布更好的解决方案):
在单身人士中,我会放一个片段数组:
public static Fragment[] sShownFragments = new Fragment[3];
然后在getItem()
方法中:
if(SingletonClass.sShownFragments[index]!=null){
return mFragments[index];
}
switch (index) {
case 0:
SingletonClass.sShownFragments[index] = new HomeFragment();
break;
case 1:
SingletonClass.sShownFragments[index] = new ListFragment();
case 2:
SingletonClass.sShownFragments[index] = new ChartFragment();
default:
SingletonClass.sShownFragments[index] = new Fragment();
}
return SingletonClass.sShownFragments[index];
然后在getCount()
:
返回SingletonClass.sShownFragments.length();
现在在onActivityResult()
:
\\some code ...
((HomeFragment)SingletonClass.sShownFragments[0]).newClass(className);
\\ some other code...