是在FragmentPagerAdapter的Android越来越片段
我有以下问题: 我有一个活动中,我使用FragmentPagerAdapter 在某些时刻有这些都使得双方的片段两个标签,我想改变其中的一个观片段,但我不能findFragmentById()或findFragmentByTag()我无法设置ID,因为我不是在XML声明,因为FragmentPagerAdapter的片段, ,当我试图设置标签我遇到以下问题:是在FragmentPagerAdapter的Android越来越片段
08-15 21:46:23.805: E/AndroidRuntime(9297): java.lang.IllegalStateException: Can't change tag of fragment Companies{416d7b78 id=0x7f04002e companies}: was companies now android:switcher:2130968622:1
我的寻呼机FragmentPagerAdapter代码:
public class TabsAdapter extends FragmentPagerAdapter implements ActionBar.TabListener, ViewPager.OnPageChangeListener {
private final FragmentActivity mContext;
private final ActionBar mActionBar;
private final ViewPager mViewPager;
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
final class TabInfo {
private final Class<?> clss;
private final Bundle args;
TabInfo(Class<?> _class, Bundle _args) {
clss = _class;
args = _args;
}
}
public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) {
super(activity.getSupportFragmentManager());
mContext = activity;
mActionBar = activity.getSupportActionBar();
mViewPager = pager;
mViewPager.setAdapter(this);
mViewPager.setOnPageChangeListener(this);
}
public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {
TabInfo info = new TabInfo(clss, args);
tab.setTag(info);
tab.setTabListener(this);
mTabs.add(info);
mActionBar.addTab(tab);
notifyDataSetChanged();
}
@Override
public int getCount() {
return mTabs.size();
}
@Override
public Fragment getItem(int position) {
TabInfo info = mTabs.get(position);
FragmentTransaction ft=mContext.getSupportFragmentManager().beginTransaction();
Fragment fragment=Fragment.instantiate(mContext, info.clss.getName(), info.args);
if(position==1){
ft.add(mViewPager.getId(), fragment, "companies");
}else{
ft.add(mViewPager.getId(), fragment);
}
Log.v("FRAGMENT ID", "fragment tag: "+fragment.getTag());
ft.commit();
Log.v("FRAGMENT ID", "fragment tag: "+fragment.getTag());
return fragment;
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
mActionBar.setSelectedNavigationItem(position);
new Thread(new Runnable() {
@Override
public void run() {
MainActivity.this.hideKeyboard();
}
}).start();
}
@Override
public void onPageScrollStateChanged(int state) {
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
Object tag = tab.getTag();
for (int i = 0; i < mTabs.size(); i++) {
if (mTabs.get(i) == tag) {
mViewPager.setCurrentItem(i);
}
}
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
}
预先感谢您为您的回答。
FragmentPagerAdapter提供的碎片在实例化时会自动加上标签。您可以使用此方法来获取标签:
private static String makeFragmentName(int viewPagerId, int index) {
return "android:switcher:" + viewPagerId + ":" + index;
}
我发现了一个略少毛的方式得到由FragmentPagerAdapter
创建一个Fragment
一个手柄。 不是模仿创建标签的方式,而是覆盖instantiateItem()
,获取超类返回的Fragment
,并将标签保存在TabInfo
中。这适用于API> = 15,可能与更低。这仍然对私有代码做出一些假设。
static final class TabInfo {
private final Class<?> clss;
private final Bundle args;
private String tag; // ** add this
TabInfo(Class<?> _class, Bundle _args) {
clss = _class;
args = _args;
}
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
final Fragment fragment = (Fragment) super.instantiateItem(container, position);
final TabInfo info = mTabs.get(position);
info.tag = fragment.getTag(); // set it here
return fragment;
}
还是在API < 16,我觉得instantiateItem()
需要View()
而不是ViewGroup()
,像这样:
public Object instantiateItem(View container, int position);
然后允许的方式来获得Fragment
,保持黑客遏制。
public Fragment getFragment(int index) {
return mContext.getFragmentManager().findFragmentByTag(mTabs.get(index).tag);
}
对于工作,对于mContext
报关需要改变,以Activity
,它是通过在作为Activity
反正:
private final Activity mContext;
试图应用此解决方案,但** super.instantiateItem(容器,位置)**为我推出** NPE ** FragmentPagerAdapter和FragmentStatePagerAdapter – Sash0k 2013-01-23 05:26:35
有了这个功能,你可以找到通过寻呼机适配器位置的片段。
public Fragment findFragmentByPosition(int position) {
FragmentPagerAdapter fragmentPagerAdapter = getFragmentPagerAdapter();
return getSupportFragmentManager().findFragmentByTag(
"android:switcher:" + getViewPager().getId() + ":"
+ fragmentPagerAdapter.getItemId(position));
}
v4支持api的示例代码。
http://*.com/问题/ 6976027 /重用片段-IN-A-fragmentpageradapter/29287415#29287415 – 2015-12-27 05:37:25
回答这个问题已经很晚了,但我已经搜索了很多没有人告诉我确切的答案,可能有人认为它有用。
我已经通过FragmentPagerAdapter
设置我的片段,我做以下链接片段
https://developer.android.com/training/basics/fragments/communicating.html#Deliver
之间的沟通和FindFragmentById我只是用viewpager.getId()上在MainActivity。
更简单的方法是直接从片段管理器获取标签;像这样:
fm.getFragments().get(0).getTag()
您可以替换位置,具体取决于您需要标记的片段。希望这可以帮助别人!
谢谢,这对我有用。 – ziky90 2012-08-23 07:12:48
像我这样的人注意:viewId是ViewPager的ID – htafoya 2013-11-08 18:22:59
上帝保佑你! – user1767754 2015-01-10 23:36:33