我正在构建一个界面基于此http://code.google.com/p/android-playground/的应用程序,我需要在每个选项卡中包含一个片段(即片段)。这些标签都是从同一个xml中充气的,而在那个xml中我有一个片段标签。
问题在于,当创建活动时,由于选项卡中每个片段的ID相等,应该转到第二个选项卡的内容进入第一个。
我使用此代码替换选项卡中的片段
FragmentTransaction ft = x.getSupportFragmentManager().beginTransaction();
ft.replace(R.id.details, fragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
我不知道是否可以纠正这个问题。
答案 0 :(得分:1)
您希望所有标签都具有完全相同的内容吗?
通常,当将片段放入选项卡时,每个选项卡都会显示不同的内容,因此每个选项卡的xml文件并不罕见。您可以为每个选项卡创建一个单独的xml布局,每次只使用不同的ID声明您的片段。如果没有为每个片段声明一个单独的(读取唯一的)id,那么我就不知道获得特定片段句柄的高效/简单操作(因为id是唯一句柄)。
您也可以根据自己的需要使用FragmentPagerAdapter。然后,您可以淡出当前标签片段,然后调用public void notifyDataSetChanged ()并提供新片段。这不是真正的标准方式,但不会保留在后台。
您可以选择在忽略这个,它看起来不像你可以用标签切换fragements,id只是害怕。按照我的第一个建议去吧!PagerAdapter
中以编程方式创建每个标签,并在调用FragmentTransaction.add(..)时为每个片段设置tag
,然后在将来的片段事务中使用此标签唯一标记
答案 1 :(得分:0)
我也在努力解决这个问题,以及我稍后从Fragment
引用Activity
的方式是访问标签Adapter
。
假设你使用Adapter
,你可以做类似的事情
private mTabsAdapter;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// etc
this.mTabsAdapter = new TabsAdapter(this, this.mViewPager);
// Tab1
Tab tab = actionBar.newTab();
this.mTabsAdapter.addTab(tab, MyFragment1.class, null);
// Tab2
tab = actionBar.newTab();
this.mTabsAdapter.addTab(tab, MyFragment2.class, null);
}
public MyFragment1 getTab1() {
return (MyFragment1)this.mTabsAdapter.getItem(0);
}
public MyFragment2 getTab2() {
return (MyFragment2)this.mTabsAdapter.getItem(1);
}
然后在你的片段中,你将有一个方法来访问
public class MyFragment1 {
// ...
public void reloadData() {
// reload data here
}
}
现在您可以访问Fragment
,例如
this.getTab1.reloadData();
这感觉就像访问片段的悲伤方式,但在每种情况下都不能依赖于Tag。此外,您必须注意仅在Fragment
的引用存在的情况下引用它。
有时可能 null 。例如,如果你有一堆标签,它们可能会在某些时候被垃圾收集。你应该通过回调在Fragment
之间进行通信。此示例仅适用于少数几种情况。
回调方法在Communicating with the Activity中描述,如果适合您的应用,我建议使用此方法。这样可以防止在大多数情况下直接访问制表符。