2

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

ActionBarSherlock 对话框

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

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

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

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

MyAndroidManifest.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;
}

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


替代解决方案:

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

4

2 回答 2

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) 进行编译,因为这是库的要求。

除此之外,如果你只是想在你的应用程序中显示一个对话框,它是否需要是一个主题活动?这并不常见。您也可以随时创建一个简单的DialogAlertDialog子类来显示。 在这里查看更多信息...

于 2012-08-13T16:03:28.750 回答
1

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

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

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

于 2012-08-13T14:00:57.893 回答