我在Android中玩碎片。
我知道我可以通过使用以下代码更改一个片段:
FragmentManager fragMgr = getSupportFragmentManager();
FragmentTransaction fragTrans = fragMgr.beginTransaction();
MyFragment myFragment = new MyFragment(); //my custom fragment
fragTrans.replace(android.R.id.content, myFragment);
fragTrans.addToBackStack(null);
fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
fragTrans.commit();
我的问题是,在Java文件中,如何获得当前显示的片段实例?
我认为你们想知道u在哪个片段中
我想有一个解决办法,但我认为它不是最好的
但这是可行的
首先
你应该创建你的父片段,它扩展fragment
public class Fragment2 extends Fragment {
private static position;
public static int getPosition() {
return position;
}
public static void setPosition(int position) {
FragmentSecondParent.position = position;
}
}
第二个
你应该在每个片段和每次写入onCreateView中扩展它
setPosition(//your fragmentposition here)
第三
你想在哪里得到当前的片段,你应该
写这篇文章
Fragment2 fragment= (Fragment2) getSupportFragmentManager()
.findFragmentById(R.id.fragment_status);
int position = fragment.getPosition();
if(//position condition)
{
//your code here
}
我发现findFragmentByTag不是那么方便。如果你在你的Activity或父Fragment中有字符串currentFragmentTag,你需要将它保存在onSaveInstanceState中并在onCreate中恢复。即使你这样做,当Activity重新创建时,onAttachFragment将在onCreate之前调用,所以你不能在onAttachFragment中使用currentFragmentTag(例如。更新一些基于currentFragmentTag的视图),因为它可能还没有恢复。
我使用以下代码:
Fragment getCurrentFragment() {
List<Fragment> fragments = getSupportFragmentManager().getFragments();
if(fragments.isEmpty()) {
return null;
}
return fragments.get(fragments.size()-1);
}
FragmentManager的文档中指出
列表中片段的顺序是它们被添加或附加的顺序。
当你需要做基于当前片段类型的事情时,只需使用MyFragment的getCurrentFragment()实例而不是currentFragmentTag.equals("my_fragment_tag")。
注意,onAttachFragment中的getCurrentFragment()不会得到附加的片段,而是之前附加的片段。
我也坚持这一点。我最后做的,只是声明了一个Fragments数组:
private static PlaceholderFragment[] arrFrg;
(在我的情况下,它是PlaceholderFragment)和包装所有这些片段到这个数组没有标记:)
public static PlaceholderFragment newInstance(int sectionNumber) {
final PlaceholderFragment fragment = new PlaceholderFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
arrFrg[sectionNumber] = fragment;
return fragment;
}
然后你可以很容易地访问当前显示的片段:
arrFrg[mViewPager.getCurrentItem()];
我知道,这可能不是最好的解决方案,但它对我来说非常适合:)