Aktivitas Android sebagai dialog


257

Saya memiliki Kegiatan bernama whereActityyang memiliki dialog anak juga. Sekarang, saya ingin menampilkan aktivitas ini sebagai dialog untuk aktivitas lain.

Bagaimana saya bisa melakukan itu?

masukkan deskripsi gambar di sini


Jika Anda hanya ingin memuat dialog, Anda dapat menggunakan ProgressDialog
Daksh Agrawal

Jawaban:


546

Untuk memulai aktivitas sebagai dialog, saya mendefinisikannya seperti ini di AndroidManifest.xml:

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

Gunakan properti ini di dalam activitytag Anda untuk menghindari agar Dialog Anda muncul di daftar aplikasi yang baru saja digunakan

android:excludeFromRecents="true"

Jika Anda ingin menghentikan dialog / aktivitas Anda dari kehancuran ketika pengguna mengklik di luar dialog:

Setelah setContentView()Anda Activitygunakan:

this.setFinishOnTouchOutside(false);

Sekarang ketika saya menyebutnya startActivity()menampilkan sebagai dialog, dengan aktivitas sebelumnya ditampilkan ketika pengguna menekan tombol kembali.

Perhatikan bahwa jika Anda menggunakan ActionBarActivity(atau tema AppCompat), Anda harus menggunakannya @style/Theme.AppCompat.Dialog.


186
Menggunakan android: theme = "@ android: style / Theme.Dialog" adalah cara untuk pergi tetapi jangan lupa untuk menggunakan excludeFromRecents = true atau dialog Anda akan muncul di Aplikasi yang Baru Digunakan (tahan tombol Home).
Emmanuel

7
saya mengalami kesulitan terkait dengan aktivitas sebagai dialog .. saya membuat aktivitas sebagai dialog tetapi masalahnya adalah ketika saya mengklik di luar aktivitas itu secara otomatis ditutup .. ??? apakah ada solusi yang terkait dengan ini .. ??????
Wolverine

7
@ Emmanuel, itu harus android: excludeFromRecents = "true" perhatikan tanda kutip ganda
Sandeep

43
Perhatikan bahwa jika Anda menggunakan ActionBarActivity (atau tema AppCompat), Anda harus menggunakan@style/Theme.AppCompat.Dialog
Quentin Klein

8
@Wolverine, Tambah metode this.setFinishOnTouchOutside(false);setelah setContentView()untuk mencegah aktivitas dihancurkan ketika Anda mengklik di luar dialog yang Anda buat.
Anggrayudi H

43

Gunakan kode ini sehingga aktivitas dialog tidak akan ditutup ketika pengguna menyentuh di luar kotak dialog:

this.setFinishOnTouchOutside(false);

membutuhkan API level 11


1
Apakah ada solusi untuk API <11?
PK Gupta

@ pkgupta, jika dapat diterima oleh Anda, Anda tidak perlu khawatir setidaknya API <15 karena saya tidak banyak orang yang menggunakan versi sebelumnya. Bahkan, pada 2017, saya pikir 19 atau 20 adalah minSDK baru.
Neon Warge

28

Anda dapat mendefinisikan gaya ini dalam values ​​/ styles.xml untuk melakukan Splash yang lebih lama:

   <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>

Dan gunakan itu AndroidManifest.xml:

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

2
re @drawable/trans: Anda harus dapat menggunakan @android:color/transparentyang akan membuat ColorDrawableuntuk digunakan sebagai latar belakang.
TWiStErRob

1
<item name = "android: windowBackground"> ​​@ null </item> adalah alternatif lain
TouchBoarder

Masalahnya adalah bahwa aktivitas mengisi seluruh layar tetapi tidak ditampilkan sebagai overlay dialog.
Shajeel Afzal

Itu <item name="windowNoTitle">true</item> (tidak ada "android"). Lihat di sini . Tidak yakin tentang barang-barang lainnya.
Gary99

23

1 - Anda dapat menggunakan aktivitas yang sama dengan dialog dan layar penuh, secara dinamis:

Panggil setTheme(android.R.style.Theme_Dialog)sebelum menelepon setContentView(...)dan super.oncreate()dalam Aktivitas Anda.

2 - Jika Anda tidak berencana mengubah gaya tema aktivitas yang dapat Anda gunakan

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

(seperti yang disebutkan oleh @faisal khan)


Hanya sebuah catatan: ketika saya menggunakan metode programatik (metode pertama), semua yang ada di belakang kotak dialog itu sepenuhnya gelap; ini bukan masalah dalam metode lain. Sayang sekali ... Saya benar-benar ingin melakukannya secara terprogram .... Nexus 5, Android 6.0.1
Eric

@ Eric apakah Anda menemukan solusi untuk pingsan ??
anand

1
@dan ya, menggabungkan kedua solusi bersama-sama memperbaiki masalah pemadaman: setel tema aktivitas ke tema dialog di manifes android ( <activity android:theme="@android:style/Theme.Dialog" />) dan setel program secara terprogram untuk dialog atau aktivitas di onCreate stackoverflow.com/a/35915764/2898715
Eric

21

Jika Anda membutuhkan Versi 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>

Ini bagus. Saya perlu menghapus bilah tindakan. Saya harus memodifikasi XML sedikit. Saya harus menambahkan <item name="windowNoTitle">true</item>untuk membuatnya bekerja untuk saya. Saya juga menambahkan <item name="android:windowActionBar">false</item>untuk ukuran yang baik.
Eric

5
Juga bagi saya <item name="android:windowNoTitle">true</item>tidak bekerja (Android 5.0.1), dan saya harus mengubah ke<item name="windowNoTitle">true</item>
noti

17

Jika aktivitas Anda diterjemahkan sebagai dialog, cukup tambahkan tombol ke xml aktivitas Anda,

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

Kemudian lampirkan pendengar klik dalam kode Java Activity Anda. Di pendengar, cukup panggilfinish()

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

Itu akan mengabaikan dialog Anda, mengembalikan Anda ke aktivitas menelepon.


8

Jika Anda ingin menghapus tajuk aktivitas & memberikan tampilan khusus untuk dialog, tambahkan berikut ini ke blok aktivitas manifes Anda

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

dan rancang activity_layout Anda dengan tampilan yang Anda inginkan


2

Setel tema di file manifes Android Anda.

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

Dan atur status dialog pada sentuhan untuk menyelesaikan.

this.setFinishOnTouchOutside(false);

1

Buat aktivitas sebagai dialog, Ini Contoh Lengkap

masukkan deskripsi gambar di sini

  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>

Tolong jangan gunakan font x-besar untuk membuat jawaban Anda terlihat aneh.
CopsOnRoad

0

Beberapa kali Anda bisa mendapatkan Pengecualian yang diberikan di bawah ini

Disebabkan oleh: java.lang.IllegalStateException: Anda perlu menggunakan tema Theme.AppCompat (atau keturunan) dengan aktivitas ini.

Jadi untuk menyelesaikannya Anda bisa menggunakan solusi sederhana

tambahkan tema aktivitas Anda dalam manifes sebagai dialog untuk appCompact.

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

Ini dapat bermanfaat bagi seseorang.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.