Доступ к Активити из Fragment-а

| 12.09.2014

В этом уроке мы рассмотрим, как можно получить доступ к Активити из Fragment-а (будем вызывать метод из Активити). Чтобы реализовать это, нам необходимо:

- описать интерфейс с нужными методами в классе Fragment-а
- создать Активити, которое должно имплементировать данный интерфейс и, соответственно, реализовать описанные в интерфейсе методы

После этого мы сможем вызывать данные методы из Fragment-а.

Создадим проект FragmentCallback.

Добавим строковые ресурсы res/values/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">FragmentCallback</string>    
    <string name="fragment_text">Fragment Text</string>
</resources>

Опишем layout для нашего фрагмента — res/layout/test_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/fragment_text"
        android:id="@+id/textView" />
</LinearLayout>

Теперь создадим класс Fragment-а, в котором опишем интерфейс FragmentListener с методом onAttachTestFragment().

TestFragment.java

package ru.androiddocs.fragmentcallback;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class TestFragment extends Fragment {

    FragmentListener mListener;

    public interface FragmentListener {
        public void onAttachTestFragment();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.test_fragment, container, false);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        try {
            mListener = (FragmentListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() 
                    + " must implement FragmentListener");
        }

        mListener.onAttachTestFragment();
    }
}

В методе onCreateView() мы заполняем layout Активити нужным фрагментом. В методе onAttach(), который срабатывает, когда фрагмент уже добавлен к layout-у, мы получаем Активити и приводим его к типу FragmentListener (мы можем это сделать, т.к. оно реализует данный интерфейс). После этого мы вызываем метод onAttachTestFragment() из Активити, который пишем приветствие в логи.

Создадим layout для Активити — res/layout/activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </FrameLayout>

</LinearLayout>

Код самого Активити — MainActivity.java

package ru.androiddocs.fragmentcallback;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;


public class MainActivity extends ActionBarActivity 
        implements TestFragment.FragmentListener {

    private static final String LOG_TAG = "my_log";

    android.support.v4.app.FragmentManager mFragmentManager;
    android.support.v4.app.FragmentTransaction mFragmentTransaction;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mFragmentManager = getSupportFragmentManager();
        mFragmentTransaction = mFragmentManager.beginTransaction();

        mFragmentTransaction.replace(R.id.container, new TestFragment());
        mFragmentTransaction.addToBackStack(null);

        mFragmentTransaction.commit();
    }

    public void onAttachTestFragment() {
        Log.d(LOG_TAG, "Привет! onAttachTestFragment");
    }
}

Если код создания фрагмента не понятен, то рекомендую почитать о работе с фрагментом здесь.

Запускаем приложение и видим текст фрагмента.

Доступ к Активити из Fragment-а

В логах — сообщение из метода Активити:

Доступ к Активити из Fragment-а

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*