从 Activity 调用选项卡式片段方法
Call Tabbed Fragment method from Activity
我有一个 activity 由三个片段组成。这些片段使用使用 PagerAdapter 的操作栏选项卡。我想要做的是从主 activity 访问活动选项卡式片段中的方法。我已经尝试了下面的代码,但这只是 returns 片段为空,所以我猜它无法在选项卡中找到它!
NPListFragment articleFrag = (NPListFragment) getSupportFragmentManager().findFragmentByTag("NP");
articleFrag.refreshT();
寻呼机适配器:
public class AppSectionsPagerAdapter extends FragmentPagerAdapter {
public AppSectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
switch (i) {
case 0:
return new NPListFragment();
case 1:
return new PListFragment();
case 2:
return new FavouritesFragment();
}
return null;
}
@Override
public int getCount() {
return 3;
}
}
谁能建议?我已经在这上面花了大约 6 个小时,我只是没有在解决这个问题上取得任何进展。
您应该做的是:每个片段只创建一次,然后为所有对 getItem 方法的调用提供它。
例如:
public class AppSectionsPagerAdapter extends FragmentPagerAdapter {
Fragment one, two, three;
public AppSectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
switch (i) {
case 0:
if(one == null)
one = new NPListFragment();
return one;
case 1:
if(two == null)
two= new PListFragment();
return two;
case 2:
if(three == null)
three= new FavouritesFragment();
return three;
}
return null;
}
@Override
public int getCount() {
return 3;
}
}
现在,即使您在 activity 中也可以调用 getItem
如果你想调用特定的方法,你只需要将它转换为真正的片段class。
int pos = viewpager.getCurrentItem();
Fragment activeFragment = adapter.getItem(pos);
if(pos == 0)
((NPListFragment)activeFragment).refreshT();
...
您需要在填充时注册您的片段,然后从外部访问它们。
public class AppSectionsPagerAdapter extends FragmentPagerAdapter {
private SparseArray<Fragment> registeredFragments = new SparseArray<>();
public AppSectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
switch (i) {
case 0:
return new NPListFragment();
case 1:
return new PListFragment();
case 2:
return new FavouritesFragment();
}
return null;
}
@Override
public int getCount() {
return 3;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
registeredFragments.put(position, fragment);
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
registeredFragments.remove(position);
super.destroyItem(container, position, object);
}
public Fragment getRegisteredFragment(int position) {
return registeredFragments.get(position);
}
现在可以从外部获取registeredFragments了
int pos = viewpager.getCurrentItem();
Fragment fragment = adapter.getRegisteredFragment(pos);
switch (pos) {
case 0: {
((NPListFragment) fragment).refreshT();
break;
}
case 1: {
((PListFragment) fragment).refreshK();
break;
}
case 2: {
((FavouritesFragment) fragment).refreshL();
break;
}
}
我解决了这个问题。
这是因为 Adapter 在每次调用 get item 时都会初始化一个新的 Fragment。
要解决这个问题,您需要在 onCreate
方法
中创建一个 Required Fragment 数组
Fragment[] FragmentArray;
FragmentArray = new Fragment[] {new Fragment 1,new Fragment 2...}; // all fragment goes in array
...
get item(int position)
...
return FragmentArray[position]
...
Fragment1 f= (Fragment1) FragmentArray[0];
f.refresh() // call required function
我使用片段管理器来获取片段。我的片段在 ViewPagerAdapter.class -
中的视图寻呼机中初始化,如下所示
@Override
public Fragment getItem(int i) {
Fragment fragment = null;
switch (i) {
case 0:
fragment = Fragment.instantiate(mContext, Fragment1.class.getName());
break;
case 1:
fragment = Fragment.instantiate(mContext, Fragment2.class.getName());
break;
case 2:
fragment = Fragment.instantiate(mContext, Fragment3.class.getName());
break;
}
return fragment;
}
然后在MainActivity中-
List<Fragment> fragments = getSupportFragmentManager().getFragments();
if (fragments != null) {
for (Fragment fragment : fragments) {
if (fragment instanceof Fragment1) {
((Fragment1) fragment).fragmentOne();
break;
}
}
}
我有一个 activity 由三个片段组成。这些片段使用使用 PagerAdapter 的操作栏选项卡。我想要做的是从主 activity 访问活动选项卡式片段中的方法。我已经尝试了下面的代码,但这只是 returns 片段为空,所以我猜它无法在选项卡中找到它!
NPListFragment articleFrag = (NPListFragment) getSupportFragmentManager().findFragmentByTag("NP");
articleFrag.refreshT();
寻呼机适配器:
public class AppSectionsPagerAdapter extends FragmentPagerAdapter {
public AppSectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
switch (i) {
case 0:
return new NPListFragment();
case 1:
return new PListFragment();
case 2:
return new FavouritesFragment();
}
return null;
}
@Override
public int getCount() {
return 3;
}
} 谁能建议?我已经在这上面花了大约 6 个小时,我只是没有在解决这个问题上取得任何进展。
您应该做的是:每个片段只创建一次,然后为所有对 getItem 方法的调用提供它。
例如:
public class AppSectionsPagerAdapter extends FragmentPagerAdapter {
Fragment one, two, three;
public AppSectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
switch (i) {
case 0:
if(one == null)
one = new NPListFragment();
return one;
case 1:
if(two == null)
two= new PListFragment();
return two;
case 2:
if(three == null)
three= new FavouritesFragment();
return three;
}
return null;
}
@Override
public int getCount() {
return 3;
}
}
现在,即使您在 activity 中也可以调用 getItem
如果你想调用特定的方法,你只需要将它转换为真正的片段class。
int pos = viewpager.getCurrentItem();
Fragment activeFragment = adapter.getItem(pos);
if(pos == 0)
((NPListFragment)activeFragment).refreshT();
...
您需要在填充时注册您的片段,然后从外部访问它们。
public class AppSectionsPagerAdapter extends FragmentPagerAdapter {
private SparseArray<Fragment> registeredFragments = new SparseArray<>();
public AppSectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
switch (i) {
case 0:
return new NPListFragment();
case 1:
return new PListFragment();
case 2:
return new FavouritesFragment();
}
return null;
}
@Override
public int getCount() {
return 3;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
registeredFragments.put(position, fragment);
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
registeredFragments.remove(position);
super.destroyItem(container, position, object);
}
public Fragment getRegisteredFragment(int position) {
return registeredFragments.get(position);
}
现在可以从外部获取registeredFragments了
int pos = viewpager.getCurrentItem();
Fragment fragment = adapter.getRegisteredFragment(pos);
switch (pos) {
case 0: {
((NPListFragment) fragment).refreshT();
break;
}
case 1: {
((PListFragment) fragment).refreshK();
break;
}
case 2: {
((FavouritesFragment) fragment).refreshL();
break;
}
}
我解决了这个问题。
这是因为 Adapter 在每次调用 get item 时都会初始化一个新的 Fragment。
要解决这个问题,您需要在 onCreate
方法
Fragment[] FragmentArray;
FragmentArray = new Fragment[] {new Fragment 1,new Fragment 2...}; // all fragment goes in array
...
get item(int position)
...
return FragmentArray[position]
...
Fragment1 f= (Fragment1) FragmentArray[0];
f.refresh() // call required function
我使用片段管理器来获取片段。我的片段在 ViewPagerAdapter.class -
中的视图寻呼机中初始化,如下所示@Override
public Fragment getItem(int i) {
Fragment fragment = null;
switch (i) {
case 0:
fragment = Fragment.instantiate(mContext, Fragment1.class.getName());
break;
case 1:
fragment = Fragment.instantiate(mContext, Fragment2.class.getName());
break;
case 2:
fragment = Fragment.instantiate(mContext, Fragment3.class.getName());
break;
}
return fragment;
}
然后在MainActivity中-
List<Fragment> fragments = getSupportFragmentManager().getFragments();
if (fragments != null) {
for (Fragment fragment : fragments) {
if (fragment instanceof Fragment1) {
((Fragment1) fragment).fragmentOne();
break;
}
}
}