6

皆さん、私はFragmentActivityでViewPagerを使用しました。オリエンテーションが変わるとクラッシュするよ。ViewPagerでの断片化:方向変更時のクラッシュ

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_list); 
    context = this; 
    loadInitialData(); 
    setActionBar(); 
    initializeUiComponents(); 
} 

private void initializeUiComponents() { 
    // Set up the ViewPager with the sections adapter. 
    mViewPager = (ViewPager) findViewById(R.id.pager); 
    } 

は私のデータは、データベースから動的に来ている、と私はonResumeでデータベースからDATATを取得しているSysnctask()を呼び出す必要があります。ここにはAsynctaskのonPostExecute()があります。

protected void onPostExecute(Void result) { 

      mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 
      mViewPager.setAdapter(mSectionsPagerAdapter); 
     } 
     mSectionsPagerAdapter.notifyDataSetChanged(); 
     } 
} 

追加FragmentAdapterCode:

public class SectionsPagerAdapter extends FragmentPagerAdapter { 
    public SectionsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     // getItem is called to instantiate the fragment for the given page. 
     // Return a DummySectionFragment (defined as a static inner class 
     // below) with the page number as its lone argument. 
     Fragment fragment = new PayeeListSectionFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(PayeeListSectionFragment.ARG_SECTION_NUMBER, position + 1); 
     fragment.setArguments(args); 
     return fragment; 
    } 

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

    @Override 
    public CharSequence getPageTitle(int position) { 

     return string; 
    } 
} 

追加フラグメントコード:

public class PayeeListSectionFragment extends Fragment { 
    /** 
    * The fragment argument representing the section number for this fragment. 
    */ 
    public static final String ARG_SECTION_NUMBER = "section_number"; 

    public PayeeListSectionFragment() { 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = null; 
     \\ rootView inflated 
     return rootView; 
    } 
} 

XMLを使用するには、次のとおりです。

<android.support.v4.view.ViewPager 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".PayeeListActivity" > 

    <!-- 
This title strip will display the currently visible page title, as well as the page 
titles for adjacent pages. 

    --> 

    <android.support.v4.view.PagerTitleStrip 
     android:id="@+id/pager_title_strip" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="top" 
     android:background="#33b5e5" 
     android:paddingBottom="4dp" 
     android:paddingTop="4dp" 
     android:textColor="#fff" /> 
</android.support.v4.view.ViewPager> 

みんな!助けてください!私は、姿勢変化に次のクラッシュを取得しています:

06-07 11:01:57.834: E/AndroidRuntime(766): FATAL EXCEPTION: main 
06-07 11:01:57.834: E/AndroidRuntime(766): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.walletv2.activity/com.walletv2.activity.PayeeListActivity}: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.walletv2.activity.PayeeListActivity$PayeeListSectionFragment: make sure class name exists, is public, and has an empty constructor that is public 
06-07 11:01:57.834: E/AndroidRuntime(766): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
06-07 11:01:57.834: E/AndroidRuntime(766): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
06-07 11:01:57.834: E/AndroidRuntime(766): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3692) 
06-07 11:01:57.834: E/AndroidRuntime(766): at android.app.ActivityThread.access$700(ActivityThread.java:141) 
06-07 11:01:57.834: E/AndroidRuntime(766): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1240) 
06-07 11:01:57.834: E/AndroidRuntime(766): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-07 11:01:57.834: E/AndroidRuntime(766): at android.os.Looper.loop(Looper.java:137) 
06-07 11:01:57.834: E/AndroidRuntime(766): at android.app.ActivityThread.main(ActivityThread.java:5041) 
06-07 11:01:57.834: E/AndroidRuntime(766): at java.lang.reflect.Method.invokeNative(Native Method) 
06-07 11:01:57.834: E/AndroidRuntime(766): at java.lang.reflect.Method.invoke(Method.java:511) 
06-07 11:01:57.834: E/AndroidRuntime(766): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
06-07 11:01:57.834: E/AndroidRuntime(766): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
06-07 11:01:57.834: E/AndroidRuntime(766): at dalvik.system.NativeStart.main(Native Method) 
06-07 11:01:57.834: E/AndroidRuntime(766): Caused by: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.walletv2.activity.PayeeListActivity$PayeeListSectionFragment: make sure class name exists, is public, and has an empty constructor that is public 
06-07 11:01:57.834: E/AndroidRuntime(766): at android.support.v4.app.Fragment.instantiate(Fragment.java:405) 
06-07 11:01:57.834: E/AndroidRuntime(766): at android.support.v4.app.FragmentState.instantiate(Fragment.java:97) 
06-07 11:01:57.834: E/AndroidRuntime(766): at android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1767) 
06-07 11:01:57.834: E/AndroidRuntime(766): at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:208) 
06-07 11:01:57.834: E/AndroidRuntime(766): at com.walletv2.activity.PayeeListActivity.onCreate(PayeeListActivity.java:78) 
06-07 11:01:57.834: E/AndroidRuntime(766): at android.app.Activity.performCreate(Activity.java:5104) 
06-07 11:01:57.834: E/AndroidRuntime(766): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
06-07 11:01:57.834: E/AndroidRuntime(766): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
06-07 11:01:57.834: E/AndroidRuntime(766): ... 12 more 
06-07 11:01:57.834: E/AndroidRuntime(766): Caused by: java.lang.InstantiationException: can't instantiate class com.walletv2.activity.PayeeListActivity$PayeeListSectionFragment; no empty constructor 
06-07 11:01:57.834: E/AndroidRuntime(766): at java.lang.Class.newInstanceImpl(Native Method) 
06-07 11:01:57.834: E/AndroidRuntime(766): at java.lang.Class.newInstance(Class.java:1319) 
06-07 11:01:57.834: E/AndroidRuntime(766): at android.support.v4.app.Fragment.instantiate(Fragment.java:394) 
06-07 11:01:57.834: E/AndroidRuntime(766): ... 19 more 

答えて

7

次の行のヒントがいくつかあります:android.support.v4.app.Fragment $でInstantiationException:によって引き起こさ

にできませんが、フラグメントcom.walletv2.activity.PayeeListActivity $ PayeeListSectionFragmentをインスタンス化:必ずクラス名が存在しますは、公開されている、と

そして公開されている空のコンストラクタを持っている:

06-07 11:01:57.834:E/AndroidRuntime(766):java.lang.InstantiationExceptionの:起因するクラスをインスタンス化することができないcom.walletv2.activity.PayeeListActivity $ PayeeListSectionFragment。 あなたはPayeeListSectionFragment内部クラスにパラメータ化されたコンストラクタを追加したことを示唆していない空のコンストラクタ

。残念ながら、これは動作しません。なぜならAndroidは、(他のものの中でも)設定の変更時にフラグメントの状態を復元するために、リフレクションを使用してパラメータ化されていないコンストラクタを呼び出すことに依存しているからです。

フラグメントに1つ以上のパラメータを指定する場合は、Bundleにプラグインし、引数としてsetArguments(Bundle)を使用する必要があります。それを行う方法の例については、DetailsFragment and CountingFragment in the documentationをご覧ください。


この問題は、Javaとあまり慣れていない方にはあまり明らかであり、別の状況で発生する可能性があります。フラグメントがいくつかのActivityというネストされたクラスである場合は、内部クラスstaticを宣言してください。たとえば、上記の質問の文脈では、public static class PayeeListSectionFragmentstatic修飾子を重視)である必要があります。そうすることで、内部クラスは外部クラスへの参照を保持せず、外部クラスに依存することなく独自のライフサイクルを持つことができます。静的修飾子がなければ、ネストされたクラスは外部クラスをインスタンス化せずにインスタンス化することはできません。つまり、フラグメントクラスを再インスタンス化しようとするとAndroidが問題に遭遇します。

代わりの解決策は、内部クラスを独自の.javaファイルに移動することです。そうすれば、外部クラスの依存関係は自動的に削除されます。

+1

こんにちはMH、私はすでにそれをチェックしましたが、これはそうではありません: – Vineet

+0

@Vineet:そうですか、プライベート、プロテクト、パッケージ保護された(パラメータ化されていない)コンストラクタを追加しました。 「公然」の代わりに。あなたの質問に関連するコードスニペットを追加するだけであれば役に立ちます。推測が少ないほど正確な問題を特定するのが簡単です。 –

+0

FragmentpagerAdapter&Fragmentコードを追加しました。親切に助けてください。 – Vineet

関連する問題