目次
概要
Activityからダイアログを表示する方法は多く書かれているのだが、Fragmentからダイアログを表示するという方法はなかなか見つからなかった。
全てActivityに書くのもどうかと思うし、Activity一つに対してたくさんのFragmentで実装されている現場もあったので、Fragmentを使用した実装は今後もしていきたい。
ソースコード
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.Test"
tools:targetApi="31">
<activity android:name=".ButtonActionActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:exported="false">
</activity>
</application>
</manifest>
ButtonActionActivity.kt
package com.seeking_star.test
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.MenuItem
import com.seeking_star.test.Enumration.MagicType
import com.seeking_star.test.ui.main.MainFragment
import com.seeking_star.test.ButtonAction.ButtonActionFragment
class ButtonActionActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_button_action)
if (savedInstanceState == null) {
supportFragmentManager.beginTransaction()
.replace(R.id.container, ButtonActionFragment.newInstance())
.commitNow()
}
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
var returnVal = true
when(item.itemId) {
android.R.id.home -> {
finish()
Log.d("itemId", "android.R.id.home")
}
else -> {
returnVal = super.onOptionsItemSelected(item)
Log.d("else", returnVal.toString())
}
}
return returnVal
}
}
activity_button_action.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ButtonActionActivity" />
ButtonActionFragment.kt
package com.seeking_star.test.ButtonAction
import android.graphics.Color
import androidx.lifecycle.ViewModelProvider
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import com.seeking_star.test.R
class ButtonActionFragment : Fragment() {
companion object {
fun newInstance() = ButtonActionFragment()
}
private lateinit var viewModel: ButtonActionViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel = ViewModelProvider(this).get(ButtonActionViewModel::class.java)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val view = inflater.inflate(R.layout.fragment_button_action, container, false)
val button = view.findViewById<Button>(R.id.testButton)
button.setOnClickListener {
view.setBackgroundColor(Color.CYAN)
AlertDialog.Builder(requireActivity())
.setTitle("テスト")
.setMessage("テストメッセージ")
.setPositiveButton("OK") { _, _ ->
Log.d("OKボタン", "OKボタンが押された時の処理")
}
.show()
}
return view
}
}
fragment_button_action.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:id="@+id/sub"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ButtonAction.ButtonActionFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
<Button
android:id="@+id/testButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ボタンを押してみてね" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
ButtonActionViewModel.kt
package com.seeking_star.test.ButtonAction
import androidx.lifecycle.ViewModel
class ButtonActionViewModel: ViewModel() {
// TODO: Implement the ViewModel
}
デモ動画
詳細
ダイアログ表示の基本
ダイアログの基本となる処理はこれだ。
AlertDialog.Builder(requireActivity())
.setTitle("テスト")
.setMessage("テストメッセージ")
.setPositiveButton("OK") { _, _ ->
Log.d("OKボタン", "OKボタンが押された時の処理")
}
.show()
AlertDialogクラスを使用することで簡単に実装できる。
Builderの中に入るのは現在表示しているActivityを入れる必要があるのだが、そこはrequireActivityを使用することで現在のActivityを取得している。
Activityで実装した場合は「this」を使えばいいのだが、ここはFragment。thisではエラーが出る。そのため、requireActivity()を使用することでこれが解決する。
また、以下のメソッドを使用することでダイアログのさまざまな設定ができる。
メソッド名 | 設定内容 |
setTitle | ダイアログのタイトル |
setMessage | ダイアログに表示するメッセージ |
setPositiveButton | ダイアログのOKボタンの文言(OKボタンは少し太文字で表示される) 処理の内部はOKボタンを押下した時の処理 |
setNegativeButton | ダイアログのいいえボタンの文言 処理の内部はいいえボタンを押下した時の処理 |
setNeutralButton | ダイアログのニュートラルボタンの文言(このボタンは左下に表示される) 処理の内部はニュートラルボタンを押下した時の処理 |
また、こちらにはxmlファイルを使用してダイアログをカスタマイズすることもできるらしい。
これはまた後日ということになる。直近ではこのメッセージを表示させるダイアログの実装さえできればいいだろう。