1

私は次のものを持っています...

レイアウト

<?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); を削除すると その後、別のタブに移動して戻ってくるまで、問題なく動作しているように見えます。その後、同じように失敗します。これは、私がそれをある程度正しく行っており、何かが欠けているだけだと私に信じさせます.

4

2 に答える 2

0

トランジション フラグメントを使用してフラグメントを置換、追加、または削除しようとしても、うまくいかない場合があり、空白のレイアウトが表示されるだけです。この問題は、いくつかの理由で発生します。私は問題を抱えていて、それを理解しました。onCreateこれは、fragmentActivity でメソッドを実装した方法でした。

これはそれがどのようだったかです:

    protected void onCreate(android.os.Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.mybooks);
    }

android.os.Bundleそして、私がちょうどに変更したとき、問題はなくなりましたBundle。これが同じ問題を抱えている人の助けになることを願っています。

于 2014-07-29T02:25:29.463 に答える
0

これが機能的なバージョンです。さまざまなことを変更する必要がありました。私はまだ BackStack に追加したいと思っています (それができれば、小切手を受け取ることができます) が、これは同じボートに乗っている人を助けるはずです。

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;
    }
}
于 2013-10-24T19:35:49.123 に答える