当前位置: 首页 > 面试题库 >

如何以编程方式使活动像对话框一样主题?

彭鸿畅
2023-03-14
问题内容

如何以编程方式(无需触摸AndroidManifext.xml)设置an的主题Activity
,使其看起来像一个对话框?

注意:我可以修改AndroidManifext.xml,只要不需要对其进行修改即可在使其看起来像是正常活动还是对话框之间进行切换。

到目前为止我尝试过的

我根据这个答案尝试了以下方法:

public class DialogActivity extends Activity
{

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        setTheme(android.R.style.Theme_DeviceDefault_Dialog);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dialog);
        Log.d(TAG,"Build.VERSION.SDK_INT: "+Build.VERSION.SDK_INT); // 23
    }
}

我也尝试了:

public class DialogActivity extends Activity
{

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        setTheme(android.R.style.Theme_DeviceDefault_Dialog);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dialog);
        getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
    }
}

但这最终使一切变黑了。

做什么?谢谢。


问题答案:

背景

Activity后面的Acivity绘制,如果根据其前景活动的主题AndroidManifest.xml是对话;
否则,Android操作系统不会 在其Activity后面绘制(可能是为了节省内存,因为通常无论如何都不会看到它)。

为了利用这一点,我们将Acitvity清单的主题设置为清单中的对话框,以使android
os在其Activity后方进行绘制,但随后,以编程方式将Activity的主题设置为运行时所需的主题。

github上的例子

我做了一个例子,并将其放在github上。

讲解

步骤1:
在中为您的应用程序创建两个自定义主题styles.xml。一个用于正常活动,另一个用于对话活动。自定义对话框主题必须从也是对话框的基本主题继承,这一点很重要。在我的情况下,父主题为Base.Theme.AppCompat.Light.Dialog.FixedSize。这是我的styles.xml

<resources>

    <!-- custom normal activity theme -->    
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    </style>

    <!-- custom dialog activity theme -->
    <style name="AppTheme.Dialog" parent="Base.Theme.AppCompat.Light.Dialog.FixedSize">
        <!-- removing the dialog's action bar -->
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

</resources>

步骤2: 在中AndroidManifest.xml,将相关主题设置Activity为任何对话框主题。这使android
os认为Activity对话框是一个对话框,因此它将在对话框Activity后面绘制,而不是将其涂黑。就我而言,我使用Theme.AppCompat.Dialog。以下是我的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.eric.questiondialog_artifact">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name">
        <activity
            android:name=".DialogActivity"
            android:label="@string/app_name"
            android:theme="@style/Theme.AppCompat.Dialog"> <-- IMPORTANT!!! -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

步骤3: 在实际活动中,以编程方式将主题设置为常规活动的主题或对话框的主题。我DialogActivity.java的如下:

package com.example.eric.questiondialog_artifact;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;

public class DialogActivity extends AppCompatActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        setTheme(R.style.AppTheme_Dialog); // can either use R.style.AppTheme_Dialog or R.style.AppTheme as deined in styles.xml
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dialog);
    }
}


 类似资料:
  • 问题内容: 我对joptionpane有疑问。 使用JOptionPane.showMessageDialog(…),我们可以创建一个消息对话框。但是如何以编程方式将其关闭? 问题答案: 您总是可以通过获取其持有的任何组件的WindowAncestor来获得对JOptionPane的引用,然后调用或返回Window。该窗口可以通过使用获得 例如:

  • 编辑:包括示例代码- > mainapp.Java-负责处理应用程序的Java类 controller.java-相应的控制器文件 design.FXML-通过mainapp.java加载并由controller.java控制的应用程序的FXML文件 compute.java-执行计算的另一个java类。 公共类Compute{Alert Alert; } 还有,有没有其他的解决方案可以做到这一点

  • 我想以编程方式取消系统生成的报警对话框。我已经尝试了这里提供的所有解决方案(stackoverflow)但似乎都不起作用。这是普遍接受的答案,但它只排除了通知面板和最近的任务菜单。 我已经在操作系统版本4.0.3、4.2.2、4.4.2和5.1.1的设备上测试了它,它在所有这些设备上都具有相同的行为。有一些应用程序实际上可以取消所有的系统对话框(Mubble)。有人能建议一下是怎么做的吗? 谢谢

  • 我有一个具有对话框样式的活动,因此它可以在上一个活动的顶部显示。 我有一个通知,该通知打开此活动,如下所示:

  • 问题内容: 我有一个隐藏的文件输入元素。是否可以通过按钮的单击事件来触发其 选择文件 对话框? 问题答案: 如果您希望使用自己的按钮来上传文件而不是使用,则可以执行以下操作: 请注意,我使用而不是。您不能在未显示的文件输入上调用click事件。