1

私のアプリには 2 つfragmentsの があり、1 つはリスト ビュー、もう 1 つは詳細ビューです。どちらも横向きモードで表示され、リストのみが縦向きで表示されます。onCreateOptionsMenu構成の変更時に、両方にブレークポイントを設定するとfragments、それらが 2 回ヒットし、メニュー項目Actionbarが複製されます。

invalidateOptionsMenuのようなさまざまなイベントで設定しようとしましたが、それは役に立たないようです。何が原因で2回ヒットするのかわかりません。onResumeonActivityCreatedonCreateOptionsMenu

ここに解決策があることに気付きましたが、それはうまくいきません。java.lang.IllegalArgumentException No view found for for fragmentにインonStartを引き起こしActivityます。

アップデート

ポートレート モードの場合、を使用してViewPagerをロードしています。fragments

public class Main extends SherlockFragmentActivity
{
    private static List<Fragment> fragments;

    @Override
    public void onCreate(final Bundle icicle)
    {    
        setContentView(R.layout.main);
    }

    @Override
    public void onResume()
    { 
        mViewPager = (ViewPager)findViewById(R.id.viewpager);

               if (mViewPager != null)
               {

                  fragments = new ArrayList<Fragment>();

                  fragments.add(new MyListFragment());

                  fragments.add(MyDetailFragment.newInstance(0));
                  fragments.add(MyDetailFragment.newInstance(1));
                  fragments.add(MyDetailFragment.newInstance(2));

                  mMyFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
                  mViewPager.setAdapter(mMyFragmentPagerAdapter);
               }
    }

    private static class MyFragmentPagerAdapter extends FragmentStatePagerAdapter  {  

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

        @Override  
        public Fragment getItem(int index) {
            return fragments.get(index);
        }  

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

        @Override
        public int getItemPosition(Object object) {
            return POSITION_NONE;
        }
   }
}

それはランドスケープモードで、fragmentsXML経由で追加しています。layout-landこれは、フォルダー内の main.xml ファイルです。

<?xml version="1.0" encoding="utf-8"?>

<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"
>
    <fragment android:name="com.app.ListingFragment"
            android:id="@+id/fragmentDetails"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
     />

    <fragment android:name="com.app.DetailFragment" 
            android:id="@+id/fragmentDetails"
            android:layout_width="0dp"
            android:layout_weight="2"
            android:layout_height="fill_parent"
     />

</LinearLayout>

これは、layoutフォルダー内の XML です。

<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>
4

1 に答える 1

2

問題は、レイアウト ファイルにフラグメントを追加し、constructor/newInstance メソッドを呼び出して手動でインスタンス化することです。

レイアウトにフラグメントを追加すると、Android フレームワークによってインスタンス化されます。投稿したコードでは、すべてを表示できない場合でも、合計で 4 つの詳細フラグメント インスタンスと 2 つのリスト フラグメント インスタンスがあります。

フラグメントを手動でインスタンス化する代わりに、 FragmentManager.getFragmentByIdを呼び出してそのインスタンスを取得し、代わりにそのインスタンスを使用する必要があります。

詳細フラグメントについては、レイアウトに 1 つのフラグメント宣言を含める代わりに、ページャー アダプターを追加するために使用できる通常のレイアウトに置き換えます。

于 2013-02-03T20:12:46.137 に答える