Передача данных между активностями или фрагментами – одна из основных концепций, которую необходимо изучить, когда вы начинаете заниматься разработкой android. Несмотря на то, что activities и fragments – это не что иное, как классы, в android они считаются специальными классами, поскольку являются основополагающими для работы пользовательского интерфейса android. Поэтому мы передаем им данные не просто через конструкторы, а одним из следующих трех способов:

  1. Intent.
  2. Пучок
  3. ViewModel

Все это мы рассмотрим на практических примерах в этом уроке. Давайте начнем.

Пример 1: Передача данных в Android – фрагмент в активность через интент.

Мы рассмотрели, как передавать данные от активности к фрагменту, как передавать список/объект от активности к активности, а также простые примитивные типы данных.

Сегодня мы рассмотрим, как передать простые типы данных из фрагмента в активность. Мы передаем данные через объект Intent.

Что такое фрагмент?

Фрагмент" – это субактивность с собственным жизненным циклом. Фрагменты размещаются в активностях. Одна деятельность может содержать несколько фрагментов.

Зачем передавать данные из фрагмента в активность?

Нет. Причина
1. Фрагменты являются суб-активностями и позволяют нам иметь различные экраны без необходимости создавать много активностей. Следовательно, нам нужно знать, как передать данные из фрагмента в активность.
2. Фрагменты, такие как Activities являются специальными классами пользовательского интерфейса, представляющими окно, и поэтому мы не можем передавать данные напрямую, как это делается с обычными классами.

Введение

  • У нас есть два класса: один – MainActivity, а другой – MyFragment.
  • Когда мы нажимаем кнопку FAB (Floating Action Button), мы открываем MyFragment через Fragment Transaction, прикрепляя его к FrameLayout, который мы определим.
  • Фрагмент содержит текст для редактирования и спиннер.
  • Пользователь вводит название космического аппарата и выбирает год запуска в крутилке.
  • Затем мы передаем эти данные обратно в MainActivity.
  • Затем отображаем полученные данные в текстовом окне.
  • В качестве IDE мы использовали Android Studio.
  • Код хорошо прокомментирован для облегчения понимания.

Общие вопросы, на которые мы отвечаем

На этом простом примере мы изучили следующее:

  • Как передать данные из фрагмента в активность.
  • Как передавать данные между фрагментом и активностью, используя намерения.
  • Как мне выполнить FragmentTransaction.
  • Переопределение onResume() и получение данных в android.
  • Как работать как с фрагментом, так и с активностью.

Используемые инструменты

  • IDE : Android Studio
  • OS : Windows 8.1
  • ПЛАТФОРМА : Android
  • ЯЗЫК : Java
  • TOPIC : Intent, Data Passing, Fragment.

Поехали.

Давайте посмотрим на исходный код.

1. Build.gradle

  • Внешние зависимости не нужны.

2. MainActivity.java

  • Наша MainActivity, запускающая activity.
  • Сначала мы ссылаемся на представления, в данном случае на простые текстовые представления для отображения полученных данных.
  • У нас есть метод: receiveData(), который отвечает за прием и распаковку данных, полученных от класса MyFragment.
  • Мы будем получать данные в методе onResume().
  • Поскольку методы вызываются не только при возобновлении работы с фрагментом, но и после создания и запуска активности, нам нужно будет идентифицировать вызывающего с помощью простой строки Sender, которую мы будем отправлять каждый раз, когда отправляем данные из фрагмента.
  • Если отправителем является MyFragment, то мы продолжаем распаковывать наши данные.

package com.tutorials.hp.datafragment_activity;

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private TextView nameTxt,yearTxt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

    //REFERENCE VIEWS
        nameTxt= (TextView) findViewById(R.id.nameTxt);
        yearTxt= (TextView) findViewById(R.id.yearTxt);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
              openFragment();
            }
        });
    }
/*
WHEN ACTIVITY RESUMES
*/
    @Override
    protected void onResume() {
        super.onResume();

    //DETERMINE WHO STARTED THIS ACTIVITY
    final String sender=this.getIntent().getExtras().getString("SENDER_KEY");

    //IF ITS THE FRAGMENT THEN RECEIVE DATA
        if(sender != null)
        {
            this.receiveData();
            Toast.makeText(this, "Received", Toast.LENGTH_SHORT).show();

        }
    }

    /*
        OPEN FRAGMENT
         */
    private void openFragment()
    {
        //PASS OVER THE BUNDLE TO OUR FRAGMENT
        MyFragment myFragment = new MyFragment();
        //THEN NOW SHOW OUR FRAGMENT
        getSupportFragmentManager().beginTransaction().replace(R.id.container,myFragment).commit();
    }

    /*
    RECEIVE DATA FROM FRAGMENT
     */
    private void receiveData()
    {
        //RECEIVE DATA VIA INTENT
        Intent i = getIntent();
        String name = i.getStringExtra("NAME_KEY");
        int year = i.getIntExtra("YEAR_KEY",0);

        //SET DATA TO TEXTVIEWS
        nameTxt.setText(name);
        yearTxt.setText(String.valueOf(year));
    }
}

3. MyFragment.java

  • Наш класс Fragment.
  • Мы используем либарию поддержки Fragment, поэтому мы расширяем android.support.v4.app.Fragment“.
  • Здесь у нас есть текст для редактирования, кнопка и спиннер.
  • Пользователь должен ввести название космического аппарата в edittext, выбрать год запуска в spinner и нажать кнопку send, чтобы отправить данные в MainActivity.
  • Мы отправляем и упаковываем данные в intent.
  • Мы также отправляем переменную, которую называем sender, чтобы идентифицировать отправителя этих данных как этот фрагмент.

package com.tutorials.hp.datafragment_activity;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;

/
 * A simple Fragment subclass.
 */
public class MyFragment extends Fragment {

    private EditText nameFragTxt;
    private Spinner launchYearSpinner;
    private Button sendBtn;

    public MyFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        // Inflate the layout for this fragment
        View rootView=inflater.inflate(R.layout.fragment_my, container, false);

        //INITIALIZE VIEWS
        nameFragTxt = (EditText)rootView.findViewById(R.id.nameEditTxt);
        launchYearSpinner = (Spinner)rootView.findViewById(R.id.sp);
        sendBtn = (Button) rootView.findViewById(R.id.sendBtn);

        fillYears();

        sendBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sendData();
            }
        });

        return rootView;
    }
    /*
    FILL YEARS IN OUR SPINNER
    */
    private void fillYears() {
        ArrayAdapter adapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1);
        adapter.add("2017");
        adapter.add("2018");
        adapter.add("2019");
        adapter.add("2020");
        adapter.add("2021");
        adapter.add("2022");

        //SET ADAPTER INSTANCE TO OUR SPINNER
        launchYearSpinner.setAdapter(adapter);

    }

    private void sendData()
    {
        //INTENT OBJ
        Intent i = new Intent(getActivity().getBaseContext(),
                MainActivity.class);

        //PACK DATA
    i.putExtra("SENDER_KEY", "MyFragment");
        i.putExtra("NAME_KEY", nameFragTxt.getText().toString());
        i.putExtra("YEAR_KEY", Integer.valueOf(launchYearSpinner.getSelectedItem().toString()));

        //RESET WIDGETS
        nameFragTxt.setText("");
        launchYearSpinner.setSelection(0);

        //START ACTIVITY
        getActivity().startActivity(i);
    }
}

4. Создание пользовательских интерфейсов

Пользовательские интерфейсы обычно создаются в android с помощью XML-макетов, а не путем прямого java-кодирования.

Это пример декларативного программирования.

Преимущества использования XML по сравнению с Java
Нет. Преимущество
1. Декларативное создание виджетов и представлений позволяет нам использовать декларативный язык XML, что делает его проще.
2. Это легко обслуживается, так как пользовательский интерфейс отделен от логики Java.
3. Легче делиться или загружать код и безопасно тестировать его до выполнения.
4. Вы можете использовать инструменты для генерации XML .

Вот наши макеты для этого проекта:

(a). activity_main.xml
  • Этот макет раздувается до пользовательского интерфейса MainActivity.
  • Он включает в себя content_main.xml.

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout

    android_layout_width="match_parent"
    android_layout_height="match_parent"
    android_fitsSystemWindows="true"
    tools_context="com.tutorials.hp.datafragment_activity.MainActivity">

    <android.support.design.widget.AppBarLayout
        android_layout_width="match_parent"
        android_layout_height="wrap_content"
        android_theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android_id="@+id/toolbar"
            android_layout_width="match_parent"
            android_layout_height="?attr/actionBarSize"
            android_background="?attr/colorPrimary"
            app_popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_main" />

    <android.support.design.widget.FloatingActionButton
        android_id="@+id/fab"
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_layout_gravity="bottom|end"
        android_layout_margin="@dimen/fab_margin"
        app_srcCompat="@android:drawable/ic_dialog_email" />

</android.support.design.widget.CoordinatorLayout>

Вот некоторые из виджетов, представлений и групп представлений, которые используются"

No. View/ViewGroup Package Role
1. CordinatorLayout android.support.design.widget Супермощный фреймлаут, который обеспечивает оформление верхнего уровня нашего приложения, а также определяет взаимодействие и поведение всех его дочерних элементов.
2. AppBarLayout android.support.design.widget Дочерний LinearLayout, который располагает свои дочерние элементы вертикально и предоставляет концепции панели приложений Material Design, такие как жесты прокрутки.
3. ToolBar <android.support.v7.widget ViewGroup, которая может предоставлять функции панели действий и при этом использоваться в макетах приложений.
4. FloatingActionButton android.support.design.widget Круговое изображение, плавающее над пользовательским интерфейсом, которое мы можем использовать в качестве кнопки.
(b). content_main.xml

Этот макет включается в ваш activity_main.xml.
Здесь мы определяем наши виджеты пользовательского интерфейса.

  • Основной макет.
  • Здесь мы определяем представления и виджеты xml кода.
  • Этот макет будет вложен в наш интерфейс MainActivity.
  • Это макет contentmain.xml в нашем проекте.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout

    android_id="@+id/content_main"
    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"
    app_layout_behavior="@string/appbar_scrolling_view_behavior"
    tools_context="com.tutorials.hp.datafragment_activity.MainActivity"
    tools_showIn="@layout/activity_main">

    <LinearLayout
        android_layout_width="match_parent"
        android_orientation="vertical"
        android_layout_height="match_parent">

    <TextView
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_textAppearance="?android:attr/textAppearanceLarge"
        android_text="Received Data"
        android_id="@+id/activityTitle"
        android_textStyle="bold"
        android_textColor="@color/colorAccent"
        android_layout_gravity="center_horizontal"
        android_padding="5dp"
        />

    <TextView
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_textAppearance="?android:attr/textAppearanceLarge"
        android_text="Name"
        android_id="@+id/nameTxt"
        android_padding="5dp"
        />

    <TextView
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_textAppearance="?android:attr/textAppearanceLarge"
        android_text="Year"
        android_id="@+id/yearTxt"
        android_padding="5dp"
        />

    <FrameLayout
        android_id="@+id/container"
        android_layout_width="match_parent"
        android_layout_height="wrap_content">

    </FrameLayout>

    </LinearLayout>
</RelativeLayout>

(c). Макет MyFragment

  • Макет для нашего класса Fragment.
  • Содержит CardView с редактируемым текстом и спиннером.
  • Является макетом fragment_my.xml в нашем проекте.

<FrameLayout

    android_layout_width="match_parent"
    android_layout_height="match_parent"
    tools_context="com.tutorials.hp.datafragment_activity.MyFragment">
    <android.support.v7.widget.CardView
        android_orientation="horizontal"
        android_layout_width="match_parent"

        android_layout_margin="5dp"
        card_view_cardCornerRadius="10dp"
        card_view_cardElevation="5dp"
        android_layout_height="300dp">

        <LinearLayout
            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_textAppearance="?android:attr/textAppearanceLarge"
                android_text="FRAGMENT ONE"
                android_id="@+id/fragTitle"
                android_textStyle="bold"
                android_textColor="@color/colorAccent"
                android_layout_gravity="center_horizontal"
                android_padding="5dp"
                />

            <android.support.design.widget.TextInputLayout
                android_id="@+id/nameLayout"
                android_layout_width="match_parent"
                android_layout_height="wrap_content">

                <EditText
                    android_id="@+id/nameEditTxt"
                    android_layout_width="match_parent"
                    android_layout_height="wrap_content"
                    android_singleLine="true"
                    android_hint= "Name" />
            </android.support.design.widget.TextInputLayout>

            <LinearLayout
                android_layout_width="match_parent"
                android_orientation="horizontal"
                android_layout_height="wrap_content">
                <TextView
                    android_text="LAUNCH YEAR : "
                    android_textColor="@color/colorAccent"
                    android_layout_width="wrap_content"
                    android_layout_height="wrap_content" />
                <Spinner
                    android_id="@+id/sp"
                    android_layout_width="match_parent"
                    android_layout_height="wrap_content"
                    />
            </LinearLayout>

            <Button
                android_id="@+id/sendBtn"
        android_text="Send"
                android_layout_width="wrap_content"
                android_layout_height="wrap_content"             />
        </LinearLayout>
    </android.support.v7.widget.CardView>
</FrameLayout>

Как выполнить

  • Скачайте проект выше.
  • Вы получите заархивированный файл, распакуйте его.
  • Откройте Android Studio.
  • Теперь закройте все уже открытые проекты.
  • На панели меню нажмите на Файл >Новый> Импорт проекта
  • Теперь выберите папку назначения, из которой вы хотите импортировать проект.
  • Выберите проект Android.
  • Теперь нажмите на "OK".
  • Готово, вы импортировали проект, теперь отредактируйте его.

Результат

Вот что вы получите:

Как передать данные из <code>фрагмента</code> в <code>активность</code>

Дополнительные ресурсы

Ресурс Ссылка
GitHub Browse Browse Browse
Ссылка для скачивания Download GitHub Download Link Download

Пример 2: Передача данных Android – от Activity к Fragment через Bundle

При разработке любого приложения, которое не является Hello World, есть вероятность, что вам понадобится более одной активности или фрагментов. Фрагменты, по сути, являются подактивностями.

Большинство новичков путаются в передаче данных между активностями или между фрагментами.

Сегодня мы хотим посмотреть, как передавать данные из активности во фрагмент. Мы будем использовать объект Bundle, упакуем в него данные в нашей Activity, а затем распакуем эти данные в методе onCreateView() нашего фрагмента.

ШАГ 1: Создание проекта

  1. Сначала создайте новый проект в android studio. Перейдите в меню Файл –> Новый проект.
  2. Введите название приложения и выберите название компании.
  3. Выберите минимальный SDK.
  4. Выберите Empty или Basic activity.
  5. Нажмите Finish.

ШАГ 2 : Наш Build.gradle.

  • Мы будем использовать CardView в нашем фрагменте. Никаких внешних зависимостей не требуется.

ШАГ 3 : Наш Фрагмент

  • Мы будем раздувать макет нашего фрагмента.
  • Мы будем просто получать данные, отправленные из MainActivity, и показывать их в наших представлениях внутри нашего фрагмента.
  • Мы распакуем данные в нашем методе onCreateView().

package com.tutorials.hp.dataactivity_fragment;

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

public class MyFragment extends Fragment {

    private TextView nameFragTxt,yearFragTxt;

    public MyFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView=inflater.inflate(R.layout.fragment_my, container, false);

        nameFragTxt= (TextView) rootView.findViewById(R.id.nameTxt);
        yearFragTxt= (TextView) rootView.findViewById(R.id.yearTxt);

        //UNPACK OUR DATA FROM OUR BUNDLE
        String name=this.getArguments().getString("NAME_KEY").toString();
        int year=this.getArguments().getInt("YEAR_KEY");

       nameFragTxt.setText("NAME : "+name);
       yearFragTxt.setText("YEAR : "+String.valueOf(year));

        return rootView;
    }

}

ШАГ 4 : Наша MainActivity (Главная активность)

  • Должен быть взят из нашего contentmain.xml.
  • Когда пользователь нажимает на плавающую кнопку действия, мы упаковываем данные, введенные пользователем в edittext и spinner в объект Bundle.
  • Затем мы выполняем транзакцию Fragment', заменяя наш контейнер Framelayout нашим раздутым fragment’.
  • Мы отправляем пакет в Fragment.

package com.tutorials.hp.dataactivity_fragment;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;

public class MainActivity extends AppCompatActivity {
    private EditText nameTxt;
    private Spinner launchYearSpinner;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        //INITIALIZE VIEWS
        nameTxt = (EditText) findViewById(R.id.nameEditTxt);
        launchYearSpinner = (Spinner) findViewById(R.id.sp);

        fillYears();

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sendData();
            }
        });
    }

    /*
    SEND DATA TO FRAGMENT
     */
    private void sendData() {
        //PACK DATA IN A BUNDLE
        Bundle bundle = new Bundle();
        bundle.putString("NAME_KEY", nameTxt.getText().toString());
        bundle.putInt("YEAR_KEY", Integer.valueOf(launchYearSpinner.getSelectedItem().toString()));

        //PASS OVER THE BUNDLE TO OUR FRAGMENT
        MyFragment myFragment = new MyFragment();
        myFragment.setArguments(bundle);

        nameTxt.setText("");
        launchYearSpinner.setSelection(0);

        //THEN NOW SHOW OUR FRAGMENT
        getSupportFragmentManager().beginTransaction().replace(R.id.container,myFragment).commit();

    }

    /*
    FILL YEARS IN OUR SPINNER
     */
    private void fillYears() {
        ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1);
        adapter.add("2017");
        adapter.add("2018");
        adapter.add("2019");
        adapter.add("2020");
        adapter.add("2021");
        adapter.add("2022");

        //SET ADAPTER INSTANCE TO OUR SPINNER
        launchYearSpinner.setAdapter(adapter);
    }
}

ШАГ 5. Создание пользовательского интерфейса `Activity

Пользовательские интерфейсы обычно создаются в android с помощью XML-макетов, а не путем прямого java-кодирования.

Это пример декларативного программирования.

Преимущества использования XML над Java

Нет. Преимущество
1. Декларативное создание виджетов и представлений позволяет нам использовать декларативный язык XML, что делает его проще.
2. Это легко обслуживается, так как пользовательский интерфейс отделен от логики Java.
3. Легче делиться или загружать код и безопасно тестировать его до выполнения.
4. Вы можете использовать инструменты для генерации XML для генерации XML.

Вот наши макеты для этого проекта:

(a). activity_main.xml
  • Этот макет раздувается до пользовательского интерфейса MainActivity.
  • Он включает в себя content_main.xml.

Вот некоторые из виджетов, представлений и групп представлений, которые используются"

No. View/ViewGroup Package Role
1. CordinatorLayout android.support.design.widget Супермощный framelayout, который обеспечивает оформление верхнего уровня нашего приложения, а также определяет взаимодействие и поведение всех его дочерних элементов.
2. AppBarLayout android.support.design.widget Дочерний LinearLayout, который располагает свои дочерние элементы вертикально и предоставляет концепции панели приложений Material Design, такие как жесты прокрутки.
3. ToolBar <android.support.v7.widget ViewGroup, которая может предоставлять функции actionbar и при этом использоваться в макетах приложений.
4. FloatingActionButton android.support.design.widget Круговое изображение, плавающее над пользовательским интерфейсом, которое мы можем использовать в качестве кнопки.
(b). content_main.xml

Этот макет включается в ваш activity_main.xml.
Здесь мы определяем наши виджеты пользовательского интерфейса.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout

    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"
    app_layout_behavior="@string/appbar_scrolling_view_behavior"
    tools_context="com.tutorials.hp.dataactivity_fragment.MainActivity"
    tools_showIn="@layout/activity_main">

    <LinearLayout
        android_layout_width="match_parent"
        android_orientation="vertical"
        android_layout_height="match_parent">

        <android.support.design.widget.TextInputLayout
            android_id="@+id/nameLayout"
            android_layout_width="match_parent"
            android_layout_height="wrap_content">

            <EditText
                android_id="@+id/nameEditTxt"
                android_layout_width="match_parent"
                android_layout_height="wrap_content"
                android_singleLine="true"
                android_hint= "Name" />
        </android.support.design.widget.TextInputLayout>

    <LinearLayout
        android_layout_width="match_parent"
        android_orientation="horizontal"
        android_layout_height="wrap_content">
        <TextView
            android_text="LAUNCH YEAR : "
            android_textColor="@color/colorAccent"
            android_layout_width="wrap_content"
            android_layout_height="wrap_content" />
        <Spinner
            android_id="@+id/sp"
            android_layout_width="match_parent"
            android_layout_height="wrap_content"
            />
        </LinearLayout>
        <FrameLayout
            android_id="@+id/container"
            android_layout_width="match_parent"
            android_layout_height="wrap_content">
        </FrameLayout>
    </LinearLayout>
</RelativeLayout>

ШАГ 6: Наш фрагмент xml

  • Наш макет фрагмента.
  • Должен содержать CardView с текстовыми представлениями.

<RelativeLayout

    android_layout_width="match_parent"
    android_layout_height="match_parent"
    tools_context="com.tutorials.hp.dataactivity_fragment.MyFragment">

    <android.support.v7.widget.CardView
        android_orientation="horizontal"
        android_layout_width="match_parent"

        android_layout_margin="5dp"
        card_view_cardCornerRadius="10dp"
        card_view_cardElevation="5dp"
        android_layout_height="300dp">

        <LinearLayout
            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_textAppearance="?android:attr/textAppearanceLarge"
                android_text="FRAGMENT ONE"
                android_id="@+id/fragTitle"
                android_textStyle="bold"
                android_textColor="@color/colorAccent"
                android_layout_gravity="center_horizontal"
                android_padding="5dp"
                 />

            <TextView
                android_layout_width="wrap_content"
                android_layout_height="wrap_content"
                android_textAppearance="?android:attr/textAppearanceLarge"
                android_text="Name"
                android_id="@+id/nameTxt"
                android_padding="5dp"
                />

            <TextView
                android_layout_width="wrap_content"
                android_layout_height="wrap_content"
                android_textAppearance="?android:attr/textAppearanceLarge"
                android_text="Year"
                android_id="@+id/yearTxt"
                android_padding="5dp"
                />

        </LinearLayout>
    </android.support.v7.widget.CardView>

</RelativeLayout>

ШАГ 7 : Как выполнить

  • Скачайте проект.
  • Вы получите заархивированный файл, распакуйте его.
  • Откройте Android Studio.
  • Теперь закройте все уже открытые проекты.
  • На панели меню нажмите на Файл >Новый> Импорт проекта
  • Теперь выберите папку назначения, из которой вы хотите импортировать проект.
  • Выберите проект Android.
  • Теперь нажмите на "OK".
  • Готово, теперь отредактируйте его.

Результат

Вот что вы получите:

Как передать данные из <code>активности</code> во <code>фрагмент</code>

ШАГ 8: Подробнее

Ресурс Ссылка
GitHub Browse Browse
Ссылка на скачивание Download GitHub Download Link Download

Передача данных в Android: ListView to ListView

Иногда вам может понадобиться передать данные из одного ListView в Activity A в ListView в Activity B. Это и есть цель данного руководства.

У нас будет два вида деятельности, каждый из которых имеет ListView. Мы нажимаем кнопку и передаем данные из первой активности во вторую активность, из первого litsview во второй listview.

Скрипты Gradle

Давайте изменим наш файл build.gradle на уровне приложения.

1. Build.gradle

  • Указываем зависимости в закрытии dependencies.

    apply plugin: 'com.android.application'

    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.2"
        defaultConfig {
            applicationId "com.tutorials.hp.listviewdatapassing"
            minSdkVersion 15
            targetSdkVersion 25
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:appcompat-v7:25.2.0'
        compile 'com.android.support:design:25.2.0'
        testCompile 'junit:junit:4.12'
    }

LAYOUTS

У нас будет три макета:

1. activity_main.xml

  • Этот макет будет раздуваться в UI для нашей основной активности.
  • Он будет содержать макет content_main.xml.
  • Он содержит определения нашей панели приложений и панели инструментов.

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.CoordinatorLayout

        android_layout_width="match_parent"
        android_layout_height="match_parent"
        android_fitsSystemWindows="true"
        tools_context="com.tutorials.hp.listviewdatapassing.MainActivity">

        <android.support.design.widget.AppBarLayout
            android_layout_width="match_parent"
            android_layout_height="wrap_content"
            android_theme="@style/AppTheme.AppBarOverlay">

            <android.support.v7.widget.Toolbar
                android_id="@+id/toolbar"
                android_layout_width="match_parent"
                android_layout_height="?attr/actionBarSize"
                android_background="?attr/colorPrimary"
                app_popupTheme="@style/AppTheme.PopupOverlay" />

        </android.support.design.widget.AppBarLayout>

        <include layout="@layout/content_main" />

        <android.support.design.widget.FloatingActionButton
            android_id="@+id/fab"
            android_layout_width="wrap_content"
            android_layout_height="wrap_content"
            android_layout_gravity="bottom|end"
            android_layout_margin="@dimen/fab_margin"
            app_srcCompat="@android:drawable/ic_dialog_email" />

    </android.support.design.widget.CoordinatorLayout>

2. content_main.xml

  • Здесь будет содержаться наш первый ListView.
  • Этот макет будет включен в activity_main.xml.

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout

        android_id="@+id/content_main"
        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"
        app_layout_behavior="@string/appbar_scrolling_view_behavior"
        tools_context="com.tutorials.hp.listviewdatapassing.MainActivity"
        tools_showIn="@layout/activity_main">

        <ListView
            android_id="@+id/firstLV"
            android_layout_width="match_parent"
            android_layout_height="wrap_content" />
    </RelativeLayout>

3. activity_second.xml

  • Этот макет будет раздуваться в пользовательский интерфейс для нашей второй активности.
  • Он будет содержать вторую активность.

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout

        android_id="@+id/activity_second"
        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.tutorials.hp.listviewdatapassing.SecondActivity">
        <ListView
            android_id="@+id/secondLV"
            android_layout_width="match_parent"
            android_layout_height="wrap_content"
            />
    </RelativeLayout>

КЛАССЫ JAVA

Вот наши java-классы:

1. SpacecraftsCollection

  • Это класс, который поможет нам в передаче нашего списка ArrayList от первой ко второй активности. Этот класс будет сериализован, передан, а затем десериализован во второй активности.

    package com.tutorials.hp.listviewdatapassing;

    import java.io.Serializable;
    import java.util.ArrayList;

    public class SpacecraftsCollection implements Serializable {

        private ArrayList<String> spacecrafts;

        public ArrayList<String> getSpacecrafts() {
            return spacecrafts;
        }

        public void setSpacecrafts(ArrayList<String> spacecrafts) {
            this.spacecrafts = spacecrafts;
        }
    }

2. SecondActivity.java

  • Это наш второй класс активности.
  • Он получит сериализованный список массивов, содержащий наши космические корабли, десериализует его и отобразит во втором представлении списка.

    package com.tutorials.hp.listviewdatapassing;

    import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;

    public class SecondActivity extends AppCompatActivity {

        //SECOND LISTVIEW
        ListView lv;

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

            lv= (ListView) findViewById(R.id.secondLV);

            receiveData();
        }

        /*
        RECEIVE DATA FROM FIRST ACTIVITY
         */
        private void receiveData()
        {
            Intent i=this.getIntent();
            SpacecraftsCollection spacecraftsCollection= (SpacecraftsCollection) i.getSerializableExtra("SPACECRAFTS");

            lv.setAdapter(new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,spacecraftsCollection.getSpacecrafts()));
        }
    }

3. MainActivity.java

  • Наш класс MainActivity.
  • Данные нашего списка будут передаваться отсюда во вторую активность при нажатии на плавающую кнопку действия.

    package com.tutorials.hp.listviewdatapassing;

    import android.content.Intent;
    import android.os.Bundle;
    import android.support.design.widget.FloatingActionButton;
    import android.support.design.widget.Snackbar;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.view.View;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;

    import java.util.ArrayList;

    public class MainActivity extends AppCompatActivity {

        //FIRST LISTVIEW
        ListView lv;
        ArrayList spacecrafts=new ArrayList();

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);

            lv= (ListView) findViewById(R.id.firstLV);
            populateData();
            lv.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,spacecrafts));

            FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
            fab.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    lv.setAdapter(new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,new ArrayList<String>()));
                    sendData();
                }
            });
        }

        //POPULATE SPACECRAFTS ARRAYLIST
        private void populateData()
        {
            spacecrafts.add("Casini");
            spacecrafts.add("Enterprise");
            spacecrafts.add("Spitzer");
            spacecrafts.add("Huygens");
            spacecrafts.add("WMAP");
            spacecrafts.add("Juno");
            spacecrafts.add("Kepler");
            spacecrafts.add("Apollo 15");
            spacecrafts.add("Challenger");
            spacecrafts.add("Discovery");
        }

        /*
        SET ARRAYLIST TO SPACECRAFTS COLLECTION CLASS
         */
        private SpacecraftsCollection getData()
        {
            SpacecraftsCollection spacecraftsCollection=new SpacecraftsCollection();
            spacecraftsCollection.setSpacecrafts(spacecrafts);

            return spacecraftsCollection;
        }

        /*
        SEND DATA TO SECOND ACTIVITY
         */
        private void sendData()
        {
            Intent i=new Intent(this,SecondActivity.class);
            i.putExtra("SPACECRAFTS",this.getData());
            startActivity(i);
        }
    }

Результат

Вот что вы получите при запуске проекта:

How to Pass Data From ListView to ListView

Download

Скачайте код здесь.