[Android] [Kotlin] スプラッシュ画面とログイン画面の実装（毎度ログインしなくていい方法）

# できたこと
ログインが必要なアプリで、起動時毎にログインするのめんどくさいですよね。
そしてアプリの起動時といえば、スプラッシュ画面。
スプラッシュ画面の後ログイン画面に行くのか、それともログイン不要にしてメイン画面に行くのか
そんな時に使える方法です。
アプリ起動時にスプラッシュ画面を表示させ、
ログインしたことあるならログイン画面によらず、一気にメイン画面を表示させ、
ログインしたことない場合は、そのままログイン画面を表示させます。

まずは軽くSplashScreenの説明から(^^)
# SplashScreenのテーマ属性
| 属性名 | 内容 |
| --- | --- |
| windowSplashScreenBackground | スプラッシュ画面の背景色。 |
| windowSplashScreenIconBackgroundColor | スプラッシュ画面のアイコンの背景色。 デフォルト値は `@android:color/transparent` 。また、この項目は Theme.SplashScreen.IconBackground テーマでのみ有効となり、 Theme.SplashScreen テーマと併用すると強制的に無効扱いされる。 |
| windowSplashScreenAnimatedIcon | スプラッシュ画面中央のアイコン。 |
| postSplashScreenTheme | 起動 Activity が本来設定すべき Theme を指定。この項目が設定されている場合は installSplashScreen() のタイミングで Activity の Theme が差し替えられる。 |
| windowSplashScreenAnimationDuration | スプラッシュ画面が表示されてから閉じるまでの時間のミリ秒 (最大1000ミリ秒) |

https://qiita.com/irgaly/items/7ebba96f16462158579d
もっと細かい内容はこちらを参照してください。

# SplashScreenの設定
なんと言ってもまずはSplashScreenの環境設定からです😀
```build.gradle
android {
    ...
    compileSdk 31 // (31以上)
}
...
dependencies {
    implementation 'androidx.core:core-splashscreen:1.0.0'
}
```
次にxmlにスプラッシュ画面の画面設定
```themes.xml
<!--  スプラッシュ画面  -->
<style name="SplashScreen" parent="Theme.SplashScreen">
    <item name="windowSplashScreenBackground">@color/white</item>
    // 今回はデフォルトのアイコンで表示します
    <item name="windowSplashScreenAnimatedIcon">@drawable/ic_launcher_foreground</item>
    <item name="postSplashScreenTheme">@style/AppTheme</item>
    // 今回は時間指定なしでいきます
    <item name="windowSplashScreenAnimationDuration">0</item>
</style>
```
そしてマニフェストに作成したSplashScreenを追加
```AndroidManifest.xml
<applicaion 
    ... >
    <activity
        // ログイン画面からスタートするので変更をお忘れなく
        android:name=".LoginActivity"
        ...
        android:theme="@style/SplashScreen">
    </activity>
    <activity android:name=".MainActivity"/>
</application>
```

これでスプラッシュ画面の設定は終わりました。
あとはスプラッシュ画面の実装のみです。

# SplashScreenの実装
レイアウトから💪
## activity_login.xml(ログイン画面)
```activity_login.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="50sp"
    android:orientation="vertical">

    <EditText
        android:id="@+id/loginId"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="ログインID"
        android:inputType="textVisiblePassword"
        android:textSize="30sp"
        android:layout_gravity="center"/>

    <EditText
        android:id="@+id/password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="30sp"
        android:hint="パスワード"
        android:inputType="textPassword"
        android:textSize="30sp"
        android:layout_gravity="center"/>
    
    <Button
        android:id="@+id/login_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ログイン"
        android:textSize="25sp"
        android:layout_marginTop="50dp"
        android:layout_gravity="center"/>

</LinearLayout>
```
## activity_main.xml(メイン画面)
```activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <Button
        android:id="@+id/logout_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:text="ログアウト"
        android:textSize="20sp"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"/>

</RelativeLayout>
```
私が作成したレイアウトはこちら（めっちゃ適当w）
### スプラッシュ画面
![splashScreen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2957499/321d0086-0f5f-5436-131b-8996d736f667.png)


### ログイン画面
![loginActivity1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2957499/76fae83b-0b79-65a0-747f-c6aad251abf6.png)
### ログイン画面（入力済み）
![loginActivity2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2957499/85e478c3-6fd4-12ec-fed3-010baa975fa1.png)
パスワードは入力させると「・・・」のように表示させてます
ログインIDとパスワードが入力されるとボタンの色が変更し、押下可能状態になります
### メイン画面
![mainActivity.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2957499/74b7dbdb-7fb3-3170-4620-ed3df9b39620.png)
各自でより良いレイアウトを作成してください！
レイアウトはこんなもんにして、次にコードを書いていきます。
## LoginActivity.kt(ログイン画面)
```LoginActivity.kt
class LoginActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        // installSplashScreenのインスタンス化はonCreateより前で
        val splashScreen = installSplashScreen()
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val sharedPref = getSharedPreferences("mSharedPref", Context.MODE_PRIVATE)
        val sharedPrefEdit = sharedPref.edit()
        val sharedPrefLoginId = sharedPref.getString("loginId", "")

        // これ重要！！
        splashScreen.setKeepOnScreenCondition { true }

        // ログインしたことがあれば、SplashScreenの後すぐにMainActivityに遷移
        if (sharedPrefLoginId != "") {
            // API通信なりなんなり
            val intent = Intent(this@LoginActivity, MainActivity::class.java)
            startActivity(intent)
        } else {
            // まだログインしたことなければ、SplashScreenの後そのままLoginActivityに
            splashScreen.setKeepOnScreenCondition {
                return@setKeepOnScreenCondition false
            }
        }

        val loginId: EditText = findViewById(R.id.loginId)
        val password: EditText = findViewById(R.id.password)
        val loginBtn: Button = findViewById(R.id.login_btn)

        //ログインIDとパスワードが入力されてなければログインボタンが押せない設定に
        loginId.addTextChangedListener {
            loginBtn.isEnabled = loginId.text.isNotEmpty() && password.text.isNotEmpty()
        }
        password.addTextChangedListener {
            loginBtn.isEnabled = loginId.text.isNotEmpty() && password.text.isNotEmpty()
        }

        // ログインボタン押下でログインIDをsharedPreferencesに保存・メイン画面に遷移
        loginBtn.setOnClickListener {
            sharedPrefEdit.putString("ログインID", loginId.text.toString())
            sharedPrefEdit.apply()
            val intent = Intent(this, MainActivity::class.java)
            startActivity(intent)
        }
    }
}
```
## MainActivity.kt(メイン画面)
```MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sub1)
  
        // ログアウトボタン押下でログイン画面に戻る・保存ログインID削除
        findViewById<Button>(R.id.logout_btn).setOnClickListener {
            val sharedPref = getSharedPreferences("mSharedPref", Context.MODE_PRIVATE)
            val sharedPrefEdit = sharedPref.edit()
            sharedPrefEdit.clear()
            sharedPrefEdit.apply()
            finish()
        }
    }
}
```

完成しました！！
これでログインが必要なアプリで、起動時にスプラッシュ画面が表示され、
過去にログインしたことがあれば、ログイン画面を表示させずメイン画面を出し、
ログインしたことがなければ、そのままログイン画面を表示させることができます。

長くなってしまいましたが、最後まで読んでいただきありがとうございます。
もっとこうした方がいいとかあれば、どんどん言ってください！