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

5 浏览
0 Comments

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

我有一个Activity(称为TestActivity),它需要在某些地方作为普通的无主题Activity,同时在其他地方作为Theme.Dialog。我试图重复使用同一个TestActivity来完成这两个任务。

我想要的只是动态设置主题。

代码很简单:

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

同时在清单文件中添加如下:


与此同时,我发现有一篇文章说这不能被完成,这是文章的链接。但我坚信这是可以实现的。

欢迎提供任何建议。

admin 更改状态以发布 2023年5月25日
0
0 Comments

你可以在调用 setContentView(...)super.onCreate() 之前使用 setTheme(..) ,这样应该能正常工作。

0
0 Comments

想提供解决这个问题的方法。

问题:如何将相同的活动用作对话框和全屏基础。

解决方案:

  1. 在AndroidManifest.xml中使用主题@android:style/Theme.Dialog定义您的活动。
  2. 在相应的.Java文件中,检查定义对话框模式的intent额外的参数。
  3. 如果不存在,将Theme设置为android.R.style.Theme。这是如果您没有定义任何主题应用的默认theme

代码:

boolean fDialogMode = getIntent().hasExtra("dialog_mode");
if( ! fDialogMode ) {
    super.setTheme(android.R.style.Theme);
}

备选方案:

更复杂的解决方案是使用以下AlertDialog

  1. 定义一个从ArrayAdapter扩展的ListAdapter类。
  2. getCount函数中返回1

    @Override
    public int getCount() { return 1; }
    

  3. getView函数中,inflate您需要的activitylayout,并在返回view之前进行任何自定义。

    @Override
    public View getView( int position, View view, ViewGroup group ) {
        View v = view;
        if( v == null ) {
            v = getSystemService(Context.LAYOUT_INFLATER_SERVICE).inflate( , null );
        }
    ... Do any customization here    ....
          return v;
    }
    

这绝对是一个次选选项,但是如果您在activity的类中没有太多处理,这可能是一个选项。

考虑使用这种解决方案的唯一原因是将其显示为对话框的逻辑隔离到它用作对话框的地方。

这两个选项都对我起作用,但出于显而易见的原因,我选择第一个选项。 🙂

0