実行環境:Android Studio 3.6 / JAVA
前回MainActivityからSubActivityにIntentを使用した画面遷移を作りました。今回はSubActivity上に複数のFragmentを張り付けてChip GroupでこれらのFragmentを制御したいと思います。
下の動画のようなことができるようになります。
- Chip Group内にChipを複数セットし、それに対応したFragmentが表示されるようになる
- FragmentはSubActivity上にFrameLayoutのContainerとしてセットされた部分に表示される。
Chip Groupは複数のChipをグループ化し、そのグループの中でどれか一つのChipがオン状態となるようにできる。実装には表示させたいXMLにサンプルコードをコピーする前に、パレットのChip Groupがダウンロード済み状態にしておかないとダメ。下図のように「下向き矢印」がパレットのChip Groupに表示されていなければ大丈夫。
また、実装する際には以下をインポートすることも忘れずに。
import com.google.android.material.chip.Chip;
Fragmentの実装には、Fragment Managerを使用する。今回はSubActivityからFragmentを制御するので、SubActivityの各Chipのリスナーに以下のように実装しました。FragmentはKokyuFragmentとCosmoFragmentの2つがあり、これを対応したChipが押されるたびにくるくると挿げ替える形です。このため、fragmentTransaction.replaceを使用しています。なお、Fragmentの表示先はactivity_sub.xmlに定義したLayoutのcontainer1に表示されるようにしてあります。
Chip chipKokyu = findViewById(R.id.chip_kokyu); chipKokyu.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.addToBackStack(null); fragmentTransaction.replace(R.id.container1, new KokyuFragment()); fragmentTransaction.commit(); } });
各Fragment.javaでは、背景色を変更しTextViewを表示させているだけです。
前回のIntentを使用した画面遷移と同じProjectを使用しているので、追記したファイルだけ以下に記載します。
activity_sub.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#e6b8c2"
tools:context=".MainActivity">
<FrameLayout
android:id="@+id/container1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginTop="100dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toTopOf="@+id/sabut_register"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/satxt_title" />
<com.google.android.material.chip.ChipGroup
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:clickable="false"
app:layout_constraintBottom_toTopOf="@+id/container1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/satxt_title"
app:singleSelection="true">
<com.google.android.material.chip.Chip
android:id="@+id/chip_kokyu"
style="@style/Widget.MaterialComponents.Chip.Choice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:text="パワー:呼吸"
android:textAppearance="?android:attr/textAppearanceMedium" />
<com.google.android.material.chip.Chip
android:id="@+id/chip_cosmo"
style="@style/Widget.MaterialComponents.Chip.Choice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:text="パワー:コスモ"
android:textAppearance="?android:attr/textAppearanceMedium" />
</com.google.android.material.chip.ChipGroup>
<Button
android:id="@+id/sabut_register"
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_marginEnd="36dp"
android:layout_marginBottom="32dp"
android:text="Register"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<TextView
android:id="@+id/satxt_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:textSize="20dp"
android:text="パワー種類の選択"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/satxt_page"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_marginBottom="32dp"
android:text="Sub Activity"
android:textSize="20dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:id="@+id/satxt_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="16dp"
android:text="000"
app:layout_constraintStart_toEndOf="@+id/satxt_title"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
kokyu_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#a2bd95"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:textSize="20dp"
android:text="KokyuFragment"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
cosmo_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#fde4a0"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:textSize="20dp"
android:text="CosmoFragment"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
SubActivity.java
package com.example.sampleattack;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.google.android.material.chip.Chip;
public class SubActivity extends AppCompatActivity {
public static final String SUB_KEY = "SUB_KEY";
public static final String SUB_KEY2 = "SUB_KEY2";
private int key;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sub);
Chip chipKokyu = findViewById(R.id.chip_kokyu);
chipKokyu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.container1, new KokyuFragment());
fragmentTransaction.commit();
}
});
Chip chipCosmo = findViewById(R.id.chip_cosmo);
chipCosmo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.addToBackStack(null);
fragmentTransaction.replace(R.id.container1, new CosmoFragment());
fragmentTransaction.commit();
}
});
Intent intent = getIntent();
key = intent.getIntExtra(MainActivity.MAIN_KEY,0);
String testtxt = String.valueOf(key);
TextView textView = findViewById(R.id.satxt_test);
textView.setText(testtxt);
Button returnButton = findViewById(R.id.sabut_register);
returnButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent();
String power = "9999";
intent.putExtra(SUB_KEY, key);
intent.putExtra(SUB_KEY2, power);
setResult(RESULT_OK, intent);
finish();
}
});
}
}
KokyuFragment.java
package com.example.sampleattack;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.fragment.app.Fragment;
public class KokyuFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.kokyu_fragment, container, false);
}
}
CosmoFragment.java
package com.example.sampleattack; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.fragment.app.Fragment; public class CosmoFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.cosmo_fragment, container, false); } }
関連記事: