0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-03-01

できたこと

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

まずは軽く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

ログイン画面

loginActivity1.png

ログイン画面(入力済み)

loginActivity2.png
パスワードは入力させると「・・・」のように表示させてます
ログインIDとパスワードが入力されるとボタンの色が変更し、押下可能状態になります

メイン画面

mainActivity.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()
        }
    }
}

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

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

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?