Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/29: Рейтинг темы: голосов - 29, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 03.05.2015
Сообщений: 14
1

Fragment не отображается на Activity

16.05.2015, 22:15. Показов 5539. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Помогите, пожалуйста, разобраться.
Суть такая: пользователь проходит упражнение по переводу слова на другой язык, т.е. совершает несколько одинаковых действий подряд(цикл). На активити размещен FrameLayout и кнопка. При открытии активити во FrameLayout загружается фрагмент со словом из БД, которое нужно перевести, и полем editText. При нажатии на кнопку идет проверка введенных данных, и в FrameLayout загружается тот же фрагмент, но уже с новым словом, и так несколько раз.
Все вроде работает, в логи выводится информация, поступающая из БД в фрагмент, но проблема вот в чем: фрагмент не отображается на экране. То есть при первом открытии активити - отображается, а при нажатии кнопки уже нет.
А если вместо того же самого фрагмента при нажатии на кнопку открою другой, тот отображается. Не доходит, в чем ошибка.
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
public class ExTranslateRus extends ActionBarActivity implements OnClickListener {
    //...
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_exercize);
 
        //...
 
        frag = new Fragment1();
        fragTrans = getFragmentManager().beginTransaction();
        fragTrans.add(R.id.fragCont, frag); //помещаем фрагмент в контейнер
        fragTrans.commit();
 
        myPrefs = getSharedPreferences("MyPrefs", MODE_PRIVATE);
        i = myPrefs.getInt("i", 123); //i - номер прохода цикла (упражнения)
        if (i == 0) {
            i = i + 1;
            Editor editor = myPrefs.edit();
            editor.remove("i");
            editor.putInt("i", i);
            editor.apply();
        }
        i = myPrefs.getInt("i", 123);
        Log.d(LOG_TAG, "i="+i);
 
        btnNext = (Button) findViewById(R.id.btnNext);
        btnNext.setOnClickListener(this);
 
    }
 
    @Override
    public void onClick (View view){
 
        //проверка правильности ответа 
        //...
     
        //проверка номера прохода по циклу
        i = myPrefs.getInt("i", 123); 
        if (i < 8) { 
            i = i +1;
            fragTrans = getFragmentManager().beginTransaction();
            fragTrans.remove(frag); //удаляем текущий фрагмент
            fragTrans.commit();
            fragTrans = getFragmentManager().beginTransaction();
            fragTrans.add(R.id.fragCont, frag); //вставляем фрагмент заново
            fragTrans.commit();
            //если убрать remove(frag) - содержимое контейнера вообще не меняется,
            //и код фрагмента не выполняется
            //replace вместо add тоже не помогает
            //...
        } else {
            //...
            Intent intent2 = new Intent(this, ResultExercize.class);
            startActivity(intent2);
        }
    }
 
    public static class Fragment1 extends Fragment {
 
        //...
 
        @Override
        public View onCreateView (LayoutInflater inflater, ViewGroup container,
                                  Bundle savedInstanceState) {
            View rootview = inflater.inflate(R.layout.ex_translate_rus, null);
 
            // выполнение запроса из БД, вывод в текстВью
            //...
 
            return rootview;
        }
    }
}
Файл xml активити:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ExTranslateRus"
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/fragCont">
    </FrameLayout>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnNext"
        android:text="@string/next"/>
</LinearLayout>
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.05.2015, 22:15
Ответы с готовыми решениями:

Activity и Fragment
Всем добрый вечер. Создал приложение новостей с 2 Activity и 1 Adapter. Сейчас решил в проект...

Переход из Fragment в Activity
как реализовать переход из Fragment В activity в фрагменте кнопка при нажатии которой происходит...

Использование Fragment в Activity
Здравствуйте, делаю модуль для регистрации юзера, она прозодит в несколько этапов, сначала вводится...

Вызов fragment из activity
Доброго времени суток ! Есть main где указан navigationDrawler и в файле xml добавлен FrameLayout...

12
266 / 242 / 96
Регистрация: 11.01.2015
Сообщений: 673
16.05.2015, 22:52 2
Зачем его удалять и добавлять заново? Для обновления данных? Это как странно.
0
0 / 0 / 0
Регистрация: 03.05.2015
Сообщений: 14
17.05.2015, 17:50  [ТС] 3
Mikalai, да, еще для того, чтобы анимация была слайд влево, типа переход к следующему упражнению.
Я начинающий разработчик под Android, поэтому пока даже не знаю, как реализовать это иначе, прошу помочь разобраться с тем, что есть.
0
266 / 242 / 96
Регистрация: 11.01.2015
Сообщений: 673
17.05.2015, 18:15 4
Можно попробовать создать 2 фрагмента одинаковых и менять их:
Java
1
2
frag1 = new Fragment1();
frag2 = new Fragment1();
Java
1
2
3
4
fragTrans = getFragmentManager().beginTransaction();
fragTrans.remove(frag1); //удаляем текущий фрагмент
fragTrans.add(R.id.fragCont, frag2); //вставляем фрагмент заново
fragTrans.commit();
1
0 / 0 / 0
Регистрация: 03.05.2015
Сообщений: 14
18.05.2015, 11:52  [ТС] 5
Mikalai, хотелось бы поменьше кода, но вроде работает, так что сойдет. Спасибо!
0
266 / 242 / 96
Регистрация: 11.01.2015
Сообщений: 673
18.05.2015, 12:39 6
madmonkey, я же не предлагал писать ещё один класс для второго фрагмента. Я предложил создать ещё один объект того же класса. С учётом всех изменений в моём варианте на одну строку кода меньше
0
0 / 0 / 0
Регистрация: 03.05.2015
Сообщений: 14
18.05.2015, 16:26  [ТС] 7
Mikalai, а, блин. Я дико затупила) не обратила внимания Еще раз спасибо!)

Добавлено через 2 часа 55 минут
Проблема не решилась до конца. Данные обновляются, но отображаются не обновленные данные, а те, которые были при первом открытии фрагмента. То есть теперь у меня просто чередуются 2 разных экрана
0
266 / 242 / 96
Регистрация: 11.01.2015
Сообщений: 673
18.05.2015, 17:01 8
Вот тут можно найти перечисление всех методов жизненного цикла фрагмента. Переопредели их все и поставь в каждом лог что бы увидеть когда какой метод вызывается. Наверное ты не из того метода запрос делаешь и меняешь View-элементы.
0
0 / 0 / 0
Регистрация: 03.05.2015
Сообщений: 14
19.05.2015, 00:54  [ТС] 9
До меня что-то плохо доходит пока, запрос и вставка данных в TextView происходили в методе onCreateView. Я перенесла создание запроса в метод onCreate фрагмента, это не помогло. Может где-то в onClick при нажатии кнопки надо удалять фрагмент? я перепробовала все, до чего додумалась, наверняка истина где-то рядом, но я в упор не вижу.
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
public static class Fragment1 extends Fragment {
 
        SQLiteDatabase db;
        Cursor c;
        Database dbHelper;
        String[] unitId;
        TextView tv;
        String word, trans, query, nameEsp;
        EditText et;
        String LOG_TAG = "myLogsFragment";
        SharedPreferences myPrefs;
        Editor editor;
 
 
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            Log.d(LOG_TAG, "Fragment1 onAttach");
        }
 
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.d(LOG_TAG, "Fragment1 onCreate");
            
            dbHelper = new Database(getActivity());
            db = dbHelper.getReadableDatabase();
 
            query = "select word, trans_w from words where _id_u = ? order by random() limit 1";
            unitId = new String[] {"1"};
                    
            c = db.rawQuery(query, unitId);
            c.moveToFirst();
            word = c.getString(c.getColumnIndex("word"));
            trans = c.getString(c.getColumnIndex("trans_w"));
            
            Log.d(LOG_TAG, "--- SELECTED WORD: " + word + " " + trans + " ---");
 
        }
 
        @Override
        public View onCreateView (LayoutInflater inflater, ViewGroup container,
                                  Bundle savedInstanceState) {
            Log.d(LOG_TAG, "Fragment1 onCreateView");
            View rootview = inflater.inflate(R.layout.ex_translate_rus, null);
            et = (EditText) rootview.findViewById(R.id.editText);
            tv = (TextView) rootview.findViewById(R.id.textView);
            tv.setText(word);
            return rootview;
        }
 
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            Log.d(LOG_TAG, "Fragment1 onActivityCreated");
        }
 
        public void onStart() {
            super.onStart();
            Log.d(LOG_TAG, "Fragment1 onStart");
        }
 
        public void onResume() {
            super.onResume();
            Log.d(LOG_TAG, "Fragment1 onResume");
        }
 
        public void onPause() {
            super.onPause();
            Log.d(LOG_TAG, "Fragment1 onPause");
        }
 
        public void onStop() {
            super.onStop();
            Log.d(LOG_TAG, "Fragment1 onStop");
        }
 
        public void onDestroyView() {
            super.onDestroyView();
            Log.d(LOG_TAG, "Fragment1 onDestroyView");
        }
 
        @Override
        public void onDestroy() {
            super.onDestroy();
            c.close();
            db.close();
            Log.d(LOG_TAG, "Fragment1 onDestroy");
        }
 
        public void onDetach() {
            super.onDetach();
            Log.d(LOG_TAG, "Fragment1 onDetach");
        }
    }
метод onClick:
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
@Override
    public void onClick (View view){
        if (i % 2 != 0) {
            et = ((EditText)frag1.getView().findViewById(R.id.editText));
        }
        else {
            et = ((EditText)frag2.getView().findViewById(R.id.editText));
        }
 
        Log.d(LOG_TAG, "--- the button is clicked ---");
        trans1 = myPrefs.getString("translation", "");
        answer = et.getText().toString();
        Log.d(LOG_TAG, "edit text answer: " + answer + " myPrefs translation: " + trans);
 
        if (answer.equalsIgnoreCase(trans1)){
            Log.d(LOG_TAG, "the answer is right");
            Toast.makeText(this, "Правильно!", Toast.LENGTH_SHORT).show();
        } else { Log.d(LOG_TAG, "the answer is wrong");
            Toast.makeText(this, "Неправильно!\nВерный ответ: " + trans, Toast.LENGTH_SHORT).show(); }
 
        i = myPrefs.getInt("i", 123);
        Log.d(LOG_TAG, "i < 8? : " + i);
        if (i < 8) {
            i = i +1;
            if (i % 2 !=0) {
                fragTrans = getFragmentManager().beginTransaction();
                fragTrans.setCustomAnimations(R.anim.slide_left_frag_in, R.anim.slide_left_frag_out);
                //fragTrans.addToBackStack(null);
                fragTrans.replace(R.id.fragCont, frag1);
                fragTrans.commit();
            } else {
                fragTrans = getFragmentManager().beginTransaction();
                fragTrans.setCustomAnimations(R.anim.slide_left_frag_in, R.anim.slide_left_frag_out);
                //fragTrans.addToBackStack(null);
                fragTrans.replace(R.id.fragCont, frag2);
                fragTrans.commit();
            }
            ed.remove("i");
            ed.putInt("i", i);
            ed.apply();
        } else {
            ed.remove("i");
            ed.putInt("i", 0);
            ed.apply();
            Intent intent2 = new Intent(this, ResultExercize.class);
            startActivity(intent2);
            transitionType = TransitionType.SlideLeft;
            overridePendingTransition(R.anim.slide_left_in, R.anim.slide_left_out);
        }
    }
0
266 / 242 / 96
Регистрация: 11.01.2015
Сообщений: 673
19.05.2015, 01:34 10
Попробуй как-то так сделать:

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
public class Fragment1 extends Fragment {
 
    SQLiteDatabase db;
    Cursor c;
    Database dbHelper;
    String[] unitId;
    TextView tv;
    String word, trans, query;
    EditText et;
 
    @Override
    public View onCreateView (LayoutInflater inflater, ViewGroup container,
                              Bundle savedInstanceState) {
        View rootview = inflater.inflate(R.layout.ex_translate_rus, null);
        et = (EditText) rootview.findViewById(R.id.editText);
        tv = (TextView) rootview.findViewById(R.id.textView);
        return rootview;
    }
 
 
    public void onResume() {
        super.onResume();
        dbJob();
        tv.setText(word);
    }
 
    private void dbJob() {
        dbHelper = new Database(getActivity());
        db = dbHelper.getReadableDatabase();
 
        query = "select word, trans_w from words where _id_u = ? order by random() limit 1";
        unitId = new String[] {"1"};
 
        c = db.rawQuery(query, unitId);
        c.moveToFirst();
        word = c.getString(c.getColumnIndex("word"));
        trans = c.getString(c.getColumnIndex("trans_w"));
 
        Log.d("myLogsFragment", "--- SELECTED WORD: " + word + " " + trans + " ---");
        c.close();
        db.close();
    }
}
0
0 / 0 / 0
Регистрация: 03.05.2015
Сообщений: 14
19.05.2015, 02:22  [ТС] 11
Mikalai, о, вроде сработало, один недочет только: при втором и последующих открытиях фрагмента в поле EditText (или RadioButton - в других упражнениях) остаются введенные пользователем данные с предыдущего открытия. Понимаю, что при нажатии кнопки их можно как-то очищать, но наверно это не совсем верное решение
0
266 / 242 / 96
Регистрация: 11.01.2015
Сообщений: 673
19.05.2015, 09:47 12
Нормальное решение очищать. Если нужно очищать очищай.

Java
1
editText.setText("");
Java
1
2
3
4
5
RadioGroup radiogroup;
 
//.........
 
radiogroup.clearCheck();
0
0 / 0 / 0
Регистрация: 03.05.2015
Сообщений: 14
19.05.2015, 14:52  [ТС] 13
Mikalai, ну ладно, пусть будет так. Все работает. Спасибо)
0
19.05.2015, 14:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.05.2015, 14:52
Помогаю со студенческими работами здесь

Переход с fragment на activity
в проекте 3 фрагмента, в фрагменте есть кнопка, если нажать эту кнопку тебя должно перенести на...

Callbeck from Activity to Fragment
При нажатии кнопки в активити должен отрабатывал метод в фрагменте (допустим обновляться вюшка). ...

Fragment вместо Activity
Использую фрагмент вместо Activity. Но теперь методы не запускаются с фрагментов. Как можно...

Fragment не передаётся в Activity
Приложение для планшета. Учусь, как вложить Fragment в Activity Activity Class &quot;MainActivity&quot;...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru