【发布时间】:2014-01-02 09:56:41
【问题描述】:
在任何应用程序中,添加/编辑的输入相对较少。我已经看到应用程序,尤其是日历,正在使用巧妙的策略将这些显示为简单的对话框,这样用户可能不会注意到设计的表单中有空白空间
如下图
我的问题是,如何实现?
【问题讨论】:
在任何应用程序中,添加/编辑的输入相对较少。我已经看到应用程序,尤其是日历,正在使用巧妙的策略将这些显示为简单的对话框,这样用户可能不会注意到设计的表单中有空白空间
如下图
我的问题是,如何实现?
【问题讨论】:
我正在做的是扩展 DialogFragment:
public class AboutFragment extends DialogFragment { ... }
我还有一个包含该片段的活动。并且当需要调用对话框/活动时,此方法决定如何显示它:
public static void showAbout(Activity parent) {
if (isTablet) {
AboutFragment aboutFragment = AboutFragment.newInstance();
aboutFragment.setStyle(DialogFragment.STYLE_NORMAL, R.style.DialogTheme);
DialogUtils.showDialog(parent, aboutFragment);
} else {
Intent aboutIntent = new Intent(parent, AboutActivity.class);
parent.startActivity(aboutIntent);
}
}
如何决定它是否是平板电脑,完全取决于你。
documentation 中解释了这种技术。
【讨论】:
在我看来,这里最好的方法是使用
<!-- Theme for a window without an action bar that will be displayed either full-screen
on smaller screens (small, normal) or as a dialog on larger screens
(large, xlarge). -->
"android:Theme.Holo.Light.DialogWhenLarge.NoActionBar"
【讨论】:
我发现的最佳/最简单的解决方案是始终使用 Activity,并根据屏幕大小(和版本)更改您的 Theme 父级。
在 res/values/themes.xml 中
<style name="Detail.Theme" parent="@android:style/Theme.Holo.Light" >
...
</style>
在 res/values-large/themes.xml 中
<style name="Detail.Theme" parent="@android:style/Theme.Holo.Light.DialogWhenLarge" >
...
</style>
【讨论】:
setTheme() 设置主题是here 的问题。 (我找到了解决方案)
使用Context.setTheme 方法以编程方式设置它们。正如医生所说
这应该在任何视图在上下文中实例化之前被调用 (例如在调用之前。
所以,在主题之间切换需要在 onCreate 之前调用 setTheme
public void onCreate(Bundle savedInstanceState) {
// check screen size
setTheme(dialogTheme);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
【讨论】:
setTheme() 有故障。见:code.google.com/p/android/issues/detail?id=4394
正如@StinePike 回答的那样,以编程方式设置对话框主题没有任何用处(对我),因为它在对话框后面显示wierd black screen,而不是暗淡的背景(如显示在问题中)。这显然是bug。
我没有尝试以编程方式设置它,或者在 style.xml 中设置它,除了 AndroidManifest.xml 之外的几乎所有地方,我做了相反的事情,这对我很有效。 (我从上面issue的奇妙solution中得到的解决方案)
最简单的解决方案(有效)如下:
例如,在 AndroidManifest.xml 中:
<activity
android:name="com.example.MyActivity"
android:label="@string/title_activity_mine"
android:theme="@android:style/Theme.DeviceDefault.Dialog">
...
</activity>
if (!(isTablet(this)) {
setTheme(defaultTheme);
}
super.onCreate(savedInstanceState);
...
注意:
style.xml 中定义的自定义样式。参考:
PS:平板和手机上的最终应用如下:
【讨论】:
使用 DailogFragment,然后使用 setShowsDialog() 控制其显示方式
【讨论】: