Android:如何以编程方式将Activity的主题设置为Theme.Dialog

Android:How to programmatically set an Activity's theme to Theme.Dialog

所以我有一个Activity(比如说TestActivity)需要在正常的未经训练的Activity以及在其他地方的Theme.Dialog。 我试图为这两个任务重用相同的TestActivity

我正在寻找动态设置主题。
代码很简单:
这是我的活动的onCreate,适用于黑色背景

1
2
3
4
5
6
public void onCreate(Bundle icicle) {
    if (Utility.isDialog == true)
        setTheme(android.R.style.Theme_Dialog);
    super.onCreate(icicle);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
.....

这是Manifest Entry

1
 

在此期间,我发现一篇帖子说这里无法完成的帖子是http://code.google.com/p/android/issues/detail?id=4394。但是有一种强烈的感觉 可以做到。

欢迎所有建议。


想解决这个问题。

问题:如何使用基于对话框和全屏的相同活动。

方案:

  • 使用主题@android:style/Theme.Dialog在AndroidManifest.xml中定义您的活动
  • 在各自的.Java文件中,检查intent额外定义dialog模式。
  • 如果它不存在,请将Theme设置为android.R.style.Theme。这是默认的Theme,如果您没有定义任何主题,则会应用它。
  • 代码:

    1
    2
    3
    4
    5
    boolean fDialogMode = getIntent().hasExtra("dialog_mode");

    if( ! fDialogMode ) {
        super.setTheme(android.R.style.Theme);
    }

    替代解决方案:

    更复杂的解决方案是使用AlertDialog,如下所示:

  • 定义从ArrayAdapter扩展的ListAdapter类。
  • getCount函数中返回1

    1
    2
    @Override
    public int getCount() { return 1; }
  • getView函数中,inflate activitylayout,并在返回view之前进行任何自定义。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Override
    public View getView( int position, View view, ViewGroup group ) {
        View v = view;
        if( v == null ) {
            v = getSystemService(Context.LAYOUT_INFLATER_SERVICE).inflate( <layout res id>, null );
        }

    ... Do any customization here    ....

          return v;
    }
  • 如果您没有在activity class中进行太多处理,这绝对是第二选择,这可能是一个选项。

    只考虑这个解决方案的原因可能是在dialog中显示它的逻辑被隔离到用作对话框的地方。

    这两个选项对我有用,但由于显而易见的原因,我选择了第一个选项。 :-)


    您可以在调用setContentView(...)super.oncreate()之前使用setTheme(..),它应该可以正常工作


    和其他几个一样,在onCreate中调用setTheme(在调用super.onCreate之前或之后)都不起作用。但是,通过重写setTheme,我能够指定除Manifest.xml中所述之外的主题。具体来说,以下工作没有问题:

    1
    2
    3
    4
    5
    @Override
    public void setTheme(int resid) {
        boolean changeTheme = true;
        super.setTheme(changeTheme ? android.R.style.Theme_Dialog : resid);
    }

    我在讨论中找到了以上内容:https://code.google.com/p/android/issues/detail?id = 4394


    在调用setContentView()之前,在onCreate()中调用Activity.setTheme()


    在调用super.onCreate(savedInstance)之前使用setTheme


    默认主题库调用:

    1
    super.setTheme(android.R.style.Theme);

    在我的情况下,我使用的是AppCompat主题,因此请确保在您的id上引用正确的库(即):

    1
    super.setTheme(android.support.v7.appcompat.R.style.Theme_AppCompat_NoActionBar);


    这可能不适用于您的情况,但您可以使用主题:

    1
    Theme.Holo.DialogWhenLarge

    它会在屏幕较大时将您的活动显示为对话框,并在屏幕较小时显示为常规活动。
    这在Dialogs的Android文档中有所介绍,还包含有关编写Dialog的信息,该对话框也可以作为全屏片段进行晒黑。


    我知道我迟到但我想在这里发布一个解决方案:

    在这里查看完整的源代码。这是我在更改主题时使用的代码...

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SharedPreferences pref = PreferenceManager
           .getDefaultSharedPreferences(this);
    String themeName = pref.getString("prefSyncFrequency3","Theme1");
    if (themeName.equals("Africa")) {
        setTheme(R.style.AppTheme);
    } else if (themeName.equals("Colorful Beach")) {
        //Toast.makeText(this,"set theme", Toast.LENGTH_SHORT).show();
        setTheme(R.style.beach);
    } else if (themeName.equals("Abstract")) {
        //Toast.makeText(this,"set theme", Toast.LENGTH_SHORT).show();
        setTheme(R.style.abstract2);
    } else if (themeName.equals("Default")) {
        setTheme(R.style.defaulttheme);
    }

    1
    setTheme(android.R.style.Theme_Dialog);