3

私のアプリにはリストと詳細ビューがあり、ユーザーViewPagerはポートレートを使用してさまざまな詳細ビュー間をスワイプできます。横向きでは、両方のフラグメントを画面に表示します。

デバイスを回転させると、アイコンがActionbar. デバイスがローテーションされるたびにおそらく新しいフラグメントを作成していることがわかったので、フラグメントが にあるかどうかを確認し、FragmentManagerそうでない場合は新しいインスタンスを作成する必要があります。

ランドスケープレイアウトを使用して簡単に行うことができますが、フラグメントがポートレートモードで存在するかどうかをViewPager. でそれを行いgetItem()ますFragmentStatePagerAdapterか?

これは私が使用しているコードです:

public class Main extends SherlockFragmentActivity
{
    private static List<Integer> mIds;

    @Override
    public void onCreate(final Bundle icicle)
    {    
        super.onCreate(icicle);

        setContentView(R.layout.main);

        mViewPager = (ViewPager)findViewById(R.id.viewpager); //view pager exists, so we are using the portait layout

        if (mViewPager != null)
        {
            mIds = new ArrayList<Integer>();

            mIds.add(0);
            mIds.add(1);
            mIds.add(2);
        }
        else //in landscape
        {           
            ListFragment lf = (ListFragment)getSupportFragmentManager().findFragmentById(R.id.fragmentList);

            if (lf == null)
                lf = new ListFragment();

            DetailFragment df = (DetailFragment)getSupportFragmentManager().findFragmentById(R.id.fragmentDetail);

            if (df == null)
            {
                df = new DetailFragment();
                df.setArguments(getIntent().getExtras());   
            }

            getSupportFragmentManager().beginTransaction().add(R.id.fragmentList, lf).commit();
            getSupportFragmentManager().beginTransaction().add(R.id.fragmentDetail, df).commit();
        }
    }       

    private static class MyFragmentPagerAdapter extends FragmentStatePagerAdapter  {  

        public MyFragmentPagerAdapter(FragmentManager fm) {  
             super(fm);  
        }  

        @Override  
        public Fragment getItem(int index) {        
            //can't use getSupportFragmentManager().findFragmentById() here because I get a "Cannot make a static reference to the non-static method" error
            if (index == 0)
                return ListFragment.newInstance();
            else            
                return DetailFragment.newInstance(mIds.get(index-1));
        }  

        @Override
        public int getCount() {  
             return 4;
        }
   }  
}

メインレイアウト(縦)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent">

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
     />
 </RelativeLayout>

メインレイアウト(横)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    android:weightSum="3"
>
    <FrameLayout 
        android:id="@+id/fragmentList"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
     />

    <FrameLayout 
        android:id="@+id/fragmentDetail"
        android:layout_width="0dp"
        android:layout_weight="2"
        android:layout_height="fill_parent"
     />

</LinearLayout>

リストフラグメント

public class ListFragment extends SherlockListFragment implements DialogKeywordAddListener
{
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        setHasOptionsMenu(true);
    }

    public static ListFragment newInstance() {

        return new ListFragment();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);

        return inflater.inflate(R.layout.listing, container, false);
    }
}

詳細フラグメント

public class DetailFragment extends SherlockListFragment
{
    private int mId;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        setHasOptionsMenu(true);
    }

    public static DetailFragment newInstance() {

        DetailFragment df = new DetailFragment();
        Bundle bundle = new Bundle();
        bundle.putInt("id", id);
        df.setArguments(bundle);

        return df;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);

        if (getArguments() != null)
            mId = getArguments().getInt("id");

        return inflater.inflate(R.layout.detail, container, false);
    }
}
4

1 に答える 1

2

さて、この質問の解決策は私にとってはうまくいったようです。ちょうど設定:

    super.onCreate(null);

私のフラグメントの問題onCreateを解決しました。Activity

于 2013-02-16T20:24:17.527 に答える