LoginSignup
2
0

More than 5 years have passed since last update.

背景が透過しているDialogをつくる

Posted at

この前書いた記事
爆速でfloat menuを作ってみた
今回、float menuをタップしたらDialogを出したい。

ServiceからDialogを出す

ServiceからDialogを出すにはDialog用のActivityを作る必要がある。

FloatMenuService.kt
//「爆速でfloat menuを作ってみた」で書いたFloatMenuService.ktの最後
        floatMenuView.setOnClickListener {
            //タップした時の処理
            //Intentを作ってActivityを立ち上がる
                val intent = Intent(this, DialogActivity::class.java)
                intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
                application.startActivity(intent)
        }

Dialog用のActivityを作る

DialogActivity.kt
class DialogActivity : FragmentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val fragment = DialogFragment()
        fragment.show(fragmentManager , "alert_dialog")
    }
}

作ったActivityをAndroidManifestに追加する

AndroidManifest.xml
        <activity
            android:name=".DialogActivity"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            />

Dialogを表示するFragmentを作る

DialogFragment.kt
class DialogFragment : DialogFragment() {

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val builder = AlertDialog.Builder(activity)
        val dialog = builder.setTitle("Dialog").setMessage("うんうん、それもまたアイカツだね!").create()
        dialog.setCanceledOnTouchOutside(true)

        return dialog
    }

    override fun onStop() {
        super.onStop()
        activity.finish()
    }
}

こんな感じになった

Untitled.gif

あれ、背景が透過しているけど...何故かMainActivityがバックグラウンドから立ち上がったのか...イメージしたものと若干違うね

MainActivityを立ち上がらないようにする

どうやらこれはActivityの起動方法android:launchModeに関係があるらしい
https://developer.android.com/guide/topics/manifest/activity-element?hl=ja#lmode
今回の条件を満たすためにはandroid:launchModesingleInstanceに設定する必要らしい
公式の説明

singleInstance:システムが、インスタンスを保持しているタスクで他のアクティビティを起動しないことを除いて、"singleTask" と同じです。 アクティビティは常に、そのタスクの唯一のメンバーです。

singleInstanceの設定によってDialogActivityとMainActivityが同じタスクではなくなって、別々のタスクとして動いてるので、DialogActivityを呼び出されたときMainActivityはまだバックグラウンドにいることになった。
一行を足してこんな感じになった

AndroidManifest.xml
        <activity
            android:name=".DialogActivity"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:launchMode="singleInstance"             
        />

Untitled.gif

今回のまとめ

  1. ServiceからDialogを出したい時はActivityから出す必要がある
  2. LaunchModeをやりたいことによってちゃんと設定しましょう〜
2
0
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
2
0