我正在使用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),我建议将其作为任何有兴趣读者的完美起点。此外,我想添加相关且有用的帖子:
答案 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,它是否需要成为主题活动?这并不常见。您始终可以创建一个简单的Dialog
或AlertDialog
子类来显示。 Take a look here了解更多信息......
答案 1 :(得分:1)
尝试为应用程序设置主题。
<application
android:theme="@style/Theme.Sherlock"
对话应继承主题。如果你已经设置了那个,那么在活动声明和setTheme()调用中删除android:theme标签,看看会发生什么。你在没有setTheme的情况下得到错误的原因是因为SherlockActivities必须在错误消息中有一个主题,并且你将它设置为清单中的其他东西setTheme()会在你遇到麻烦之前覆盖它。