6

Привет, ребята, я использовал ViewPager в FragmentActivity. При изменении ориентации я получаю сбой.FragmentActivity с 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); 
    } 

Мои данные поступают динамически из базы данных, и я должен назвать Sysnctask, который является получение datat из базы данных в onResume(). Здесь находится onPostExecute() Asynctask.

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: Е/AndroidRuntime (766): Вызванный: java.lang.InstantiationException: не может создать экземпляр класса com.walletv2.activity.PayeeListActivity $ PayeeListSectionFragment; не пустой конструктор

Это говорит о том, что вы добавили параметризированный конструктор для вашего PayeeListSectionFragment внутреннего класса. К сожалению, это не сработает, поскольку Android полагается на вызов непараметрированного конструктора с использованием отражения, чтобы восстановить состояние фрагмента при изменении конфигурации (среди прочего).

Если вы хотите предоставить один или несколько параметров фрагменту, вам необходимо подключить их к Bundle и установить его как аргумент, используя setArguments(Bundle). Посмотрите на пример DetailsFragment and CountingFragment in the documentation о том, как это сделать.


Эта проблема также может возникнуть в другой ситуации, которая может быть менее очевидна для тех, кто не слишком хорошо знаком с Java. Если ваш фрагмент является вложенным классом, например, Activity, убедитесь, что вы объявили внутренний класс static. Например, в контексте вышеуказанного вопроса он должен быть public static class PayeeListSectionFragment (с акцентом на модификаторе static). Таким образом, внутренний класс не будет ссылаться на внешний класс и может иметь свой собственный жизненный цикл без каких-либо зависимостей от внешнего класса. Без статического модификатора вложенный класс не может быть создан без создания внешнего класса, что означает, что Android будет сталкиваться с проблемами при попытке восстановить свой класс фрагментов.

Альтернативным решением было бы перемещение внутреннего класса в собственный файл .java. Таким образом, любые внешние зависимости классов автоматически удаляются.

+1

Привет MH, я уже проверил его, но это не так: – Vineet

+0

@Vineet: Ну, это либо то, либо вы добавили (непараметризированный) конструктор, который является конфиденциальным, защищенным или защищенным пакетом , вместо «публики». Это может помочь, если вы просто добавите соответствующий фрагмент кода в свой вопрос. Чем меньше у нас есть предположение, тем легче определить точную проблему. –

+0

Я добавил код FragmentpagerAdapter & Fragment. Незлая помощь. – Vineet

Смежные вопросы