ActionBarSherlock对话框不透明且不暗

时间:2012-08-13 13:31:33

标签: android dialog transparent actionbarsherlock android-theme

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

ActionBarSherlock Dialog

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

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>

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

Custom Dialog

我正在使用带有地图支持的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),我建议将其作为任何有兴趣读者的完美起点。此外,我想添加相关且有用的帖子:

2 个答案:

答案 0 :(得分:4)

您看到的输出肯定来自于在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,它是否需要成为主题活动?这并不常见。您始终可以创建一个简单的DialogAlertDialog子类来显示。 Take a look here了解更多信息......

答案 1 :(得分:1)

尝试为应用程序设置主题。

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

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