AndroidStudio 画面の追加と遷移(使いまわす)

## finish()で消去せず画面遷移する方法
:::note info
## イメージ
３ページ分の画面遷移をするが、finish()を使わずに行う
![携帯.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953063/2dd44887-9f2c-cc72-2383-47fd5746df1b.gif)
:::

### ３つ分の画面を作る
参考⇒[AndroidStudio 画面の追加と遷移(消去)　画面の追加](https://qiita.com/mk-000856/items/b4f939243d43c2e69da8#%E7%94%BB%E9%9D%A2%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B)

今回はMainActivity、MainActivity2、MainActivity3で作成してます
ボタンとかテキストビューの名前やidは各自で好きに付けて下さい

参考⇒[ボタンオブジェクトの取得](https://qiita.com/mk-000856/items/8dcc569e9e106b1e5a82#%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%AE%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E5%8F%96%E5%BE%97)
<br>
**それぞれに遷移用のボタンを設置する(例)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953063/72ebe201-f3ab-e0db-535d-4f914f38f669.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953063/905a7d5a-7804-0679-4d7d-8ec23eb4bed2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953063/d1d21c22-a297-b245-6fc7-f9f415523b24.png)


## 遷移用のコードを追記する
**MainActivity.java**
~~~java:MainActivity.java
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
        //ボタンを押した＋＋＋＋＋＋＋
        Button button = findViewById(R.id.btNext1);
        button.setOnClickListener(new ButtonClickListener());
        //＋＋＋＋＋＋＋＋＋＋＋＋＋＋
    }
    //処理＋＋＋＋＋＋＋＋＋＋＋
    private class ButtonClickListener implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, MainActivity2.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivity(intent);
        }
    }
    //＋＋＋＋＋＋＋＋＋＋＋＋＋
}
~~~
---
**MainActivity2.java**
~~~java:MainActivity2.java
public class MainActivity2 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main2);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
        //ボタンを押した＋＋＋＋＋＋＋
        Button btNext = findViewById(R.id.btNext1);
        Button btBack = findViewById(R.id.btBack1);
        btNext.setOnClickListener(new ButtonClickListener());
        btBack.setOnClickListener(new ButtonClickListener());
        //＋＋＋＋＋＋＋＋＋＋＋＋＋＋
    }

    //処理＋＋＋＋＋＋＋＋＋＋＋
    private class ButtonClickListener implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            Class<?> cls;
            if(v.getId() == R.id.btNext1){
                cls = MainActivity3.class;
            } else {
                cls = MainActivity.class;
            }
            Intent intent = new Intent(MainActivity2.this, cls);
            intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivity(intent);
        }
    }
    //＋＋＋＋＋＋＋＋＋＋＋＋＋
}
~~~
---
**MainActivity3.java**
~~~java:MainActivity3.java
public class MainActivity2 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main2);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
        //ボタンを押した＋＋＋＋＋＋＋
        Button btBack1 = findViewById(R.id.btBack1);
        Button btBack2 = findViewById(R.id.btBack2);
        btNext.setOnClickListener(new ButtonClickListener());
        btBack.setOnClickListener(new ButtonClickListener());
        //＋＋＋＋＋＋＋＋＋＋＋＋＋＋
    }

    //処理＋＋＋＋＋＋＋＋＋＋＋
    private class ButtonClickListener implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            Class<?> cls;
            if(v.getId() == R.id.btBack1){
                cls = MainActivity.class;
            } else {
                cls = MainActivity2.class;
            }
            Intent intent = new Intent(MainActivity2.this, cls);
            intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivity(intent);
        }
    }
    //＋＋＋＋＋＋＋＋＋＋＋＋＋
}
~~~

<br>

:::note info
## setFlags()について
~~~java:private class ButtonClickListener内の処理の一部
    //処理＋＋＋＋＋＋＋＋＋＋＋
    private class ButtonClickListener implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, MainActivity2.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivity(intent);
        }
    }
    //＋＋＋＋＋＋＋＋＋＋＋＋＋
~~~
- **intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);**
スタックに同じアクティビティがすでに存在する場合、
そのアクティビティが再利用され、最前面に移動
存在しない場合は新たに作られる

イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953063/0061c654-edd8-1744-ae34-618bfcd13433.png)
今回はこのページを先頭に持ってくる処理を繰り返して
表示を切り替えているように見せている

ページの指定はIntentをnewした時のコンストラクタで行う
参考⇒[画面を遷移させる処理](https://qiita.com/mk-000856/items/b4f939243d43c2e69da8#%E7%94%BB%E9%9D%A2%E3%82%92%E9%81%B7%E7%A7%BB%E3%81%95%E3%81%9B%E3%82%8B%E5%87%A6%E7%90%86)

:::

:::note info
## Class<<foo>?> cls について
MainActivity2.javaとMainActivity3.javaにいるこいつ ↓
~~~java:これは MainActivity3.java 内のやつ
Class<?> cls;
if(v.getId() == R.id.btBack1){
    cls = MainActivity.class;
} else {
    cls = MainActivity2.class;
}
Intent intent = new Intent(MainActivity2.this, cls);
~~~
- **Class<<foo>?> cls;**
Intent intent = new Intent(MainActivity2.this, **ここで使う**);
new Intentの第２引数で使う
- **if(v.getId() == R.id.btBack1){<foo>
    &emsp;&emsp;cls = MainActivity.class;
} else {
    &emsp;&emsp;cls = MainActivity2.class;
    }**    
ここで押したボタンのidを識別し
上で作成した変数cls(移動先)へclsを格納する

参考⇒[画面を遷移させる処理](https://qiita.com/mk-000856/items/b4f939243d43c2e69da8#%E7%94%BB%E9%9D%A2%E3%82%92%E9%81%B7%E7%A7%BB%E3%81%95%E3%81%9B%E3%82%8B%E5%87%A6%E7%90%86)
:::

これで、画面遷移(使いまわし)ができた
## 処理の流れ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953063/a96b24c4-40d0-3a9c-d2e5-b766cbb2f47d.png)