如何以编程方式将活动主题设置为对话?问题到目前为止,我尝试过什么背景github 上的示例教程

问题

如何以编程方式(不触及)设置主题,使其看起来像对话AndroidManifext.xmlActivity

注意:我可以修改,只要它不需要修改,以便在使其看起来像正常活动或对话框之间切换。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));
    }
}

但它最终使一切都是黑色的。

怎么办?谢谢。


答案 1

背景

如果前景活动的主题根据其是对话,则绘制后面 ;否则,android操作系统将不会绘制它后面的内容(可能是为了节省内存,因为它通常不会被看到)。ActivityAcivityAndroidManifest.xmlActivity

为了利用这一点,我们将主题设置为清单中的对话,使android操作系统绘制其背后的内容,但后来,以编程方式将我们的主题设置为我们在运行时喜欢的任何内容。AcitvityActivityActivity

github 上的示例

我做了一个例子,把它放在github上。

教程

步骤 1:在 中为应用程序创建两个自定义主题。一个用于正常活动,另一个用于对话活动。自定义对话主题必须从也是对话的基本主题继承。在我的情况下,父主题是 )。这是我的:styles.xmlBase.Theme.AppCompat.Light.Dialog.FixedSizestyles.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:在 中,将有问题的主题设置为任何对话主题。这使得android操作系统认为这是一个对话框,因此它会将其绘制在后面,而不会将其涂黑。在我的情况下,我使用了.以下是我的:AndroidManifest.xmlActivityActivityActivityTheme.AppCompat.DialogAndroidManifest.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);
    }
}

答案 2

如果你要找的只是一个具有透明背景的主题,只需使用这个:

<style name="Theme.Transparent" parent="android:Theme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:backgroundDimEnabled">false</item>
</style>

将此样式应用于您在AndroidManifest文件中的活动,仅此而已


推荐