私は次のものを持っています...
レイアウト
<?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>
アダプターコード...
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter implements ActionBar.TabListener {
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
private Fragment f;
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
this.addTab(actionBar.newTab().setText("Score"), ScoreFragment.class, null);
f = new TeamFragment();
this.addTab(actionBar.newTab().setText("Team"), TeamFragment.class, null);
}
@Override
public Fragment getItem(int position) {
if(position == 0){
TabInfo info = mTabs.get(position);
return Fragment.instantiate(context, info.clss.getName(), info.args);
}
else{
return f;
}
}
@Override
public int getCount() {
return mTabs.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) {
// TODO Auto-generated method stub
}
@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) {
// TODO Auto-generated method stub
}
/**
* @return the f
*/
public Fragment getF() {
return f;
}
/**
* @param f the f to set
*/
public void setF(Fragment f) {
startUpdate((ViewGroup)findViewById(R.id.pager));
destroyItem((ViewGroup)findViewById(R.id.pager), 1, this.f);
this.f = f;
instantiateItem((ViewGroup)findViewById(R.id.pager), 1);
finishUpdate((ViewGroup)findViewById(R.id.pager));
notifyDataSetChanged();
}
}
ただし、新しいフラグメントで setF を呼び出すと、古いフラグメントは期待どおりに消えますが、新しいフラグメントは表示されません。誰かが私が間違っていることを手伝ってくれますか?
に変えてみた...
public void setF(Fragment f) {
ViewGroup g = (ViewGroup)findViewById(R.id.pager);
startUpdate(g);
destroyItem(g, 1, this.f);
this.f = f;
WebViewFragment v = (WebViewFragment)instantiateItem(g, 1);
FragmentManager fm = v.getFragmentManager();
finishUpdate(g);
Fragment f3 = v;
f3.setUserVisibleHint(true);
setPrimaryItem(g,1,v);
notifyDataSetChanged();
}
しかし今、私は...
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)
多分競合状態のように見えますか?
ViewPager を使用した ActionBar - 部分的に表示されているタブをクリックするとアプリがクラッシュする
アップデート
setPrimaryItem(g,1,v); を削除すると その後、別のタブに移動して戻ってくるまで、問題なく動作しているように見えます。その後、同じように失敗します。これは、私がそれをある程度正しく行っており、何かが欠けているだけだと私に信じさせます.