ダイアログとしてのAndroidアクティビティ


257

whereActity子ダイアログもあるという名前のアクティビティがあります。次に、このアクティビティを別のアクティビティのダイアログとして表示します。

どうやってやるの?

ここに画像の説明を入力してください


ダイアログの読み込みだけが必要な場合は、ProgressDialog
Daksh Agrawal

回答:


546

ダイアログとしてアクティビティを開始するには、次のように定義しましたAndroidManifest.xml

<activity android:theme="@android:style/Theme.Dialog" />

activityタグ内でこのプロパティを使用して、最近使用したアプリのリストにダイアログが表示されないようにします

android:excludeFromRecents="true"

ユーザーがダイアログの外側をクリックしたときにダイアログ/アクティビティが破棄されないようにする場合:

setContentView()あなたのActivity使用後:

this.setFinishOnTouchOutside(false);

これを呼び出すstartActivity()と、ダイアログとして表示され、ユーザーが戻るボタンを押すと前のアクティビティが表示されます。

あなたが使用している場合がありますActionBarActivity(またはAPPCOMPATテーマ)、あなたが使用する必要があります@style/Theme.AppCompat.Dialog代わりに。


186
android:theme = "@ android:style / Theme.Dialog"を使用する方法ですが、excludeFromRecents = trueを使用することを忘れないでください。そうしないと、最近使用したアプリにダイアログが表示されます(Homeキーを押したままにします)。
Emmanuel

7
ダイアログとしてのアクティビティに関連する問題があります。アクティビティをダイアログとして作成しましたが、アクティビティの外側をクリックすると、アクティビティが自動的に閉じてしまいます。.??? これに関連する解決策はありますか.. ??????
ウルヴァリン

7
@Emmanuel、それはandroid:excludeFromRecents = "true"である必要があります二重引用符に注意してください
Sandeep

43
ActionBarActivity(またはAppCompatテーマ)を使用している場合は、使用する必要があることに注意してください@style/Theme.AppCompat.Dialog
Quentin Klein

8
@Wolverine、this.setFinishOnTouchOutside(false);後のsetContentView()メソッドを追加して、作成したダイアログの外側をクリックしたときにアクティビティが破棄されないようにします。
Anggrayudi H 2015

43

このコードを使用して、ユーザーがダイアログボックスの外側をタッチしたときにダイアログアクティビティが閉じないようにします。

this.setFinishOnTouchOutside(false);

APIレベル11が必要


1
API <11の解決策はありますか?
PKグプタ2016年

@pkgupta、それが受け入れられるものであれば、少なくとも以前のバージョンを使用している人はほとんどいないので、少なくともAPI <15について心配する必要はありません。実際、2017年現在、19または20が新しいminSDKだと思います。
ネオンワージ2017年

28

このスタイルをvalues / styles.xmlで定義して、以前のスプラッシュを実行できます。

   <style name="Theme.UserDialog" parent="android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:background">@android:color/transparent</item>
        <item name="android:windowBackground">@drawable/trans</item>
    </style>

そして、AndroidManifest.xmlを使用します。

   <activity android:name=".SplashActivity"
          android:configChanges="orientation"
          android:screenOrientation="sensor"
          android:theme="@style/Theme.UserDialog">

2
re @drawable/trans:背景として使用@android:color/transparentするを作成することができるはずColorDrawableです。
TWiStErRob 2014年

1
<item name = "android:windowBackground">​​ @ null </ item>は別の選択肢です
TouchBoarder

問題は、アクティビティが画面全体に表示されるが、ダイアログオーバーレイとして表示されないことです。
Shajeel Afzal

<item name="windowNoTitle">true</item> (「android」ではありません)。こちらをご覧ください。他のアイテムについてはわかりません。
Gary99 '09 / 09/28

23

1-ダイアログとフルスクリーンの両方で同じアクティビティを動的に使用できます。

コールsetTheme(android.R.style.Theme_Dialog)を呼び出す前にsetContentView(...)してsuper.oncreate()、あなたの活動に。

2-使用できるアクティビティテーマスタイルを変更する予定がない場合

<activity android:theme="@android:style/Theme.Dialog" />

(@faisal khanが言及したように)


注:プログラムによる方法(最初の方法)を使用すると、ダイアログボックスの背後にあるすべてのものが完全に黒くなります。ただし、これは他の方法では問題ではありませんでした。ひどすぎる...私はプログラムでそれを本当にやりたかった... Nexus 5、Android 6.0.1
Eric

@エリックあなたはブラックアウトの解決策を見つけましたか?
anand

1
@anandはい、両方のソリューションを組み合わせるとブラックアウトの問題が修正されます。アクティビティのテーマをAndroidマニフェスト(<activity android:theme="@android:style/Theme.Dialog" />)のダイアログテーマに設定し、プログラムでアクティビティのテーマをダイアログまたはonCreateのアクティビティに設定しますstackoverflow.com/a/35915764/2898715
エリック

21

Appcompatバージョンが必要な場合

style.xml

    <!-- Base application theme. -->
    <style name="AppDialogTheme" parent="Theme.AppCompat.Light.Dialog">
        <!-- Customize your theme here. -->
        <item name="windowActionBar">false</item>
        <item name="android:windowNoTitle">true</item>
    </style>

yourmanifest.xml

    <activity
          android:name=".MyActivity"
          android:label="@string/title"
          android:theme="@style/AppDialogTheme">
    </activity>

これは素晴らしい。アクションバーを削除する必要がありました。ただし、XMLを少し変更する必要がありました。それを機能<item name="windowNoTitle">true</item>させるために追加する必要がありました。私はまた、適度に追加しました<item name="android:windowActionBar">false</item>
エリック

5
また、私にとって <item name="android:windowNoTitle">true</item>は機能せず(Android 5.0.1)、変更する必要がありました<item name="windowNoTitle">true</item>
noti

17

アクティビティがダイアログとしてレンダリングされている場合は、アクティビティのxmlにボタンを追加するだけです。

<Button
    android:id="@+id/close_button"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Dismiss" />

次に、アクティビティのJavaコードにクリックリスナーをアタッチします。リスナーで、単に呼び出すfinish()

Button close_button = (Button) findViewById(R.id.close_button);
close_button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        finish();
    }
});

これでダイアログが閉じ、呼び出し元のアクティビティに戻ります。


8

アクティビティヘッダーを削除してダイアログのカスタムビューを提供する場合は、マニフェストのアクティビティブロックに以下を追加します

android:theme="@style/Base.Theme.AppCompat.Dialog"

そして、あなたの望みのビューであなたのactivity_layoutをデザインしてください


2

Androidマニフェストファイルにテーマを設定します。

<activity android:name=".LoginActivity"
            android:theme="@android:style/Theme.Dialog"/>

タッチでダイアログの状態を設定して終了します。

this.setFinishOnTouchOutside(false);

1

ダイアログとしてアクティビティを作成します。これは完全な例です

ここに画像の説明を入力してください

  1. AndroidManife.xml

    <activity android:name=".appview.settings.view.DialogActivity" android:excludeFromRecents="true" android:theme="@style/Theme.AppCompat.Dialog"/>

  2. DialogActivity.kt

    class DialogActivity : AppCompatActivity() {
      override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_dialog)
        this.setFinishOnTouchOutside(true)
    
        btnOk.setOnClickListener {
          finish()
        }
      }
    }
  3. activity_dialog.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#0072ff"
    android:gravity="center"
    android:orientation="vertical">
    
    <LinearLayout
        android:layout_width="@dimen/_300sdp"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="vertical">
    
        <TextView
            android:id="@+id/txtTitle"
            style="@style/normal16Style"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:paddingTop="20dp"
            android:paddingBottom="20dp"
            android:text="Download"
            android:textColorHint="#FFF" />
    
        <View
            android:id="@+id/viewDivider"
            android:layout_width="match_parent"
            android:layout_height="2dp"
            android:background="#fff"
            android:backgroundTint="@color/white_90"
            app:layout_constraintBottom_toBottomOf="@id/txtTitle" />
    
        <TextView
            style="@style/normal14Style"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:paddingTop="20dp"
            android:paddingBottom="20dp"
            android:text="Your file is download"
            android:textColorHint="#FFF" />
    
    
        <Button
            android:id="@+id/btnOk"
            style="@style/normal12Style"
            android:layout_width="100dp"
            android:layout_height="40dp"
            android:layout_marginBottom="20dp"
            android:background="@drawable/circle_corner_layout"
            android:text="Ok"
            android:textAllCaps="false" />
        </LinearLayout>
    
      </LinearLayout>

回答を奇妙に見せるためにx-largeフォントを使用しないでください。
CopsOnRoad

0

以下に示す例外が発生する場合があります

原因:java.lang.IllegalStateException:このアクティビティでは、Theme.AppCompatテーマ(または子孫)を使用する必要があります。

だから解決するためにあなたは簡単な解決策を使うことができます

appCompactのダイアログとして、マニフェストにアクティビティのテーマを追加します。

android:theme="@style/Theme.AppCompat.Dialog"

それは誰かのために役立ちます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.