如何以编程方式将活动主题化为对话框?

Eri*_*ric 9 java android android-dialog android-activity

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

注意:我可以修改它AndroidManifext.xml,只要它不需要修改就可以在看起来像普通活动或对话框之间切换.

到目前为止我尝试过的

我根据这个stackoverflow答案尝试了以下内容:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

但它最终会在背景中消除掉一切.

我也看到了这个stackoverflow的答案,并试过:

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

但它最终使一切变黑.

做什么?谢谢.

Eri*_*ric 16

背景

Activity后面的Acivity绘制,如果根据其前景活动的主题AndroidManifest.xml是对话; 否则android os将不会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>
Run Code Online (Sandbox Code Playgroud)

第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>
Run Code Online (Sandbox Code Playgroud)

步骤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);
    }
}
Run Code Online (Sandbox Code Playgroud)