根据设备大小在对话框和活动之间切换

时间:2014-01-02 09:56:42

标签: android user-experience

在任何应用程序中,添加/编辑将相对较少的输入。我已经看到应用程序,尤其是日历,正在使用聪明的策略将这些显示为简单对话框,以便用户可能不会注意到设计表单中有空格

如下图所示 side-by-side

我的问题是,如何实现这一目标?

6 个答案:

答案 0 :(得分:5)

我正在做的是扩展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中解释了这种技术。

答案 1 :(得分:4)

在我看来,这里最好的方法是使用

<!-- 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"

答案 2 :(得分:3)

我发现最好/最简单的解决方案是始终使用Activity,并根据屏幕大小(和版本)更改主题父级。

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>

答案 3 :(得分:1)

使用Context.setTheme方法以程序方式设置它们。正如医生说的那样

  

应该在上下文中实例化任何视图之前调用它   (例如在致电之前。

因此,要在主题之间切换,需要在onCreate之前调用setTheme

public void onCreate(Bundle savedInstanceState) {
    // check screen size
    setTheme(dialogTheme);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);
}

答案 4 :(得分:0)

@StinePike回答时,以编程方式设置对话框主题并没有任何用处(对于 me ),因为它在对话框后面显示wierd black screen,而不是暗淡的背景(如问题所示)。这显然是bug

我没有尝试以编程方式或在style.xml中设置它,而是除了 AndroidManifest.xml 以外的所有地方,我做了相反的操作,这对我有用。 (我从以上solution的奇妙issue中获取的解决方案

最简单的解决方案(有效)如下:

1。默认情况下,通过 AndroidManifest.xml

使活动成为对话框 例如,在AndroidManifest.xml中:

<activity
        android:name="com.example.MyActivity"
        android:label="@string/title_activity_mine"
        android:theme="@android:style/Theme.DeviceDefault.Dialog">
    ...
</activity>

2。启动活动时,如果设备不是平板电脑,请将主题设置为默认值。

if (!(isTablet(this)) {
    setTheme(defaultTheme);
}
super.onCreate(savedInstanceState);
...

注意:

  1. 解决方案适用于style.xml
  2. 中定义的自定义样式

    价:

    1. How to detect device is Android phone or Android tablet?
    2. Dialog with transparent background in Android
    3. Issue 4394 - android - setTheme() does not work as expected
    4. PS:平板电脑和手机上的最终应用程序如下: enter image description here

答案 5 :(得分:0)

使用DailogFragment,然后用setShowsDialog()

控制它的显示方式