6

Hallo Leute, ich habe ViewPager in FragmentActivity verwendet. Ich bekomme einen Absturz, wenn sich die Ausrichtung ändert.FragmentActivity mit ViewPager: Absturz bei Orientierungsänderung

@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); 
    } 

Meine Daten kommen dynamisch aus der Datenbank, und ich habe die Sysnctask nennen, die die DATAT von Datenbank der in onResume(). Hier ist onPostExecute() der Asynctask.

protected void onPostExecute(Void result) { 

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

Hinzufügen 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; 
    } 
} 

Hinzufügen von Fragment-Code:

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; 
    } 
} 

Die XML verwendet wird, ist:

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

Guys! Bitte helfen Sie! Ich erhalte den folgenden Absturz auf Orientierungsänderung:

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 

Antwort

7

Es gibt ein paar Hinweise auf den folgenden Zeilen:

Verursacht durch: android.support.v4.app.Fragment $ InstantiationException: Kann nicht Fragment com.walletv2.activity.PayeeListActivity $ PayeeListSectionFragment instanziiert: sicher Klassennamen machen existiert, ist öffentlich und hat einen leeren Konstruktor, der öffentlich ist

und:

06-07 11: 01: 57,834: E/Android Runtime (766): Verursacht durch: java.lang.InstantiationException: nicht Klasse com.walletv2.activity.PayeeListActivity $ PayeeListSectionFragment instanziiert; keine leeren Konstruktor

Das lässt vermuten, dass Sie eine parametrisierte Konstruktor Ihre PayeeListSectionFragment innere Klasse hinzugefügt haben. Leider funktioniert das nicht, da Android darauf angewiesen ist, einen nicht-parametrisierten Konstruktor über Reflektion aufzurufen, um unter anderem den Status eines Fragments bei Konfigurationsänderungen wiederherzustellen.

Wenn Sie einem Fragment einen oder mehrere Parameter zuweisen möchten, müssen Sie sie in ein Bundle stecken und als Argument festlegen, indem Sie setArguments(Bundle) verwenden. Werfen Sie einen Blick auf die für ein Beispiel, wie das geht.

Dieses Problem kann auch in einer anderen Situation auftreten, die für diejenigen, die nicht mit Java vertraut sind, weniger offensichtlich sein kann. Wenn Ihr Fragment eine verschachtelte Klasse von etwa Activity ist, stellen Sie sicher, dass Sie die innere Klasse static deklarieren. Zum Beispiel sollte im Kontext der obigen Frage ein public static class PayeeListSectionFragment (mit einem Schwerpunkt auf dem Modifikator static) sein. Auf diese Weise behält die innere Klasse keinen Verweis auf die äußere Klasse und kann ihren eigenen Lebenszyklus haben, ohne Abhängigkeiten von der äußeren Klasse. Ohne den statischen Modifikator kann die geschachtelte Klasse nicht instanziiert werden, ohne die äußere Klasse zu instanziieren, was bedeutet, dass Android Probleme beim Versuch hat, die Fragmentklasse wiederherzustellen.

Eine alternative Lösung wäre, die innere Klasse in ihre eigene .java Datei zu verschieben. Auf diese Weise werden alle äußeren Klassenabhängigkeiten automatisch entfernt.

+1

Hallo MH, ich habe es bereits überprüft, aber das ist nicht der Fall: – Vineet

+0

@Vineet: Nun, es ist entweder das, oder Sie haben einen (nicht parametrisierten) Konstruktor hinzugefügt, der privat, geschützt oder paketgeschützt ist statt "öffentlich". Es könnte helfen, wenn Sie nur das relevante Code-Snippet zu Ihrer Frage hinzufügen würden. Je weniger wir raten, desto einfacher ist es, das genaue Problem zu lokalisieren. –

+0

Ich habe den FragmentpagerAdapter & Fragment Code hinzugefügt. Freundlich helfen. – Vineet