Форум программистов, компьютерный форум CyberForum.ru

Ошибка с фрагментами при повороте устройства - Android

Войти
Регистрация
Восстановить пароль
 
contedevel
 Аватар для contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 589
26.04.2015, 02:36     Ошибка с фрагментами при повороте устройства #1
Здравствуйте!

Имеется такой код activity:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class MainActivity extends ActionBarActivity {
    private int selectedDay = 0;
    private int selectedWeek = 1;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Spinner sMode = (Spinner) findViewById(R.id.toolbarSpinner);
        sMode.setAdapter(tsaMode);
        sMode.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                FragmentManager fragmentManager = getSupportFragmentManager();
 
                if(position < sh.getWeekCount()) {
                    selectedWeek = position + 1;
 
                    Bundle args = new Bundle();
                    args.putInt(WeekFragment.KEY_WEEK_NUMBER, selectedWeek);
                    WeekFragment weekFragment = new WeekFragment();
                    weekFragment.setArguments(args);
 
                    fragmentManager.beginTransaction()
                            .replace(R.id.container, weekFragment)
                            .commit();
                }
                else {
                    NowFragment nowFragment = new NowFragment();
 
                    fragmentManager.beginTransaction()
                            .replace(R.id.container, nowFragment)
                            .commit();
 
                    selectedWeek = sh.getCurrentWeekNumber();
                    selectedDay = sh.getCurrentDayCode();
                }
            }
 
            @Override
            public void onNothingSelected(AdapterView<?> parent) {
 
            }
        });
    }
}


И код WeekFragment.java:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
public class WeekFragment extends Fragment {
    public static final String KEY_WEEK_NUMBER = "week_number";
 
    private int weekNumber = 1;
    private ViewPager viewPager;
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
 
        Bundle args = getArguments();
 
        if(args != null) {
            weekNumber = args.getInt(KEY_WEEK_NUMBER);
        }
 
        View v = inflater.inflate(R.layout.fragment_week, null);
        viewPager = (ViewPager) v.findViewById(R.id.vpDaySlider);
        DayPagerAdapter dayPagerAdapter = new DayPagerAdapter(getActivity(),
                getActivity().getSupportFragmentManager(), weekNumber);
        viewPager.setAdapter(dayPagerAdapter);
 
        return v;
    }
 
    private static class DayPagerAdapter extends FragmentStatePagerAdapter {
        public static final int PAGE_COUNT = 7;
 
        private final int weekNumber;
        private final int[] dayCodes;
        private final String[] days;
        private final DayFragment[] fragments = new DayFragment[7];
 
        public DayPagerAdapter(Context context, FragmentManager fm, final int weekNumber) {
            super(fm);
 
            this.weekNumber = weekNumber;
            this.dayCodes = DayHelper.getDayCodes(context);
            this.days = context.getResources().getStringArray(R.array.days);
        }
 
        @Override
        public Fragment getItem(int position) {
 
            if(fragments[position] == null) {
 
                Bundle bundle = new Bundle();
                bundle.putInt(DayFragment.KEY_WEEK_NUMBER, weekNumber);
                bundle.putInt(DayFragment.KEY_DAY_CODE, dayCodes[position]);
                bundle.putString(DayFragment.KEY_DAY_NAME, days[position].substring(3));
 
                fragments[position] = new DayFragment();
                fragments[position].setArguments(bundle);
            }
 
            return fragments[position];
        }
 
        @Override
        public int getCount() {
            return PAGE_COUNT;
        }
    }
}


Все работает отлично, номально переключается с WeekFragment на NowFragment и ViewPager тоже работает, но при повороте экрана тут же падает с ошибкой. Что интересно, если в Spinner выбрать первый элемент, то и поворот работает нормально.

Вот лог:
Кликните здесь для просмотра всего текста
java.lang.RuntimeException: Unable to start activity ComponentInfo{my.package/my.package.MainActivity}: java.lang.IllegalArgumentException: No view found for id 0x7f0a0064 (my.package:id/vpDaySlider) for fragment DayFragment{42893e78 #1 id=0x7f0a0064}
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2114)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2139)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3580)
at android.app.ActivityThread.access$800(ActivityThread.java:143)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4960)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f0a0064 (my.package:id/vpDaySlider) for fragment DayFragment{42893e78 #1 id=0x7f0a0064}
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:945)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1136)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1118)
at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1927)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:544)


Я так понял, что фрагменты не уничтожаются, а просто отключаются и где-то висят, а затем при попытке повторного их создания кидает ошибку... В общем, не пойму из-за чего... Кто-нибудь может помочь с этим? Буду очень признателен!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.04.2015, 02:36     Ошибка с фрагментами при повороте устройства
Посмотрите здесь:

Android Ошибка при запуске устройства из Android SDK Manager
Анимация при повороте экрана - в своем приложении Android
Android Ошибка при повороте экрана
Запуск AsyncTask при повороте девайса Android
Сохранение объекта при повороте экрана Android
Android Непонятное поведение при повороте экрана
При повороте на 90 градусов вылетает программа Android
Как сделать так, чтобы при повороте устройства экран оставался вертикальным? Android
Ошибка при запуске виртуального устройства в AVD Android
Android Ошибка при работе с фрагментами
Android Сохранить imageview при повороте экрана
Android При запуске устройства в Genymotion в окне устройства просто черное поле и кнопки рядом с ним

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
max_max
5 / 5 / 1
Регистрация: 12.08.2014
Сообщений: 26
27.04.2015, 12:13     Ошибка с фрагментами при повороте устройства #2
Можете попробовать сделать retain-фрагменты, сам фрагмент при повороте пересоздаваться не будет, будет только view новый создавать.

Java
1
2
3
4
5
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
}
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
27.04.2015, 12:22     Ошибка с фрагментами при повороте устройства #3
contedevel, смартфоны изначально пошли по неправильному пути, потому исторически собирают кучу ошибок. Думаю, в итоге они всё равно придут к той модели работы, которая принята на PC.
Сейчас эта мутная Андроидная недоОСь действительно пересоздаёт фрагменты (и активности) по любому поводу. В дополнение к замечанию max_max приведу ссылку: https://androidresearch.wordpress.co...n-orientation/. Рекомендую добавить в программу android:configChanges="orientation|keyboardHidden|screenSize|smallestScreenSize" (в дополнение к другим средствам).
contedevel
 Аватар для contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 589
27.04.2015, 23:21  [ТС]     Ошибка с фрагментами при повороте устройства #4
Цитата Сообщение от max_max Посмотреть сообщение
Можете попробовать сделать retain-фрагменты, сам фрагмент при повороте пересоздаваться не будет, будет только view новый создавать.
Не помогло ( Опять тот же лог:
Кликните здесь для просмотра всего текста
java.lang.IllegalStateException: Fragment DayFragment{41392308 id=0x7f0a0061} is not currently in the FragmentManager


Добавлено через 52 минуты
Нашел ошибку, нужно было так сделать:
Java
1
2
3
FragmentManager fm = getChildFragmentManager();
viewPager = (ViewPager) v.findViewById(R.id.vpDaySlider);
DayPagerAdapter dayPagerAdapter = new DayPagerAdapter(getActivity(), fm, weekNumber);
Yandex
Объявления
27.04.2015, 23:21     Ошибка с фрагментами при повороте устройства
Ответ Создать тему
Опции темы

Текущее время: 05:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru