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

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

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

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

26.01.2016, 00:15. Просмотров 349. Ответов 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>
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2016, 00:15     Взаимодействие Fragment-ов через Activity (interface)
Посмотрите здесь:

Принятие данных из Activity в Fragment Android
Android Fragment вместо Activity
Android Ошибка при конвертации класса Activity в Fragment (SherlockFragment)
Способ перехода к другому Activity через перемещение пальцем Android
Android Переход между fragment и activity
Передача данных из Activity в Fragment Android
Android Обновление fragment из другого fragment
Android Fragment не отображается на Activity
Передача параметров с Activity в Fragment Android
Переход из Fragment в Activity Android
Использование Fragment в Activity Android
Android Fragment, Splash-activity, Jsoup onPostExecute

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Lumber
96 / 96 / 36
Регистрация: 02.12.2015
Сообщений: 236
26.01.2016, 05:53     Взаимодействие Fragment-ов через Activity (interface) #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);
    }
}
Jack_killer
0 / 0 / 0
Регистрация: 25.01.2016
Сообщений: 3
27.01.2016, 02:52  [ТС]     Взаимодействие Fragment-ов через Activity (interface) #3
Спасибо! теперь понял (наверное) как работает жизненый цикл фрагмента.
то как вы сказали - работает.
Yandex
Объявления
27.01.2016, 02:52     Взаимодействие Fragment-ов через Activity (interface)
Ответ Создать тему
Опции темы

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