Bir iletişim kutusu olarak Android Etkinliği


Yanıtlar:


547

Etkinliği iletişim kutusu olarak başlatmak için şöyle tanımladım AndroidManifest.xml:

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

activityİletişim Kutunuzun son kullanılan uygulamalar listesinde görünmesini önlemek için etiketinizin içindeki bu özelliği kullanın

android:excludeFromRecents="true"

Kullanıcı iletişim kutusunun dışını tıkladığında iletişim kutusunun / etkinliğinizin yok edilmesini durdurmak istiyorsanız:

Sonra setContentView()sizin de Activitykullanıma:

this.setFinishOnTouchOutside(false);

Şimdi aradığımda startActivity(), kullanıcı geri düğmesine bastığında önceki etkinlik ile birlikte bir iletişim kutusu olarak görüntülenir.

Eğer kullanıyorsanız unutmayın ActionBarActivity(veya AppCompat tema), kullanmak gerekir @style/Theme.AppCompat.Dialogbunun yerine.


186
Android: theme = "@ android: style / Theme.Dialog" kullanmak için bir yoldur ama excludeFromRecents = true kullanmayı unutmayın ya da iletişim kutusunuz Son Kullanılan Uygulamalarda görünecektir (Ana Ekran tuşunu basılı tutun).
Emmanuel

7
diyalog olarak aktivite ile ilgili zorluk var .. diyalog olarak aktivite yaptı ama sorun otomatik olarak kapanır faaliyet dışında tıklayın .. ??? bununla ilgili herhangi bir çözüm var mı .. ??????
Wolverine

7
@Emmanuel, android olmalı: excludeFromRecents = "true" çift tırnak dikkat edin
Sandeep

43
ActionBarActivity (veya AppCompat teması) kullanıyorsanız, şunları kullanmanız gerektiğini unutmayın@style/Theme.AppCompat.Dialog
Quentin Klein

8
@Wolverine, Oluşturduğunuz iletişim kutusunun dışını tıklattığınızda etkinliğin yok olmasını önlemek için this.setFinishOnTouchOutside(false);after after setContentView()yöntemi.
Anggrayudi H

43

Kullanıcı iletişim kutusunun dışına dokunduğunda iletişim kutusu etkinliğinin kapanmaması için bu kodu kullanın:

this.setFinishOnTouchOutside(false);

API seviye 11 gerektirir


1
API <11 için herhangi bir çözüm var mı?
PK Gupta

@pkgupta, sizin için kabul edilebilirse, benim için en azından API <15'i endişelendirmemelisiniz, çünkü bu önceki sürümleri kullanan çok fazla insan yoktur. Aslında, 2017 itibariyle, 19 veya 20'nin yeni minSDK olduğunu düşünüyorum.
Neon Warge

28

Daha eski bir Sıçrama gerçekleştirmek için bu stili değerleri / styles.xml dosyasında tanımlayabilirsiniz:

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

Ve AndroidManifest.xml dosyasını kullanın:

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

2
re @drawable/trans: Eğer arka plan olarak kullanmak @android:color/transparentiçin bir oluşturacak kullanmak mümkün olmalıdır ColorDrawable.
TWiStErRob

1
<item name = "android: windowBackground"> ​​@ null </item> başka bir alternatif
TouchBoarder

Sorun, etkinliğin tüm ekranı doldurması, ancak iletişim kutusu yer paylaşımı olarak gösterilmemesidir.
Shajeel Afzal

Öyle <item name="windowNoTitle">true</item> ("android" yok). Buraya bakın . Diğer öğelerden emin değilim.
Gary99

23

1 - Hem iletişim hem de tam ekran ile aynı etkinliği dinamik olarak kullanabilirsiniz:

Aramadan setTheme(android.R.style.Theme_Dialog)önce setContentView(...)ve super.oncreate()Faaliyetinizde arayın .

2 - Etkinlik teması stilini değiştirmeyi planlamıyorsanız,

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

(@faisal khan tarafından belirtildiği gibi)


Sadece bir not: Programlı yöntemi (ilk yöntem) kullandığımda, iletişim kutusunun arkasındaki her şey tamamen karartılmış; bu diğer yöntemde bir sorun değildi. Çok kötü ... Gerçekten programlı olarak yapmak istedim .... Nexus 5, Android 6.0.1
Eric

@ Karartılmış için çözüm buldunuz mu ??
anand

1
@anand yes, her iki çözümü birlikte birleştirmek, karartma sorununu giderir: Android manifest'te ( <activity android:theme="@android:style/Theme.Dialog" />) bir etkinlik temasını etkinlik teması olarak ayarlayın ve onCreate'de bir iletişim kutusuna veya bir etkinliğe programatik olarak etkinlik teması ayarlayın stackoverflow.com/a/35915764/2898715
Eric

21

Appcompat Sürümü'ne ihtiyacınız varsa

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>

Bu harika. İşlem çubuğunu kaldırmam gerekiyordu. Yine de XML'i biraz değiştirmek zorunda kaldım. Benim <item name="windowNoTitle">true</item>için işe yaraması için eklemem gerekiyordu. Ayrıca <item name="android:windowActionBar">false</item>iyi bir önlem için ekledim .
Eric

5
Ayrıca benim için <item name="android:windowNoTitle">true</item>işe yaramadı (Android 5.0.1) ve ben değiştirmek zorunda kaldım<item name="windowNoTitle">true</item>
noti

17

Etkinliğiniz bir iletişim kutusu olarak oluşturuluyorsa, etkinliğinizin xml'sine bir düğme ekleyin,

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

Ardından, Etkinliğinizin Java koduna bir tıklama dinleyici ekleyin. Dinleyicide,finish()

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

Bu, sizi arama etkinliğine döndürerek iletişim pencerenizi kapatmalıdır.


8

Etkinlik üstbilgisini kaldırmak ve iletişim kutusu için özel bir görünüm sağlamak istiyorsanız, bildiriminizin etkinlik bloğuna aşağıdakileri ekleyin

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

ve etkinlik görünümünüzü istediğiniz görünümle tasarlayın


2

Temayı android bildirim dosyanızda ayarlayın.

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

Ve iletişim durumunu bitirmek için dokunarak ayarlayın.

this.setFinishOnTouchOutside(false);

1

Etkinlik olarak iletişim kutusu oluştur, İşte Tam Örnek

resim açıklamasını buraya girin

  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>
    

Cevabınızın tuhaf görünmesi için lütfen x büyük yazı tiplerini kullanmayın.
CopsOnRoad

0

Bazı durumlarda aşağıda verilen İstisna'yı alabilirsiniz

Nedeni: java.lang.IllegalStateException: Bu etkinlikle bir Theme.AppCompat teması (veya köken) kullanmanız gerekir.

Böylece çözmek için basit bir çözüm kullanabilirsiniz

appCompact için iletişim kutusu olarak manifest etkinliğinizin temasını ekleyin.

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

Birisi için yararlı olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.