java - 如何以编程方式将 Activity 主题化为对话?

标签 java android android-activity android-dialog

问题

如何以编程方式(不触及 AndroidManifext.xml)设置 Activity 的主题 so that it looks like a dialog

注意:我可以修改 AndroidManifext.xml,只要它不需要修改就可以在正常 Activity 或对话框之间切换。

到目前为止我尝试了什么

我根据 this stackoverflow answer 尝试了以下操作:

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

但它最终是blacking out everything in the background .

我还看到了this stackoverflow answer ,并尝试:

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));
    }
}

但最终生成了 everything black .

做什么?谢谢。

最佳答案

背景

如果前台 Activity 的主题根据其AndroidManifest.xml 是一个对话框,则在Activity 后面绘制Activity;否则 android 操作系统将在它后面绘制Activity(可能是为了节省内存,因为它通常不会被看到)。

为了利用这一点,我们将 Acitvity 的主题设置为 list 中的一个对话框,让 android 操作系统在它后面绘制 Activity,但后来以编程方式设置我们的 Activity 的主题可以在运行时随心所欲。

Example on github

I made an example and put it on github.

教程

第 1 步:styles.xml 中为您的应用程序创建两个自定义主题。一个用于正常 Activity ,另一个用于对话 Activity 。自定义对话框主题继承自也是对话框的基本主题很重要。在我的例子中,父主题是 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是一个dialog,所以它会绘制它后面的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 步:在实际 Activity 中,以编程方式将主题设置为正常 Activity 的主题或对话的主题。我的 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);
    }
}

关于java - 如何以编程方式将 Activity 主题化为对话?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35834481/

相关文章:

java - defineObjects 在 LR 6.0.5 中给出 ClassNotFound

java - Gradle:应用程序看不到从子模块的第二级导入的代码

java - 在解决依赖项之前运行测试

Android WebView Activity 启动然后在 5.1.1 上崩溃

从另一个应用程序启动 Activity 时的 Android 延迟

android - OnBackPressed 同一 Activity 的多个实例

java - Java 中 enum 是一种类型吗

java - 消息、处理程序和线程 : Lego Mindstorms bluetooth communication

android - 我收到此错误 "your cpu doesn' t 支持 vt-x 或 svm,AMD 6300 处理器中的 android studio 2.1.1”

android - 在 ImageView 上设置负边距会移动 ImageView 而不是 Image