アクティビティや
フラグメント`の間でデータを渡すことは、アンドロイドの開発を始める際に学ぶ必要のある基本的な概念の一つです。活動」や「断片」はクラスに過ぎませんが、アンドロイドのユーザーインターフェイスの動作の基本となるため、アンドロイドでは特別なクラスと考えられています。そのため、単にコンストラクタでデータを渡すのではなく、以下の3つの方法のいずれかでデータを渡します。
- インテント
- バンドル
- ビューモデル
このレッスンでは、これらすべてを実際の例を使って見ていきます。それでは始めましょう。
Example 1: Android Data Passing - Fragment
から Activity
へ Intent
を介してデータを渡す
これまでに、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` にデータを渡すにはどうすればよいか。- インテントを使って
fragment
とactivity
の間でデータを渡すにはどうすればよいか。 - FragmentTransactionを行うにはどうすればよいか。
- onResume()をオーバーライドして、アンドロイドでデータを受け取ります。
fragment
とactivity
の両方を扱う方法。
使用ツール
- 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.
結果
以下のような結果が得られます。
その他のリソース
リソース | リンク |
---|---|
GitHub ブラウズ | ブラウズ |
GitHub Download Link | Download |
例 2: Android データパッシング - Activity
から Bundle
経由で Fragment
へ
Hello World以外のアプリケーションを開発する場合、複数の Activity
や Fragment が必要になることがあります。Fragment は基本的にサブアクティビティです。
フラグメントとは、基本的にサブアクティビティのことです。
今日は、activity
からfragment
にデータを渡す方法を見てみましょう。ここでは、Bundle
オブジェクトを使い、Activity
の中でデータをパックし、Fragment
のonCreateView()メソッドの中でそのデータをアンパックします。
STEP 1 : プロジェクトの作成
- まず、アンドロイドスタジオで新しいプロジェクトを作成します。File --> New Project」を選択します。
- アプリケーション名を入力し、会社名を選択します。
- 最小限のSDKを選択します。
- EmptyまたはBasic
activity
を選択します。 -
- 完了をクリックする。
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...
結果
次のような結果になりました。
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***。
- 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);
}
}
結果
プロジェクトを実行すると、以下のようになります。
ダウンロード
コードのダウンロードはこちらから。