アクティビティフラグメント`の間でデータを渡すことは、アンドロイドの開発を始める際に学ぶ必要のある基本的な概念の一つです。活動」や「断片」はクラスに過ぎませんが、アンドロイドのユーザーインターフェイスの動作の基本となるため、アンドロイドでは特別なクラスと考えられています。そのため、単にコンストラクタでデータを渡すのではなく、以下の3つの方法のいずれかでデータを渡します。

  1. インテント
  2. バンドル
  3. ビューモデル

このレッスンでは、これらすべてを実際の例を使って見ていきます。それでは始めましょう。

Example 1: Android Data Passing – Fragment から ActivityIntent を介してデータを渡す

これまでに、activityからfragmentにデータを渡す方法や、activityからactivityにリストやオブジェクトを渡す方法、そして単純なプリミティブデータ型を渡す方法を見てきました。

今日は、fragmentからactivityに単純なデータ型を渡す方法を見てみましょう。Intentオブジェクトを使ってデータを渡します。

Fragment とは何ですか?

フラグメントは、独自のライフサイクルを持つサブアクティビティです。フラグメントは activities によってホストされます。1つの activity が複数の Fragment` をホストすることができます。

なぜ Fragment から Activity にデータを渡すのですか?

No. 理由
フラグメントはサブアクティビティであり、必ずしも多くのアクティビティを作成することなく、異なる画面を持つことができます。そのため、「フラグメント」から「アクティビティ」にデータを渡す方法を知る必要があります。
2. Activityのようなフラグメントは、ウィンドウを表す特別なUIクラスなので、通常のクラスのようにデータを直接渡すことはできません。

はじめに

  • 2つのクラスがあります:1つはMainActivity、もう1つはMyFragmentクラスです。
  • FAB(Floating Action Button)ボタンを押すと、Fragment TransactionでMyFragmentを開き、これから定義するFrameLayoutにアタッチします。
  • 「Fragment」には、エディットテキストとスピナーが含まれています。
  • ユーザーは宇宙船の名前を入力し、スピナーで打ち上げ年を選択します。
  • そして、これらのデータをMainActivityに戻します。
  • そして、受け取ったデータをテキストビューに表示します。
  • IDEとしてAndroid Studioを使用しています。
  • コードは、理解しやすいようにコメントされています。

よくある質問にお答えします。

この簡単な例では、以下のようなことを探っています。

  • fragment から activity` にデータを渡すにはどうすればよいか。
  • インテントを使って fragmentactivity の間でデータを渡すにはどうすればよいか。
  • FragmentTransactionを行うにはどうすればよいか。
  • onResume()をオーバーライドして、アンドロイドでデータを受け取ります。
  • fragmentactivityの両方を扱う方法。

使用ツール

  • IDE : アンドロイドスタジオ
  • OS Windows 8.1
  • プラットフォーム:Android
  • 言語:Java
  • トピック : インテント、データパッシング、`フラグメント’

では、早速行ってみましょう。

では、ソースコードを見てみましょう。

1. Build.gradle

  • 外部の依存関係は必要ありません。

2. MainActivity.java

  • 私たちの MainActivity は、ランチャー activity`です。
  • まず、ビューを参照します。ここでは、受信したデータを表示するためのシンプルなテキストビューを参照します。
  • MyFragmentクラスから受け取ったデータを受信し、解凍するメソッド receiveData()を用意しています。
  • onResume()メソッドでデータを受け取ることになります。
  • このメソッドは、fragmentから再開するときだけでなく、activityが作成・開始された後にも呼び出されるため、fragmentからデータを送信するたびに送信するシンプルな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` を拡張しています。
  • ここでは、エディットテキスト、ボタン、スピナーを用意しています。
  • ユーザはエディットテキストに宇宙船名を入力し、スピナーで打ち上げ年を選択し、送信ボタンをクリックしてデータをMainActivityに送信します。
  • データを送信し、intentにまとめます。
  • また、データの送信者を特定するために、sender と呼ぶ変数をこの fragment として送信します。

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. ユーザーインターフェースの作成

アンドロイドのユーザーインターフェースは、javaで直接コーディングするのではなく、XMLレイアウトを使って作成するのが一般的です。

これは宣言型プログラミングの一例です。

JavaよりもXMLを使うことの利点
No. アドバンテージ
1. ウィジェットやビューを宣言的に作成することで、宣言的な言語であるXMLを使用することができ、より簡単になります。
2. ユーザーインターフェースがJavaのロジックから切り離されているため、メンテナンスが容易である。
3. コードの共有やダウンロードが容易になり、ランタイム前に安全にテストすることができます。
4. XML生成ツールを使って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. ビュー/ビューグループ|パッケージ|役割|||||」。
1. CordinatorLayout android.support.design.widget アプリケーションのトップレベルの装飾を提供し、またすべての子のインタラクションとビヘイビアを指定する、スーパーパワーのフレームレイアウトです。
2. AppBarLayout|android.support.design.widget|LinearLayoutの子であり、子を垂直に配置し、スクロールジェスチャーのようなマテリアルデザインのアプリバーのコンセプトを提供します。
3. ToolBar|<android.support.v7.widget|アクションバーの機能を提供しつつ、アプリケーションのレイアウト内で使用することができるViewGroupです。
4. FloatingActionButton android.support.design.widget ボタンとして使用できる、UIの上に浮かぶ円形のイメージビューです。
(b). content_main.xml

このレイアウトは、activity_main.xmlに含まれます。
ここでは、UIウィジェットを定義します。

  • メインレイアウト。
  • ビューとウィジェットの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>

How To Run

  • 上のプロジェクトをダウンロードしてください。
  • ZIP形式のファイルが出てくるので、それを解凍します。
  • Android Studioを開きます。
  • 既に開いているプロジェクトを閉じます。
  • メニューバーから「File > New > Import Project」をクリックします。
  • プロジェクトをインポートする先のフォルダを選択します。
  • Android プロジェクトを選択します。
  • OK**"をクリックしてください。
  • Done, your done importing the project, now edit it.

結果

以下のような結果が得られます。

fragment<code>から</code>activity`へのデータの渡し方

その他のリソース

リソース リンク
GitHub ブラウズ ブラウズ
GitHub Download Link Download

例 2: Android データパッシング – Activity から Bundle 経由で Fragment

Hello World以外のアプリケーションを開発する場合、複数の Activity や Fragment が必要になることがあります。Fragment は基本的にサブアクティビティです。

フラグメントとは、基本的にサブアクティビティのことです。

今日は、activityからfragmentにデータを渡す方法を見てみましょう。ここでは、Bundleオブジェクトを使い、Activityの中でデータをパックし、FragmentのonCreateView()メソッドの中でそのデータをアンパックします。

STEP 1 : プロジェクトの作成

  1. まず、アンドロイドスタジオで新しいプロジェクトを作成します。File –> New Project」を選択します。
  2. アプリケーション名を入力し、会社名を選択します。
  3. 最小限のSDKを選択します。
  4. EmptyまたはBasic activityを選択します。
    1. 完了をクリックする。

STEP 2 : Build.gradleの作成

  • 今回のFragmentでは、CardViewを使用します。外部の依存関係は必要ありません。

STEP 3 : 私たちのFragmentについて

  • Fragment のレイアウトから膨らませます。
  • MainActivityから送られてきたデータを受信して、Fragment内のビューに表示するだけです。
  • 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;
    }

}

STEP 4 : MainActivity

  • Shall be inflated from our contentmain.xml
  • ユーザーがフローティングアクションボタンをクリックすると、エディットテキストとスピナーにユーザーが入力したデータを 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);
    }
}

STEP 5. ユーザーインターフェース「Activity」の作成

アンドロイドでは、ユーザーインターフェースを、直接Javaでコーディングするのではなく、XMLレイアウトを使って作成するのが一般的です。

これは宣言型プログラミングの一例です。

JavaではなくXMLを使用することの利点

No. メリット
1.ウィジェットやビューを宣言的に作成することで、宣言的な言語であるXMLを使用することができ、より簡単になります。
2. ユーザーインターフェースがJavaのロジックから切り離されているため、メンテナンスが容易である。
3. コードの共有やダウンロードが容易になり、ランタイム前に安全にテストすることができます。
4. XML生成ツールを使ってXMLを生成することができます。

このプロジェクトのレイアウトを紹介します。

(a). activity_main.xml
  • このレイアウトはMainActivityのユーザーインターフェイスにインフレーションされます。
  • content_main.xmlも含まれています。

以下は、採用されるウィジェット、ビュー、ビューグループの一部です。"

No. ビュー/ビューグループ パッケージ 役割
1. CordinatorLayout android.support.design.widget アプリケーションのトップレベルの装飾を提供するスーパーパワーの framelayout で、すべての子のインタラクションとビヘイビアも指定します。
2. AppBarLayout android.support.design.widget LinearLayoutの子で、子を垂直に配置し、スクロールジェスチャーのようなマテリアルデザインのアプリバーのコンセプトを提供します。
3. ToolBar <android.support.v7.widget アクションバーの機能を提供しつつ、アプリケーションのレイアウト内で使用することができるViewGroupです。
4. FloatingActionButton android.support.design.widget ボタンとして使用できる、UIの上に浮かぶ円形のイメージビューです。
(b). content_main.xml

このレイアウトは、activity_main.xmlに含まれます。
ここでは、UIウィジェットを定義します。

<?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>

STEP 6 : 作った Fragment 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>

STEP 7 : 実行方法

  • プロジェクトをダウンロードします。
  • ZIP形式のファイルが出てくるので、それを解凍します。
  • Android Studioを開きます。
  • 既に開いているプロジェクトはすべて閉じてください。
  • メニューバーから「File > New > Import Project」をクリックします。
  • プロジェクトをインポートする先のフォルダを選択してください。
  • Android プロジェクトを選択します。
  • OK」をクリックしてください。
  • Done, now edit it…

結果

次のような結果になりました。

How to Pass Data from <code>Activity</code> to <code>Fragment</code>

STEP 8 : その他

リソース リンク
GitHub Browse Browse
GitHub Download Link Download

Androidのデータ受け渡し:ListViewからListViewへ

アクティビティAのリストビューから、アクティビティBのリストビューにデータを渡したいことがあると思います。

2つのアクティビティを用意し、それぞれにListViewを用意します。ボタンをクリックして、1つ目のアクティビティから2つ目のアクティビティへ、1つ目のリストビューから2つ目のリストビューへとデータを渡します。

Gradle Scripts

それでは、build.gradleファイルをアプリレベルで修正してみましょう。

1. ビルド.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

3つのレイアウトを用意します。

1. activity_main.xml

  • このレイアウトは、メインアクティビティのUIに組み込まれます。
  • このレイアウトには、content_main.xmlレイアウトが格納されます。
  • appbarとツールバーの定義が含まれています。

    <?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

  • 最初のリストビューが格納されます。
  • このレイアウトは 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

  • このレイアウトは、2つ目の activity のUIにインフレーションされます。
  • 2つ目の activity が格納されます。

    <?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 CLASSES

Javaクラスを紹介します。

**1. SpacecraftsCollection***。

  1. SpacecraftsCollection* これは、ArrayListを1つ目の activity から2つ目の activity に転送する際に役立つクラスです。このクラスは2つ目の activity でシリアライズ、転送、デシリアライズされます。

    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

  • これは、2つ目の activity クラスです。
  • このクラスは、宇宙船を含むシリアライズされた配列リストを受け取り、それをデシリアライズして、2つ目のリストビューに表示します。

    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クラスです。
  • フローティングアクションボタンがクリックされると、ここから2つ目の Activity に配列リストのデータが転送されます。

    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);
        }
    }

結果

プロジェクトを実行すると、以下のようになります。

ListViewからListViewへのデータ受け渡し方法

ダウンロード

コードのダウンロードはこちらから。