6

Witajcie, użyłem ViewPagera w FragmentActivity. Występuje awaria, gdy zmienia się orientacja.FragmentActivity z ViewPager: Awaria przy zmianie orientacji

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

Moje dane nadchodzi dynamicznie z bazy danych i mam zadzwonić do Sysnctask która jest coraz datat z bazy w onResume(). Oto onPostExecute() Asynctask.

protected void onPostExecute(Void result) { 

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

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

Dodawanie fragment kodu:

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 jest używany to:

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

Chłopaki! Proszę pomóż! Otrzymuję następujący katastrofę na zmiany orientacji:

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 

Odpowiedz

7

Istnieje kilka wskazówek na następujących liniach:

Spowodowany przez: android.support.v4.app.Fragment $ InstantiationException: nie można instancję fragment com.walletv2.activity.PayeeListActivity $ PayeeListSectionFragment: upewnić Nazwa klasy istnieje, jest publiczna, a ma pusty konstruktor, który jest publiczny

a:

06-07 11: 01: 57,834: E/Android Runtime (766) spowodowane przez: java.lang.InstantiationException: nie wystąpienia klasy com.walletv2.activity.PayeeListActivity $ PayeeListSectionFragment; nie pusty konstruktor

To sugeruje, że dodasz sparametryzowanego konstruktora do PayeeListSectionFragment wewnętrznej klasy. Niestety, to nie zadziała, ponieważ Android polega na wywoływaniu sparametryzowanego konstruktora za pomocą odbicia w celu przywrócenia stanu fragmentu na zmiany konfiguracji (między innymi).

Jeśli chcesz podać jeden lub więcej parametrów do fragmentu, musisz podłączyć je do Bundle i ustawić jako argument, używając setArguments(Bundle). Zajrzyj do DetailsFragment and CountingFragment in the documentation, aby dowiedzieć się, jak to zrobić.


Ten problem może również wystąpić w innej sytuacji, która może być mniej oczywista dla osób niezbyt zaznajomionych z Javą. Jeśli twój fragment jest klasą zagnieżdżoną np. Activity, zadeklaruj klasę wewnętrzną static. Na przykład w kontekście powyższego pytania powinno to być public static class PayeeListSectionFragment (z naciskiem na modyfikator static). W ten sposób klasa wewnętrzna nie będzie zachowywać odniesienia do zewnętrznej klasy i może mieć swój własny cykl życia, bez jakichkolwiek zależności od zewnętrznej klasy. Bez modyfikatora statycznego nie można utworzyć instancji klasy zagnieżdżonej bez tworzenia instancji klasy zewnętrznej, co oznacza, że ​​system Android napotka problemy podczas próby przywrócenia instancji klasy fragmentów.

Alternatywnym rozwiązaniem byłoby przeniesienie klasy wewnętrznej do własnego pliku .java. W ten sposób wszelkie zależności zewnętrzne klasy są automatycznie usuwane.

+1

Witam MH, już to sprawdziłem, ale tak nie jest: – Vineet

+0

@Vineet: Cóż, to albo to, albo dodałeś (nie sparametryzowany) contructor, który jest prywatny, chroniony lub chroniony pakietem zamiast zamiast "publicznego". Pomoże Ci to, jeśli po prostu dodasz odpowiedni fragment kodu do swojego pytania. Im mniej zgadujemy, tym łatwiej jest dokładnie określić problem. –

+0

Dodałem kod FragmentpagerAdapter & Fragment. Uprzejma pomoc. – Vineet

Powiązane problemy