Android
 Computer >> コンピューター >  >> プログラミング >> Android

【Android】フラグメント間で値を受け渡す方法をサンプルコード付きで解説

本記事では、Androidアプリ開発におけるフラグメント(Fragment)間での値の受け渡し方を、実際のサンプルコードをもとにステップごとに詳しく解説します。

今回作成するサンプルアプリでは、1つ目のフラグメント(FragmentOne)に入力したテキストを、ボタンのタップをきっかけにアクティビティ経由でもう1つのフラグメント(FragmentTwo)へ渡して画面に表示します。フラグメント同士は直接やり取りせず、必ずアクティビティを介して通信するのがAndroidの推奨パターンです。

ステップ1:新規プロジェクトを作成する

Android Studioを起動し、「File」⇒「New Project」を選択して、必要な項目をすべて入力し、新しいプロジェクトを作成します。

ステップ2:activity_main.xmlにコードを追加する

res/layout/activity_main.xmlに以下のコードを追加します。レイアウトには2つのフラグメントを縦方向に並べて配置しています。

<RelativeLayout
   xmlns:android="https://schemas.android.com/apk/res/android"
   xmlns:tools="https://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="#574706"
   tools:context=".MainActivity">
   <fragment
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:name="app.com.sample.FragmentOne"
      android:id="@+id/fragment"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true"
      tools:layout="@layout/fragment_fragment_one" />
   <fragment
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:name="app.com.sample.FragmentTwo"
      android:id="@+id/fragment2"
      android:layout_below="@+id/fragment"
      android:layout_centerHorizontal="true"
      android:layout_marginTop="41dp"
      tools:layout="@layout/fragment_fragment_two" />
</RelativeLayout>

ステップ3:MainActivity.javaにコードを追加する

src/MainActivity.javaに以下のコードを追加します。MainActivityはFragmentOne.OnFragmentInteractionListenerインターフェースを実装しており、フラグメントから受け取った文字列をFragmentTwoのupdateTextField()メソッドへ渡すことで、表示を更新します。

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends AppCompatActivity implements FragmentOne.OnFragmentInteractionListener{
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
   }
   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      getMenuInflater().inflate(R.menu.menu_main, menu);
      return true;
   }
   @Override
   public boolean onOptionsItemSelected(MenuItem item) {
      int id = item.getItemId();
      if (id == R.id.textUpdate) {
         return true;
      }
      return super.onOptionsItemSelected(item);
   }
   @Override
   public void onFragmentInteraction(String userContent) {
      FragmentTwo fragmentTwo =
         (FragmentTwo)
         getSupportFragmentManager().findFragmentById(R.id.fragment2);
      fragmentTwo.updateTextField(userContent);
   }
}

ステップ4:2つのフラグメントを作成する

FragmentOneとFragmentTwoという2つのフラグメントクラスを作成し、それぞれ以下のコードを追加します。

a) FragmentOne.java

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class FragmentOne extends Fragment {
   private OnFragmentInteractionListener mListener;
   private EditText userInput;
   private String userData;
   public FragmentOne() {
   }
   @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
      View view = inflater.inflate(R.layout.fragment_fragment_one, container, false);
      userInput = view.findViewById(R.id.userInput);
      Button update = view.findViewById(R.id.button);
      update.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            if(userInput.getText().toString().equals("")){
               Toast.makeText(getActivity(), "User input value must be filled",
               Toast.LENGTH_LONG).show();
               return;
            }
            userData = userInput.getText().toString();
            onButtonPressed(userData);
         }
      });
      return view;
   }
   public void onButtonPressed(String userContent) {
      if (mListener != null) {
         mListener.onFragmentInteraction(userContent);
      }
   }
   @Override
   public void onAttach(Activity activity) {
      super.onAttach(activity);
      try {
         mListener = (OnFragmentInteractionListener) activity;
      } catch (ClassCastException e) {
         throw new ClassCastException(activity.toString() + " must implement
         OnFragmentInteractionListener");
      }
   }
   @Override
   public void onDetach() {
      super.onDetach();
      mListener = null;
   }
   public interface OnFragmentInteractionListener {
      void onFragmentInteraction(String userContent);
   }
}

fragment_fragment_one.xml −

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
   xmlns:android="https://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:padding="4dp"
   android:paddingBottom="32dp">
   <EditText
      android:id="@+id/userInput"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true"
      android:layout_marginTop="16dp"
      android:ems="10"
      android:inputType="text">
      <requestFocus />
   </EditText>
   <Button
      android:id="@+id/button"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_centerHorizontal="true"
      android:layout_below="@id/userInput"
      android:layout_marginTop="20dp"
      android:padding="16dp"
      android:elevation="4dp"
      android:text="Update" />
</RelativeLayout>

b) FragmentTwo.java

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 FragmentTwo extends Fragment {
   private TextView updateText;
   public FragmentTwo() {
   }
   @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
      View view =
      inflater.inflate(R.layout.fragment_fragment_two, container, false);
      updateText = view.findViewById(R.id.textUpdate);
      return view;
   }
   public void updateTextField(String newText){
      updateText.setText(newText);
   }
}

fragment_fragment_two.xml −

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
   xmlns:android="https://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent">
   <TextView
      android:id="@+id/textUpdate"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text=""
      android:textSize="24sp"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true"
      android:textStyle="bold"
      android:layout_marginTop="32dp" />
</RelativeLayout>

ステップ5:AndroidManifest.xmlにコードを追加する

androidManifest.xmlに以下のコードを追加します。

<?xml version="1.0" encoding="utf-8"?>
<manifest
   xmlns:android="https://schemas.android.com/apk/res/android"
   package="app.com.sample">
   <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:roundIcon="@mipmap/ic_launcher_round"
      android:supportsRtl="true"
      android:theme="@style/AppTheme">
      <activity android:name=".MainActivity">
         <intent-filter>
            <action
               android:name="android.intent.action.MAIN" />
            <category
               android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>
   </application>
</manifest>

アプリを実行して動作を確認する

それでは、アプリを実行してみましょう。実機のAndroid端末がパソコンに接続されているものとして説明を進めます。Android Studioからアプリを実行するには、プロジェクト内のいずれかのアクティビティファイルを開き、ツールバーにある「Run」アイコンをクリックします。表示された選択肢から自分のモバイル端末を選択すると、端末に初期画面が表示されます。

FragmentOneのテキストボックスに任意の文字列を入力して「Update」ボタンをタップすると、入力した値がFragmentTwo側のTextViewに即座に反映されることを確認できます。

【Android】フラグメント間で値を受け渡す方法をサンプルコード付きで解説

【Android】フラグメント間で値を受け渡す方法をサンプルコード付きで解説

  1. Androidでアクティビティ間にドローアブルを渡す方法【サンプルコード付きで解説】

    この記事では、Androidアプリにおいて2つのアクティビティ間でドローアブル(画像リソース)を受け渡す方法を、実際に動作するサンプルコードとともに段階的に解説します。実装のポイント:ドローアブル本体ではなく「リソースID」を渡すドローアブルオブジェクトをIntentに直接渡そうとすると、データサイズが大きすぎてエラーになる場合があります。そこで本記事では、ドローアブルのリソースID(int値)を putExtra() で渡し、受け取り側で setImageResource() を使って表示するというシンプルかつ確実な手法を採用します。これが画像リソースの受け渡しにおけるベストプラクティスです

  2. Androidでアクティビティからフラグメントへ変数を渡す方法を徹底解説

    はじめに この記事では、Androidアプリ開発においてアクティビティ(Activity)からフラグメント(Fragment)へ変数を渡す方法を、実際のコード例とともに段階的に解説します。 アクティビティからフラグメントへのデータ受け渡しには、Bundleを使うのが基本です。アクティビティ側でsetArguments()メソッドによりBundleをフラグメントにセットし、フラグメント側でgetArguments()メソッドを使って値を取り出します。 手順1:新規プロジェクトを作成する Android Studioで新しいプロジェクトを作成します。メニューから「File」→「New Projec