【问题标题】:ActionBarSherlock dialog is not transparent and not darkActionBarSherlock 对话框不透明且不暗
【发布时间】:2012-08-13 13:31:32
【问题描述】:

我正在使用ActionBarSherlock (ABS) 并想在我的应用程序中添加一个对话框,正如项目提供的ABS Demos Sample application 中所看到的那样。对话框示例如下所示:

我自己创建了一个活动。以下是相关源代码:

public class Dialog extends SherlockActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        setTheme(R.style.Sherlock___Theme_DarkActionBar);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dialog);
    }
}

出于某种原因,Android 强制我添加 setTheme(),尽管 ABS 示例没有这样做。如果我忽略它,我会遇到以下错误。

java.lang.IllegalStateException: You must use Theme.Sherlock, Theme.Sherlock.Light, Theme.Sherlock.Light.DarkActionBar, or a derivative.

我的AndroidManifest.xml 具有以下设置,与 ABS 示例中的设置非常相似。

<activity
    android:name=".activities.Dialog"
    android:label="@string/title_activity_dialog"
    android:theme="@style/Theme.Sherlock.Dialog" >
</activity>

以下屏幕截图显示了我的对话活动的样子。

我正在使用带有地图支持的 ActionBarSherlock 4.1.0,Android 支持库 v4。

问题:你能弄清楚为什么它看起来如此不同吗?

  • 深色与浅色用户界面
  • 透明与不透明背景
  • 有和没有操作栏

更新:

ABS 示例按如下方式启动对话活动:

protected void onListItemClick(ListView l, View v, int position, long id) {
    Map<String, Object> map = (Map<String, Object>)l.getItemAtPosition(position);
    Intent intent = (Intent) map.get("intent");
    startActivity(intent);
}

我按如下方式启动对话活动:

public boolean onCreateOptionsMenu(Menu menu) {
    menu.add(R.string.title_menuItemDialogActivtiy)
        .setIcon(R.drawable.ic_action_dialog)
        .setIntent(new Intent(this, Dialog.class))
        .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
    return true;
}

同时,我看到this pattern弃用。相反,我可以使用DialogFragment。这里出现的问题:如何将片段与操作菜单项集成?


替代解决方案:

我决定使用DialogFragment 而不是Activity,因为我估计它更“未来安全”。我基本上遵循了内容丰富的教程Using DialogFragments (posted June 3, 2012),我喜欢将其推荐为任何感兴趣的读者的完美起点。此外,我喜欢添加相关且有用的帖子:

【问题讨论】:

    标签: android dialog transparent actionbarsherlock android-theme


    【解决方案1】:

    您看到的输出肯定来自在 Java 代码中设置主题(这将覆盖 XML 中设置的值)。我刚刚建立了以下示例应用程序(这实际上就是所有内容)并通过添加额外的 setTheme() 调用来复制问题。

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Dialog"
            android:theme="@style/Theme.Sherlock.Dialog">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    

    还有对话框...

    public class Dialog extends SherlockActivity {
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            TextView text = new TextView(this);
            text.setText("This is a dialog!");
    
            setContentView(text);
        }
    }
    

    现在关于为什么没有那个额外的方法你会得到一个异常,那是另一回事(而且很奇怪)。正如你所看到的,它应该使用我上面提供的尽可能少的代码。

    也许确保库项目和您的项目都至少使用 Android 4.0 (API 14) 进行编译,因为这是库的要求。

    除此之外,如果您只想在应用程序中显示一个 Dialog,它是否需要是一个主题 Activity?这并不常见。你也可以创建一个简单的DialogAlertDialog 子类来显示。 Take a look here了解更多信息...

    【讨论】:

    • 我检查了 ActionBarSherlock 库项目和我自己的项目:两者都针对 API 级别 16。我没有从您的回答中看到:您是否设法构建了一个透明的模态对话框?我测试了您的代码,结果与我的第二个屏幕截图相同。 -- 不过,我会再次查看Dialog 文档和DialogFragment specifically
    • 是的,输出与示例应用程序在 2.3.3 和 4.0 设备上的输出完全匹配(您的第一个屏幕截图)。
    • 我应该补充一点,当 setTheme(R.style.Sherlock___Theme_DarkActionBar); 重新添加时,它看起来像您的第二个屏幕截图。
    【解决方案2】:

    尝试为应用设置主题。

    <application
        android:theme="@style/Theme.Sherlock"
    

    对话应该继承主题。如果您已经设置了,则删除活动声明中的 android:theme 标记和 setTheme() 调用,看看会发生什么。在没有 setTheme 的情况下出现错误的原因是因为 SherlockActivities 必须在错误消息中包含主题之一,并且您在清单中将其设置为其他内容 setTheme() 在遇到麻烦之前覆盖了它。

    【讨论】:

    • 您建议的配置让对话框显示为黑色背景色和白色输入字段。此外,仍然有一个可见的操作栏。但是,对话框不是透明的。
    • 您能展示一下您是如何启动此活动的吗?可能是您违反了此处的警告之一(请参见注意:):developer.android.com/guide/topics/ui/…
    猜你喜欢
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多