С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Jack_killer
0 / 0 / 0
Регистрация: 25.01.2016
Сообщений: 3
#1

Взаимодействие Fragment-ов через Activity (interface) - Программирование Android

26.01.2016, 00:15. Просмотров 561. Ответов 2
Метки нет (Все метки)

Ребята гляньте пожалуйста не замыленным глазом на код.
Пытаюсь понять как организовать взаимодействие фрагментов с помощью активити через интерфейс, но "...что-то пошло не так...", второй день смотрю и не вижу.
Цель:
на первом фрагменте есть TextView и Button - который запускает второй фрагмент
на втором EditText и Button - который передает введенный текст первому фрагменту

Сделал:
фрагменты запускаются как нада, но текст из 2ого фрагмента не отображается на первом.
ошибок не высвечиваются
ссылка на гитт

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
package com.example.jack.interfacecallbackfragment;
 
import android.app.FragmentManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
 
public class MainActivity extends AppCompatActivity implements FirstFragment.CallBackFirstFragment, SecondFragment.CallBackSecondFragment {
    FirstFragment firstFragment;
    SecondFragment secondFragment;
    FragmentManager fragmentManager;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        firstFragment = FirstFragment.newInstance();
        secondFragment = SecondFragment.newInstance();
        fragmentManager = getFragmentManager();
        if (savedInstanceState == null) {
            fragmentManager.beginTransaction()
                    .add(R.id.fragment, firstFragment, FirstFragment.TAG_FRAGMENT)
                    .addToBackStack(null)
                    .commit();
        }
    }
 
    @Override
    public void createFragment2() {
        getFragmentManager()
                .beginTransaction()
                .replace(R.id.fragment, secondFragment)
                .commit();
    }
 
    @Override
    public void sendMessageFromFirstFragment(String msg) {
        fragmentManager.beginTransaction()
                .replace(R.id.fragment, firstFragment)
                .commit();
        if (firstFragment != null) {
            firstFragment.editTextView(msg);
        }
    }
}
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.jack.interfacecallbackfragment.MainActivity">
 
    <FrameLayout
        android:id="@+id/fragment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</RelativeLayout>

FirstFragment
Кликните здесь для просмотра всего текста
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
package com.example.jack.interfacecallbackfragment;
 
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
 
/**
 * Created by jack on 23.01.16.
 */
public class FirstFragment extends Fragment {
    public static final String TAG_FRAGMENT = "first fragment";
 
    TextView tv;
    Button btn;
    CallBackFirstFragment callBackFirstFragment;
    private String SAVE_TAG = "save";
 
    public static FirstFragment newInstance() {
        FirstFragment firstFragment = new FirstFragment();
        return firstFragment;
    }
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_first, container, false);
        return view;
    }
 
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        initInterface();
        initView(view);
        initListener();
 
    }
 
    private void initInterface() {
        callBackFirstFragment = (CallBackFirstFragment) getActivity();
    }
 
    private void initView(View view) {
        tv = (TextView) view.findViewById(R.id.tv);
        btn = (Button) view.findViewById(R.id.btn_second_fragment);
    }
 
    private void initListener() {
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                callBackFirstFragment.createFragment2();
            }
        });
    }
 
    public void editTextView(String string) {
        tv.setText(string);
    }
 
    public interface CallBackFirstFragment {
        void createFragment2();
    }
}
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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
 
    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="text geting from second fragment" />
 
    <Button
        android:id="@+id/btn_second_fragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Start Second Fragment" />
</LinearLayout>

SecondFragment
Кликните здесь для просмотра всего текста
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
package com.example.jack.interfacecallbackfragment;
 
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
 
public class SecondFragment extends Fragment {
 
    public static final String TAG_FRAGMENT = "second fragment";
    CallBackSecondFragment callBackSecondFragment;
    private TextView et;
    private Button btn;
 
    public static SecondFragment newInstance() {
        return new SecondFragment();
    }
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_second, container, false);
    }
 
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        initInterface();
        initView(view);
        initListener();
 
    }
 
    private void initInterface() {
        callBackSecondFragment = (CallBackSecondFragment) getActivity();
    }
 
    private void initView(View view) {
        et = (TextView) view.findViewById(R.id.et);
        btn = (Button) view.findViewById(R.id.btn_send);
    }
 
    private void initListener() {
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                callBackSecondFragment.sendMessageFromFirstFragment(et.getText().toString());
            }
        });
    }
 
 
    public interface CallBackSecondFragment {
        void sendMessageFromFirstFragment(String msg);
    }
 
 
}
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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
 
    <EditText
        android:id="@+id/et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="enter message" />
 
    <Button
        android:id="@+id/btn_send"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="send message from first fragment" />
</LinearLayout>
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2016, 00:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Взаимодействие Fragment-ов через Activity (interface) (Программирование Android):

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

Fragment не отображается на Activity - Программирование Android
Здравствуйте! Помогите, пожалуйста, разобраться. Суть такая: пользователь проходит упражнение по переводу слова на другой язык, т.е....

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

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

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

Переход между fragment и activity - Программирование Android
Доброй ночи) возникла необходимость обратного перехода от активити во фрагмент, при этом ничего обратно передать не надо. То есть...

2
Lumber
99 / 99 / 37
Регистрация: 02.12.2015
Сообщений: 239
26.01.2016, 05:53 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Дело в том, что после того как текст TextView меняется, происходит вызов onCreateView первого фрагмента. И весь layout разворачивается заново.
Это происходит потому что первый фрагмент удаляется с activity командой replace.
Т.е. текст меняется в мусоре, не удалённым сборщиком только потому что осталась ссылка на него в классе firstFragment.

Можно не удалять а просто наложить второй фрагмент поверх него.
А по завершении работы с ним - убрать. Тогда первый фрагмент не будет удалён, а просто остановлен.
(только layout второго фрагмента поправить надо - сделать фон не прозрачный)

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Override
public void createFragment2() {
    secondFragment = SecondFragment.newInstance();
    getFragmentManager()
            .beginTransaction()
            .add(R.id.fragment, secondFragment)
            .commit();
}
 
@Override
public void sendMessageFromFirstFragment(String msg) {
    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction()
            .remove(secondFragment)
            .commit();
 
    if (firstFragment != null) {
        firstFragment.editTextView(msg);
    }
}
1
Jack_killer
0 / 0 / 0
Регистрация: 25.01.2016
Сообщений: 3
27.01.2016, 02:52  [ТС] #3
Спасибо! теперь понял (наверное) как работает жизненый цикл фрагмента.
то как вы сказали - работает.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2016, 02:52
Привет! Вот еще темы с ответами:

Передача параметров с Activity в Fragment - Программирование Android
Здравствуйте! У меня не получается передать параметры с Activity в Fragment. Я пытался сделать это следующим образом: В Activity: ...

Передача данных из Activity в Fragment - Программирование Android
Есть основной класс (puplic class ViewContact) в котором есть фрагменты (public static class MainFragment extends Fragment), есть база...

Принятие данных из Activity в Fragment - Программирование Android
Здравствуйте, Дело вот как обстоит, мне нужно приянять один стринг параметр в фрагменте для дальнейшей обработки. Пытался таким...

Fragment, Splash-activity, Jsoup onPostExecute - Программирование Android
Есть 2 фрагмента, собственно первый это сплеш-активити, перед запуском самого приложения: protected void onCreate(Bundle...


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

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

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