できたこと
ログインが必要なアプリで、起動時毎にログインするのめんどくさいですよね。
そしてアプリの起動時といえば、スプラッシュ画面。
スプラッシュ画面の後ログイン画面に行くのか、それともログイン不要にしてメイン画面に行くのか
そんな時に使える方法です。
アプリ起動時にスプラッシュ画面を表示させ、
ログインしたことあるならログイン画面によらず、一気にメイン画面を表示させ、
ログインしたことない場合は、そのままログイン画面を表示させます。
まずは軽く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の環境設定からです😀
android {
...
compileSdk 31 // (31以上)
}
...
dependencies {
implementation 'androidx.core:core-splashscreen:1.0.0'
}
次に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を追加
<applicaion
... >
<activity
// ログイン画面からスタートするので変更をお忘れなく
android:name=".LoginActivity"
...
android:theme="@style/SplashScreen">
</activity>
<activity android:name=".MainActivity"/>
</application>
これでスプラッシュ画面の設定は終わりました。
あとはスプラッシュ画面の実装のみです。
SplashScreenの実装
レイアウトから💪
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(メイン画面)
<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)
スプラッシュ画面
ログイン画面
ログイン画面(入力済み)
パスワードは入力させると「・・・」のように表示させてます
ログインIDとパスワードが入力されるとボタンの色が変更し、押下可能状態になります
メイン画面
各自でより良いレイアウトを作成してください!
レイアウトはこんなもんにして、次にコードを書いていきます。
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(メイン画面)
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()
}
}
}
完成しました!!
これでログインが必要なアプリで、起動時にスプラッシュ画面が表示され、
過去にログインしたことがあれば、ログイン画面を表示させずメイン画面を出し、
ログインしたことがなければ、そのままログイン画面を表示させることができます。
長くなってしまいましたが、最後まで読んでいただきありがとうございます。
もっとこうした方がいいとかあれば、どんどん言ってください!