Android Activity 作为一个对话框

Posted

技术标签:

【中文标题】Android Activity 作为一个对话框【英文标题】:Android Activity as a dialog 【发布时间】:2010-12-31 01:33:10 【问题描述】:

我有一个名为whereActity 的活动,它也有子对话框。现在,我想将此活动显示为另一个活动的对话框。

我该怎么做?

【问题讨论】:

如果只想加载对话框,可以使用ProgressDialog 【参考方案1】:

要将活动作为对话框启动,我在androidManifest.xml 中这样定义它:

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

在你的activity 标签中使用这个属性来避免你的对话框出现在最近使用的应用列表中

android:excludeFromRecents="true"

如果您想阻止您的对话框/活动在用户单击对话框外时被破坏:

在您的Activity 中使用setContentView() 之后:

this.setFinishOnTouchOutside(false);

现在当我调用startActivity() 时,它会显示为一个对话框,当用户按下返回按钮时会显示上一个活动。

请注意,如果您使用的是 ActionBarActivity(或 AppCompat 主题),则需要改用 @style/Theme.AppCompat.Dialog

【讨论】:

使用 android:theme="@android:style/Theme.Dialog" 是可行的方法,但不要忘记使用 excludeFromRecents=true 否则您的对话框将出现在最近使用的应用程序中(按住 Home 键)。 我在将活动设置为对话框时遇到了困难。我将活动设置为对话框,但问题是当我在活动之外单击时它会自动关闭..???有没有与此相关的解决方案..?????? @Emmanuel,它必须是 android:excludeFromRecents="true" 注意双引号 请注意,如果您使用的是 ActionBarActivity(或 AppCompat 主题),则需要使用@style/Theme.AppCompat.Dialog @Wolverine,在setContentView() 方法之后添加this.setFinishOnTouchOutside(false);,以防止在您创建的对话框外单击时破坏活动。【参考方案2】:

使用此代码,当用户在对话框外触摸时,对话框活动不会关闭:

this.setFinishOnTouchOutside(false);

需要 API 级别 11

【讨论】:

API @pkgupta,如果您可以接受,您至少不必担心 API 【参考方案3】:

您可以在 values/styles.xml 中定义此样式以执行更旧的 Splash :

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

【讨论】:

re @drawable/trans:您应该能够使用@android:color/transparent,这将创建一个ColorDrawable 用作背景。 ​​@null 是另一种选择 问题是活动填满了整个屏幕,但没有显示为对话框覆盖。 它是&lt;item name="windowNoTitle"&gt;true&lt;/item&gt;(没有“android”)。见here。不确定其他项目。【参考方案4】:

如果您需要 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>

你的清单.xml

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

【讨论】:

这很棒。我需要删除操作栏。我不得不稍微修改 XML。我必须添加&lt;item name="windowNoTitle"&gt;true&lt;/item&gt; 才能让它为我工作。我还添加了&lt;item name="android:windowActionBar"&gt;false&lt;/item&gt; 以进行良好的衡量。 对我来说&lt;item name="android:windowNoTitle"&gt;true&lt;/item&gt;也不起作用(Android 5.0.1),我不得不更改为&lt;item name="windowNoTitle"&gt;true&lt;/item&gt;【参考方案5】:

1 - 您可以动态地使用与对话框和全屏相同的活动:

在您的 Activity 中调用 setContentView(...)super.oncreate() 之前,先调用 setTheme(android.R.style.Theme_Dialog)

2 - 如果您不打算更改活动主题样式,您可以使用

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

(如@faisal khan 所述)

【讨论】:

请注意:当我使用程序化方法(第一种方法)时,对话框后面的所有内容都完全变黑了;不过,这在其他方法中不是问题。太糟糕了......我真的很想以编程方式来做......Nexus 5,Android 6.0.1 @Eric 你找到解决办法了吗?? @anand 是的,将这两种解决方案结合在一起修复了停电问题:将活动主题设置为 android manifest (&lt;activity android:theme="@android:style/Theme.Dialog" /&gt;) 中的对话框主题,并以编程方式将活动主题设置为对话框或onCreate ***.com/a/35915764/2898715【参考方案6】:

如果您的活动被呈现为对话框,只需在活动的 xml 中添加一个按钮,

<Button
    android:id="@+id/close_button"
    android:layout_
    android:layout_
    android:text="Dismiss" />

然后在 Activity 的 Java 代码中附加一个点击监听器。在监听器中,只需调用finish()

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

这应该会关闭您的对话框,将您返回到调用活动。

【讨论】:

【参考方案7】:

如果您想删除活动标题并为对话框提供自定义视图,请将以下内容添加到清单的活动块中

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

并使用您想要的视图设计您的活动布局

【讨论】:

【参考方案8】:

将活动创建为对话框,这是完整示例

    AndroidManife.xml

    &lt;activity android:name=".appview.settings.view.DialogActivity" android:excludeFromRecents="true" android:theme="@style/Theme.AppCompat.Dialog"/&gt;

    DialogActivity.kt

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

    activity_dialog.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_
    android:layout_
    android:background="#0072ff"
    android:gravity="center"
    android:orientation="vertical">
    
    <LinearLayout
        android:layout_
        android:layout_
        android:gravity="center"
        android:orientation="vertical">
    
        <TextView
            android:id="@+id/txtTitle"
            style="@style/normal16Style"
            android:layout_
            android:layout_
            android:gravity="center"
            android:paddingTop="20dp"
            android:paddingBottom="20dp"
            android:text="Download"
            android:textColorHint="#FFF" />
    
        <View
            android:id="@+id/viewDivider"
            android:layout_
            android:layout_
            android:background="#fff"
            android:backgroundTint="@color/white_90"
            app:layout_constraintBottom_toBottomOf="@id/txtTitle" />
    
        <TextView
            style="@style/normal14Style"
            android:layout_
            android:layout_
            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_
            android:layout_
            android:layout_marginBottom="20dp"
            android:background="@drawable/circle_corner_layout"
            android:text="Ok"
            android:textAllCaps="false" />
        </LinearLayout>
    
      </LinearLayout>
    

【讨论】:

请不要使用 x-large 字体让你的答案看起来很奇怪。【参考方案9】:

在您的 android 清单文件中设置主题。

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

并将对话框状态设置为触摸完成。

this.setFinishOnTouchOutside(false);

【讨论】:

【参考方案10】:

有时你会得到下面给出的异常

原因:java.lang.IllegalStateException:您需要在此活动中使用 Theme.AppCompat 主题(或后代)。

所以为了解决你可以使用简单的解决方案

在清单中添加您的活动主题作为 appCompact 的对话框。

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

它可能对某人有帮助。

【讨论】:

以上是关于Android Activity 作为一个对话框的主要内容,如果未能解决你的问题,请参考以下文章

android 对话框Dialog拦截activity事件通知

android 对话框Dialog拦截activity事件通知

android 对话框Dialog拦截activity事件通知

android 对话框Dialog拦截activity事件通知

android 对话框Dialog拦截activity事件通知

如何在 Android 中开始活动之前显示进度对话框?