Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
nsoznik
0 / 0 / 0
Регистрация: 21.03.2018
Сообщений: 7
1

Fragment некорректно работает при повороте устройства

07.07.2018, 15:20. Просмотров 763. Ответов 9
Метки нет (Все метки)

При выводе на экран фрагмента после поворота устройства получаю такую ошибку:

Java
1
2
3
4
5
E/InputEventReceiver: Exception dispatching input event.
E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
E/MessageQueue-JNI: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
                        at com.example.user.miniapppikflowtwo.FragmentTipTextView.setView(FragmentTipTextView.java:31)
                        at com.example.user.miniapppikflowtwo.MainActivity$2.onClick(MainActivity.java:158)
Код фрагмента:
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
import android.view.ViewGroup;
import android.widget.TextView;
 
public class FragmentTipTextView extends Fragment {
 
    TextView textView;
    String string;
 
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_tip_tv, container,false);
        textView = view.findViewById(R.id.fragment_tip_text_view);
 
        return view;
 
    }
 
    public void setTextView(String string){
        this.string = string;
    }
 
    public void setView(){
        textView.setText(string);  //ОШИБКА ТУТ
    }
 
}
Активность:
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package com.example.user.miniapppikflowtwo;
 
import android.animation.PropertyValuesHolder;
import android.app.DialogFragment;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.PersistableBundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
 
 
import com.db.chart.animation.Animation;
import com.db.chart.listener.OnEntryClickListener;
import com.db.chart.model.LineSet;
import com.db.chart.tooltip.Tooltip;
import com.db.chart.util.Tools;
import com.db.chart.view.LineChartView;
 
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
 
public class MainActivity extends AppCompatActivity implements Dialog2.OnFragmentListener {
 
    LineChartView chart;
    DBRecorder dataBase;
    Toolbar toolbar;
    DialogFragment dlg1, dlg2;
 
    FragmentManager fragmentManager;
    FragmentTipTextView fragmentTipTextView;
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        fragmentManager = getSupportFragmentManager();
        fragmentTipTextView = new FragmentTipTextView();
 
        if(fragmentManager.findFragmentByTag("TodayFragment") == null){
                System.err.println("Fragment был null");
                fragmentManager.beginTransaction().add(R.id.tip_container, fragmentTipTextView, "TodayFragment").commit();
            } else {
                System.err.println("Fragment не был null");
                fragmentManager.beginTransaction().show(fragmentManager.findFragmentByTag("TodayFragment")).commit();
            }
 
        chart = findViewById(R.id.chart);
        dataBase = new DBRecorder(getApplicationContext());
 
        dlg1 = new Dialog1();
        dlg2 = new Dialog2();
 
        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dlg2.show(getFragmentManager(), "dlg2");
            }
        });
 
        toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar); //поддержка Android < 5.0
        getSupportActionBar().setTitle("Моя пыльца");
 
        setGraph();
    }
 
    String[] stringDate; //строки с датами
    float[] values; // значения
 
    private void setGraph(){
 
        //Тут настраивается внешний вид графика. К проблеме отношения не имеет
 
        chart.setOnEntryClickListener(new OnEntryClickListener() {
            @Override
            public void onClick(int setIndex, int entryIndex, Rect rect) {
                Recorder recorder = arrayList.get(entryIndex);
 
                fragmentTipTextView.setTextView(recorder.getTip());
 
                fragmentTipTextView.setView(); //ОШИБКА В ЭТОЙ СТРОКЕ
 
            }
        });
 
        //-------Показываем график-------
 
        chart.show(anim); //Показывает график с анимацией
    }
 
 //Другие методы, не влияющие на fragment
    
}
XML активности:

XML
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
65
66
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
 
 
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        style="@style/Toolbar"/>
 
    <android.support.v7.widget.CardView
        android:id="@+id/cardView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/toolbar">
 
        <com.db.chart.view.LineChartView
            android:id="@+id/chart"
            android:layout_width="match_parent"
            android:layout_marginLeft="8dp"
            android:layout_marginRight="8dp"
            android:layout_marginTop="8dp"
            android:layout_marginVertical="8dp"
            android:layout_height="250dp">
 
        </com.db.chart.view.LineChartView>
 
    </android.support.v7.widget.CardView>
 
    <android.support.v7.widget.CardView
        android:id="@+id/tip_container"
        android:layout_width="match_parent"
        android:layout_height="120dp"
        android:layout_marginEnd="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/cardView">
 
    </android.support.v7.widget.CardView>
 
    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_add_white_24dp"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />
 
</android.support.constraint.ConstraintLayout>
Разметка фрагмента на всякий случай:
XML
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
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <TextView
        android:id="@+id/fragment_tip_text_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:textColor="@color/primaryTextColor"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
 
</android.support.constraint.ConstraintLayout>
Проблема как я понимаю очень глупая, помогите пожалуйста)
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2018, 15:20
Ответы с готовыми решениями:

Жизненный цикл Activity и Fragment при повороте
Ребят запутался я совсем. Помогите разобраться. Насколько я знаю при повороте...

Ошибка с фрагментами при повороте устройства
Здравствуйте! Имеется такой код activity: public class MainActivity extends...

Сохранить анимацию при повороте устройства
Доброго времени суток!!! Возникла проблема о которой не подозревал, при...

Как сделать так, чтобы при повороте устройства экран оставался вертикальным?
Как сделать так, чтобы при повороте устройства экран оставался вертикальным?...

Не работает "лекарство" от перезапуска при повороте
Здравствуйте. Есть приложение в нем три активити (пока). Вопрос: как мне во...

9
ExFau$t
638 / 538 / 122
Регистрация: 08.05.2012
Сообщений: 2,701
07.07.2018, 15:26 2
При повороте активити пересоздаётся, соответственно, всё, что там было, становится null. Данные в фрагмент передаются через Bundle, можно создать instance фрагмента и туда кинуть, как параметр, эту строку.
0
nsoznik
0 / 0 / 0
Регистрация: 21.03.2018
Сообщений: 7
07.07.2018, 15:30  [ТС] 3
Цитата Сообщение от ExFau$t Посмотреть сообщение
При повороте активити пересоздаётся, соответственно, всё, что там было, становится null. Данные в фрагмент передаются через Bundle, можно создать instance фрагмента и туда кинуть, как параметр, эту строку.
Вопрос не в сохранении строки, что Bundle для этого используется я знаю. Сам TextView становится null. Его же в Bundle не сохранить
0
ExFau$t
638 / 538 / 122
Регистрация: 08.05.2012
Сообщений: 2,701
07.07.2018, 15:54 4
Раз знаешь - используй, сейчас это какой-то бред. В любом случае, писать в texview можно, когда он создан хотя бы.
0
nsoznik
0 / 0 / 0
Регистрация: 21.03.2018
Сообщений: 7
07.07.2018, 16:02  [ТС] 5
Цитата Сообщение от ExFau$t Посмотреть сообщение
Раз знаешь - используй, сейчас это какой-то бред. В любом случае, писать в texview можно, когда он создан хотя бы.
В том и дело, что textView создается и работает. Но до первого поворота экрана.
0
ExFau$t
638 / 538 / 122
Регистрация: 08.05.2012
Сообщений: 2,701
07.07.2018, 16:08 6
Читай внимательно сообщение №2.
0
nsoznik
0 / 0 / 0
Регистрация: 21.03.2018
Сообщений: 7
07.07.2018, 16:22  [ТС] 7
Цитата Сообщение от ExFau$t Посмотреть сообщение
Читай внимательно сообщение №2.
Вы предлагаете сохранить строку. И это даже работает
Java
1
2
3
4
5
6
@Override
    public void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("Text",text);
 
    }
Java
1
2
3
4
5
if(savedInstanceState != null){
 
            text = savedInstanceState.getString("Text");
            setEt();
        }
Мою проблему это не решило. TextView не рабочий по-прежнему. Если вы не имели ввиду то, что я написал выше, прошу написать решение кодом, или хотя-бы расписать что делать.
0
ExFau$t
638 / 538 / 122
Регистрация: 08.05.2012
Сообщений: 2,701
07.07.2018, 16:38 8
Цитата Сообщение от nsoznik Посмотреть сообщение
textView.setText(string);
Во время вызова этой строки textview ещё не создан, что тут не понятного?
Я уже сказал, что можно сделать, передавать строку при создании фрагмента в instance, а в onCreateView сеттить текст в уже инициализированный textview.
Можно ещё заюзать moxy, но это для тех, кто имеет какие-то амбиции в программировании.
0
Pablito
2767 / 2198 / 744
Регистрация: 12.05.2014
Сообщений: 7,711
Завершенные тесты: 1
09.07.2018, 10:27 9
Лучший ответ Сообщение было отмечено nsoznik как решение

Решение

если в манифесте ничего не наколдовано насчет пересоздания активити при повороте то я бы начал с того, что удалил нафиг весь этот код
Java
1
2
3
4
5
6
7
   if(fragmentManager.findFragmentByTag("TodayFragment") == null){
                System.err.println("Fragment был null");
                fragmentManager.beginTransaction().add(R.id.tip_container, fragmentTipTextView, "TodayFragment").commit();
            } else {
                System.err.println("Fragment не был null");
                fragmentManager.beginTransaction().show(fragmentManager.findFragmentByTag("TodayFragment")).commit();
            }
точнее оставил бы только
Java
1
fragmentManager.beginTransaction().add(R.id.tip_container, fragmentTipTextView, "TodayFragment").commit();
1
nsoznik
0 / 0 / 0
Регистрация: 21.03.2018
Сообщений: 7
09.07.2018, 18:14  [ТС] 10
Спасибо, это решило проблему. А вот что говорил человек выше я так и не понял)
0
09.07.2018, 18:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2018, 18:14

Не работает метод getText в Fragment
Привет всем, никак не могу понять в чём проблема. Хочу передать Intent из...

Конвертер величин не работает ( Fragment )
Есть фрагмент . В нём я создаю &quot;конвертер величин&quot; , там есть 2 radioGroup(по 4...

Ошибка при загрузки изображений с карты памяти при повороте экрана
Здравствуйте! Вопрос в следующем. Загружаю в активити фотки с камеры. Имя...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru