Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:如何以编程方式设置活动';s主题到主题。对话框_Android_Android Activity_Dialog_Themes - Fatal编程技术网

Android:如何以编程方式设置活动';s主题到主题。对话框

Android:如何以编程方式设置活动';s主题到主题。对话框,android,android-activity,dialog,themes,Android,Android Activity,Dialog,Themes,因此,我有一个活动(比如测试活动),它需要作为一个正常的非主题活动,以及一个主题。对话框。我试图为这两个任务重用相同的TestActivity 我所要做的就是动态地设置主题。 代码很简单: 这是我的活动的onCreate,它在黑色背景下工作 public void onCreate(Bundle icicle) { if (Utility.isDialog == true) setTheme(android.R.style.Theme_Dialog); super

因此,我有一个
活动
(比如
测试活动
),它需要作为一个正常的非主题
活动
,以及一个
主题。对话框
。我试图为这两个任务重用相同的
TestActivity

我所要做的就是动态地设置主题。 代码很简单: 这是我的活动的
onCreate
,它在黑色背景下工作

public void onCreate(Bundle icicle) {
    if (Utility.isDialog == true)
        setTheme(android.R.style.Theme_Dialog);
    super.onCreate(icicle);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
.....
这是舱单条目

<activity android:name=".TestActivity"/>
。但有一种强烈的感觉,这是可以做到的


欢迎提出所有建议。

在调用
setContentView()
之前,请先调用
onCreate()
。希望给出解决此问题的方法

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

解决方案:

  • 使用主题
    @android:style/theme.Dialog

  • 在各自的
    .Java
    文件中,检查定义
    对话框
    模式的
    意图
    额外信息
  • 如果不存在,请将
    主题设置为
    android.R.style.Theme
    。这是默认的
    主题
    ,如果未定义任何主题,将应用该主题
  • 代码:

    boolean fDialogMode = getIntent().hasExtra("dialog_mode");
    
    if( ! fDialogMode ) {
        super.setTheme(android.R.style.Theme);
    }
    
    替代解决方案:

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

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

    @Override
    public int getCount() { return 1; }
    
  • getView
    功能中,
    活动的
    布局进行充气
    ,并在返回
    视图之前进行任何自定义

    @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;
    }
    
    @覆盖
    公共视图getView(内部位置、视图视图、视图组){
    视图v=视图;
    如果(v==null){
    v=getSystemService(Context.LAYOUT\u INFLATER\u SERVICE).inflate(,null);
    }
    …在这里进行任何自定义。。。。
    返回v;
    }
    
  • 如果您在
    活动
    中没有做太多处理,这肯定是第二个选择,这可能是一个选项

    仅考虑这种解决方案的原因可能是在<>代码>对话框/代码>中显示的逻辑被隔离到用作对话的地方。


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

    您可以在调用
    setContentView(…)
    super.oncreate()
    之前使用
    setTheme(…)
    ,它应该可以正常工作在调用
    super.oncreate(savedInstance)
    之前使用
    setTheme
    像其他几种方法一样,在oncreate中调用setTheme(在调用super.oncreate之前或之后)不起作用。但是,通过重写setTheme,我能够指定Manifest.xml中声明的主题以外的主题。具体而言,以下各项工作没有问题:

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

    我在讨论中发现上述内容:

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

    Theme.Holo.DialogWhenLarge
    
    当屏幕较大时,它会将您的活动显示为对话框,当屏幕较小时,它会将您的活动显示为常规活动。
    这在上的Android文档中有介绍,还包含有关编程对话框的信息,该对话框也可以作为全屏片段使用sun。

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

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

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

    默认主题库调用:

    super.setTheme(android.R.style.Theme);
    
    在我的例子中,我使用的是AppCompat主题,因此请确保您在id上引用了正确的库(即):


    鲁本,虽然它可以工作(我之前也试过),但我看到的是黑色背景,而不是调用Activity,所以您的主题属性不正确。你的android:windowBackground设置为什么?鲁本:我还没有定义自定义样式。但我现在将使用windowBackground实现自定义样式,以颜色/透明度为uben,即使自定义样式不起作用。要了解有关WindowBack的答案并查看此帖子,请查看更新后的帖子及其代码。有关详细信息,请告诉我。我是否接受正如上面所说的,这个问题没有解决方案?您没有调用setContentView,我知道这是可以做到的,因为我在活动中调用了setTheme,然后super.onCreate使它对我起作用,谢谢!仅供参考:这确实有效,但由于某种原因(在Kindle Fire上)它在创建新活动时造成了巨大的延迟,并使我的应用程序在Nook颜色上意外崩溃。我以前从未在Kindle上尝试过它,对于信息,thx必须在我得到一个时进行测试。此解决方案不适用于所有设备。考虑一下摩托罗拉XOOM,结果是一个对话框在黑色背景之上,而不是一个透明的对话框。很好的解释,谢谢!如果有人在第一时间没有得到它(比如我:D)-请先阅读@mozarty solution以了解您应该将此代码放在何处。但是,由于Android在onCreate()调用之前调用了setTheme(),因此无法使用通常发送给活动的数据来决定是否更改主题。做出这个决定还需要一些额外的技巧。请花一些时间来解释这是如何解决问题的,以便其他有类似问题的人能够清楚地知道这个问题。
    super.setTheme(android.R.style.Theme);
    
    super.setTheme(android.support.v7.appcompat.R.style.Theme_AppCompat_NoActionBar);