Взаимодействие между фрагментами и активностью в Android Studio. Часть 2. Простые способы
Вторая часть серии статей про взаимодействие фрагментов и активности.
📖 Содержание ⬇️
Содержание
- При старте приложения отправляем информацию в фрагмент из активности
- Получаем информацию из активности в фрагменте при клике кнопки активности
- Получаем информацию из активности в фрагменте при клике кнопки фрагмента
- Получаем информацию из фрагмента в активности при клике кнопки активности
- Получаем информацию из фрагмента в активности при клике кнопки фрагмента
Все статьи цикла «Взаимодействие между фрагментами и активностью в Android Studio»:
- Взаимодействие между фрагментами и активностью в Android Studio. Часть 1. Подготовка | ↗️
- Взаимодействие между фрагментами и активностью в Android Studio. Часть 2. Простые способы | ↗️
- Взаимодействие между фрагментами и активностью в Android Studio. Часть 3. Через интерфейсы | ↗️
- Взаимодействие между фрагментами и активностью в Android Studio. Часть 4. Через намерения | ↗️
- Взаимодействие между фрагментами и активностью в Android Studio. Часть 5. Несколько фрагментов | ↗️
Предыдущая часть Взаимодействие между фрагментами и активностью в Android Studio. Часть 1. Подготовка | ↗️.
При старте приложения отправляем информацию в фрагмент из активности
Задача. При запуске приложения главная активность отправляет текст Hello, World! в фрагмент, который отображается в в поле textViewFragment1 фрагмента.
Решение. При создании фрагмента нужные данные закинем в Bundle, например, по ключу text:
FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentById(R.id.fragmentContainer);
if (fragment == null) {
fragment = new Fragment1();
Bundle bundle = new Bundle();
bundle.putString("text", "Hello, World!");
fragment.setArguments(bundle);
fm.beginTransaction()
.add(R.id.fragmentContainer, fragment)
.commit();
}

Рисунок 1 — Код с использованием Bundle
В фрагменте в методе onCreateView() считываем пришедшую информацию по заданному ключу text:
String textFromActivity = getArguments().getString("text");
textViewFragment1.setText(textFromActivity);

Рисунок 2 — Обработка полученных данных во фрагменте

Рисунок 3 — Результат выполнения программы
Но предложенное решение не самое хорошее. Почему? Активность хранит у себя информацию о ключе фрагмента. Это не хорошо. Было бы хорошо, если бы только фрагмент хранил информацию о ключе.
В фрагменте создадим статическую переменную KEY:
public static final String KEY = "text";

Рисунок 4 — Создание статической переменной во фрагменте
Теперь в активности значение ключа будем вытаскивать из фрагмента Fragment1.KEY:
bundle.putString(Fragment1.KEY, "Hello, World!");

Рисунок 5 — Использование ключа в активности

Рисунок 6 — Результат выполнения программы
Приведу полные коды файлов.
Полные коды файлов
MainActivity.java:
package com.example.fragments;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private EditText editText;
private TextView textView;
private Button button;
private FrameLayout fragmentContainer;
private FrameLayout fragmentContainer2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.editText);
textView = (TextView) findViewById(R.id.textView);
button = (Button) findViewById(R.id.button);
fragmentContainer = (FrameLayout) findViewById(R.id.fragmentContainer);
fragmentContainer2 = (FrameLayout) findViewById(R.id.fragmentContainer2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentById(R.id.fragmentContainer);
if (fragment == null) {
fragment = new Fragment1();
Bundle bundle = new Bundle();
bundle.putString(Fragment1.KEY, "Hello, World!");
fragment.setArguments(bundle);
fm.beginTransaction()
.add(R.id.fragmentContainer, fragment)
.commit();
}
}
}
Fragment1.java:
package com.example.fragments;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Fragment1 extends Fragment {
private EditText editTextFragment1;
private TextView textViewFragment1;
private Button buttonFragment1;
public static final String KEY = "text";
public Fragment1() {
}
public static Fragment1 newInstance(String param1, String param2) {
Fragment1 fragment = new Fragment1();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_1, container, false);
editTextFragment1 = (EditText) view.findViewById(R.id.editTextFragment1);
textViewFragment1 = (TextView) view.findViewById(R.id.textViewFragment1);
buttonFragment1 = (Button) view.findViewById(R.id.buttonFragment1);
buttonFragment1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
String textFromActivity = getArguments().getString("text");
textViewFragment1.setText(textFromActivity);
return view;
}
}
Получаем информацию из активности в фрагменте при клике кнопки активности
Задача. При нажатии на кнопку button в главной активности текст из editText главной активности должен отобразится в поле textViewFragment1 фрагмента.
Решение. Тут всё просто. Реализуем какой-нибудь метод во фрагменте, который будем вызвать, чтобы отправить во фрагмент информацию. Например, реализуем метод sendData():
public void sendData(String data) {
if (data != null)
textViewFragment1.setText(data);
}

Рисунок 7 — Метод sendData()
Теперь в клике кнопки button активности нам нужно найти текущий фрагмент, который находится в контейнере fragmentContainer:
Fragment1 fragment1 = (Fragment1)getSupportFragmentManager()
.findFragmentById(R.id.fragmentContainer);
А потом уже у фрагмента вызвать наш метод sendData():
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Fragment1 fragment1 = (Fragment1)getSupportFragmentManager()
.findFragmentById(R.id.fragmentContainer);
if (fragment1 != null) {
String S = editText.getText().toString();
fragment1.sendData(S);
}
}
});

Рисунок 8 — Результат выполнения программы
Полные коды файлов
Полный код MainActivity.java:
package com.example.fragments;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private EditText editText;
private TextView textView;
private Button button;
private FrameLayout fragmentContainer;
private FrameLayout fragmentContainer2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.editText);
textView = (TextView) findViewById(R.id.textView);
button = (Button) findViewById(R.id.button);
fragmentContainer = (FrameLayout) findViewById(R.id.fragmentContainer);
fragmentContainer2 = (FrameLayout) findViewById(R.id.fragmentContainer2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Fragment1 fragment1 = (Fragment1)getSupportFragmentManager()
.findFragmentById(R.id.fragmentContainer);
if (fragment1 != null) {
String S = editText.getText().toString();
fragment1.sendData(S);
}
}
});
FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentById(R.id.fragmentContainer);
if (fragment == null) {
fragment = new Fragment1();
fm.beginTransaction()
.add(R.id.fragmentContainer, fragment)
.commit();
}
}
}
Полный код Fragment1.java:
package com.example.fragments;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Fragment1 extends Fragment {
private EditText editTextFragment1;
private TextView textViewFragment1;
private Button buttonFragment1;
public Fragment1() {
}
public static Fragment1 newInstance(String param1, String param2) {
Fragment1 fragment = new Fragment1();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_1, container, false);
editTextFragment1 = (EditText) view.findViewById(R.id.editTextFragment1);
textViewFragment1 = (TextView) view.findViewById(R.id.textViewFragment1);
buttonFragment1 = (Button) view.findViewById(R.id.buttonFragment1);
buttonFragment1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
return view;
}
public void sendData(String data) {
if (data != null)
textViewFragment1.setText(data);
}
}
Получаем информацию из активности в фрагменте при клике кнопки фрагмента
Задача. При нажатии на кнопку buttonFragment1 в фрагменте текст из editText главной активности должен отобразится в поле textViewFragment1 фрагмента.
Если в прошлый раз мы нажимали кнопку в активности, то сейчас будем нажимать в фрагменте.
В коде я откатываюсь к Взаимодействие между фрагментами и активностью в Android Studio. Часть 1. Подготовка | ↗️.
Решение. Мы из фрагмента можем получить доступ к активности, где располагается данный фрагмент, через getActivity(). Поэтому код клика кнопки buttonFragment1 будет таким:
buttonFragment1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText editText = (EditText) getActivity().findViewById(R.id.editText);
String S = editText.getText().toString();
textViewFragment1.setText(S);
}
});

Рисунок 9 — Результат выполнения программы
Код MainActivity.java не меняется.
Полные коды файлов
Полный код MainActivity.java. По сравнению с точкой сохранения тут ничего не поменялось:
package com.example.fragments;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private EditText editText;
private TextView textView;
private Button button;
private FrameLayout fragmentContainer;
private FrameLayout fragmentContainer2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.editText);
textView = (TextView) findViewById(R.id.textView);
button = (Button) findViewById(R.id.button);
fragmentContainer = (FrameLayout) findViewById(R.id.fragmentContainer);
fragmentContainer2 = (FrameLayout) findViewById(R.id.fragmentContainer2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentById(R.id.fragmentContainer);
if (fragment == null) {
fragment = new Fragment1();
fm.beginTransaction()
.add(R.id.fragmentContainer, fragment)
.commit();
}
}
}
Полный код Fragment1.java:
package com.example.fragments;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Fragment1 extends Fragment {
private EditText editTextFragment1;
private TextView textViewFragment1;
private Button buttonFragment1;
public Fragment1() {
}
public static Fragment1 newInstance(String param1, String param2) {
Fragment1 fragment = new Fragment1();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_1, container, false);
editTextFragment1 = (EditText) view.findViewById(R.id.editTextFragment1);
textViewFragment1 = (TextView) view.findViewById(R.id.textViewFragment1);
buttonFragment1 = (Button) view.findViewById(R.id.buttonFragment1);
buttonFragment1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText editText = (EditText) getActivity().findViewById(R.id.editText);
String S = editText.getText().toString();
textViewFragment1.setText(S);
}
});
return view;
}
}
Получаем информацию из фрагмента в активности при клике кнопки активности
Задача. При нажатии на кнопку button в активности текст из editTextFragment1 фрагмента должен отобразится в поле textView активности.
В коде я откатываюсь к Взаимодействие между фрагментами и активностью в Android Studio. Часть 1. Подготовка | ↗️.
Решение. Мы можем в фрагменте определить метод getData(), который будет возвращать значение из поля ввода:
String getData() {
return editTextFragment1.getText().toString();
}

Рисунок 10 — Метод getData()
Теперь в активности мы можем при клике кнопки вызвать этот метод getData():
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Fragment1 fragment1 = (Fragment1)getSupportFragmentManager()
.findFragmentById(R.id.fragmentContainer);
if (fragment1 != null) {
String S = fragment1.getData();
textView.setText(S);
}
}
});

Рисунок 11 — Метод обработки клика кнопки в активности

Рисунок 12 — Результат выполнения программы
Полные коды файлов
Файл MainActivity.java:
package com.example.fragments;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private EditText editText;
private TextView textView;
private Button button;
private FrameLayout fragmentContainer;
private FrameLayout fragmentContainer2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.editText);
textView = (TextView) findViewById(R.id.textView);
button = (Button) findViewById(R.id.button);
fragmentContainer = (FrameLayout) findViewById(R.id.fragmentContainer);
fragmentContainer2 = (FrameLayout) findViewById(R.id.fragmentContainer2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Fragment1 fragment1 = (Fragment1)getSupportFragmentManager()
.findFragmentById(R.id.fragmentContainer);
if (fragment1 != null) {
String S = fragment1.getData();
textView.setText(S);
}
}
});
FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentById(R.id.fragmentContainer);
if (fragment == null) {
fragment = new Fragment1();
fm.beginTransaction()
.add(R.id.fragmentContainer, fragment)
.commit();
}
}
}
Файл Fragment1.java:
package com.example.fragments;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Fragment1 extends Fragment {
private EditText editTextFragment1;
private TextView textViewFragment1;
private Button buttonFragment1;
public Fragment1() {
}
public static Fragment1 newInstance(String param1, String param2) {
Fragment1 fragment = new Fragment1();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_1, container, false);
editTextFragment1 = (EditText) view.findViewById(R.id.editTextFragment1);
textViewFragment1 = (TextView) view.findViewById(R.id.textViewFragment1);
buttonFragment1 = (Button) view.findViewById(R.id.buttonFragment1);
buttonFragment1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
return view;
}
String getData() {
return editTextFragment1.getText().toString();
}
}
Получаем информацию из фрагмента в активности при клике кнопки фрагмента
Задача. При нажатии на кнопку buttonFragment1 в фрагменте текст из editTextFragment1 фрагмента должен отобразится в поле textView активности.
В коде я откатываюсь к Взаимодействие между фрагментами и активностью в Android Studio. Часть 1. Подготовка | ↗️.
Решение. Мы из фрагмента можем получить доступ к активности, где располагается данный фрагмент, через getActivity(). Поэтому код клика кнопки buttonFragment1 будет таким:
buttonFragment1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TextView textView = (TextView) getActivity().findViewById(R.id.textView);
String S = editTextFragment1.getText().toString();
textView.setText(S);
}
});

Рисунок 13 — Метод обработки клика кнопки фрагмента

Рисунок 14 — Результат выполнения программы
Код файла MainActivity.java не меняется.
Полные коды файлов
Файл MainActivity.java:
package com.example.fragments;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private EditText editText;
private TextView textView;
private Button button;
private FrameLayout fragmentContainer;
private FrameLayout fragmentContainer2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.editText);
textView = (TextView) findViewById(R.id.textView);
button = (Button) findViewById(R.id.button);
fragmentContainer = (FrameLayout) findViewById(R.id.fragmentContainer);
fragmentContainer2 = (FrameLayout) findViewById(R.id.fragmentContainer2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentById(R.id.fragmentContainer);
if (fragment == null) {
fragment = new Fragment1();
fm.beginTransaction()
.add(R.id.fragmentContainer, fragment)
.commit();
}
}
}
Файл Fragment1.java:
package com.example.fragments;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Fragment1 extends Fragment {
private EditText editTextFragment1;
private TextView textViewFragment1;
private Button buttonFragment1;
public Fragment1() {
}
public static Fragment1 newInstance(String param1, String param2) {
Fragment1 fragment = new Fragment1();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_1, container, false);
editTextFragment1 = (EditText) view.findViewById(R.id.editTextFragment1);
textViewFragment1 = (TextView) view.findViewById(R.id.textViewFragment1);
buttonFragment1 = (Button) view.findViewById(R.id.buttonFragment1);
buttonFragment1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TextView textView = (TextView) getActivity().findViewById(R.id.textView);
String S = editTextFragment1.getText().toString();
textView.setText(S);
}
});
return view;
}
}
Следующая часть Взаимодействие между фрагментами и активностью в Android Studio. Часть 3. Через интерфейсы | ↗️.