Android 使用FragmentStatePagerAdapter交换碎片失败
我有以下几点 布局Android 使用FragmentStatePagerAdapter交换碎片失败,android,android-fragments,android-viewpager,Android,Android Fragments,Android Viewpager,我有以下几点 布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > &
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
但是现在我
10-24 17:10:12.290: E/AndroidRuntime(1113): java.lang.NullPointerException
10-24 17:10:12.290: E/AndroidRuntime(1113): at android.support.v4.app.Fragment.setUserVisibleHint(Fragment.java:819)
10-24 17:10:12.290: E/AndroidRuntime(1113): at android.support.v4.app.FragmentStatePagerAdapter.setPrimaryItem(FragmentStatePagerAdapter.java:152)
10-24 17:10:12.290: E/AndroidRuntime(1113): at android.support.v4.view.ViewPager.populate(ViewPager.java:1066)
看起来可能是比赛条件
更新
如果我移除setPrimaryItem(g,1,v);然后,它似乎运行良好,直到我去另一个标签,回来。然后它以同样的方式失败。这让我相信我做得有点对,只是遗漏了一些东西。这是功能版本,我不得不改变很多东西。我仍然想增加后援(如果你可以这样做,你会得到支票),但这应该有助于在同一条船上的任何人
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter implements ActionBar.TabListener {
private ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
private List<Fragment> fragments = new ArrayList<Fragment>();
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
fragments.add(new ScoreFragment());
fragments.add(new TeamFragment());
this.addTab(actionBar.newTab().setText("Score"), ScoreFragment.class, null);
this.addTab(actionBar.newTab().setText("Team"), TeamFragment.class, null);
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
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);
actionBar.addTab(tab);
notifyDataSetChanged();
}
@Override
public void onTabReselected(Tab arg0,
android.app.FragmentTransaction arg1) {}
@Override
public void onTabSelected(Tab tab, android.app.FragmentTransaction arg1) {
Object tag = tab.getTag();
for (int i = 0; i < mTabs.size(); i++) {
if (mTabs.get(i) == tag) {
mPager.setCurrentItem(i);
}
}
}
@Override
public void onTabUnselected(Tab arg0,
android.app.FragmentTransaction arg1) {}
/**
* @param f the f to set
*/
public void setF(Fragment f) {
int loc = actionBar.getSelectedTab().getPosition();
fragments.set(loc, f);
notifyDataSetChanged();
}
@Override
public int getItemPosition(Object object) {
if(object instanceof Fragment){
if(fragments.contains(object))
return POSITION_UNCHANGED;
}
return POSITION_NONE;
}
}
私有类ScreenSlidePagerAdapter扩展FragmentStatePagerAdapter实现ActionBar.TabListener{
private ArrayList mtab=new ArrayList();
私有列表片段=新的ArrayList();
公共屏幕SlidePagerAdapter(FragmentManager fm){
超级(fm);
添加(新的ScoreFragment());
添加(新的TeamFragment());
this.addTab(actionBar.newTab().setText(“Score”),ScoreFragment.class,null);
this.addTab(actionBar.newTab().setText(“团队”),TeamFragment.class,null);
}
@凌驾
公共片段getItem(int位置){
返回碎片。获取(位置);
}
@凌驾
public int getCount(){
返回fragments.size();
}
public void addTab(ActionBar.Tab选项卡,类cls,Bundle args){
TabInfo=新的TabInfo(clss,args);
tab.setTag(信息);
tab.setTableListener(此);
添加(信息);
actionBar.addTab(tab);
notifyDataSetChanged();
}
@凌驾
已重新选择公共选项卡(选项卡arg0,
android.app.FragmentTransaction arg1{}
@凌驾
已选择公共事务(选项卡,android.app.FragmentTransaction arg1){
Object tag=tab.getTag();
对于(int i=0;i
尝试使用转换片段来替换、添加或删除片段有时可能不会使用word,它只显示一个空白布局。这个问题的发生是因为一些原因。我有这个问题,我解决了。这就是我在fragmentActivity中实现onCreate
方法的方式
事情是这样的:
protected void onCreate(android.os.Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mybooks);
}
当我将android.os.Bundle改为Bundle时,问题就消失了。我希望这对任何有同样问题的人都有帮助。你能用语言准确地解释一下你做了什么吗?我也有同样的问题。碎片永远不会出现。这只是一个空白版面。已经有一段时间了,但给我一两天时间看看我能不能把它弄清楚。谢谢。我已经弄明白了。看来引起我问题的原因和你的有点不同。
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter implements ActionBar.TabListener {
private ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
private List<Fragment> fragments = new ArrayList<Fragment>();
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
fragments.add(new ScoreFragment());
fragments.add(new TeamFragment());
this.addTab(actionBar.newTab().setText("Score"), ScoreFragment.class, null);
this.addTab(actionBar.newTab().setText("Team"), TeamFragment.class, null);
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
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);
actionBar.addTab(tab);
notifyDataSetChanged();
}
@Override
public void onTabReselected(Tab arg0,
android.app.FragmentTransaction arg1) {}
@Override
public void onTabSelected(Tab tab, android.app.FragmentTransaction arg1) {
Object tag = tab.getTag();
for (int i = 0; i < mTabs.size(); i++) {
if (mTabs.get(i) == tag) {
mPager.setCurrentItem(i);
}
}
}
@Override
public void onTabUnselected(Tab arg0,
android.app.FragmentTransaction arg1) {}
/**
* @param f the f to set
*/
public void setF(Fragment f) {
int loc = actionBar.getSelectedTab().getPosition();
fragments.set(loc, f);
notifyDataSetChanged();
}
@Override
public int getItemPosition(Object object) {
if(object instanceof Fragment){
if(fragments.contains(object))
return POSITION_UNCHANGED;
}
return POSITION_NONE;
}
}
protected void onCreate(android.os.Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mybooks);
}