【问题标题】:switching between dialog and activity based on device size根据设备大小在对话框和活动之间切换
【发布时间】:2014-01-02 09:56:41
【问题描述】:

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

如下图

我的问题是,如何实现?

【问题讨论】:

    标签: android user-experience


    【解决方案1】:

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

    【讨论】:

    • 为什么要维护两组代码?我需要现有代码的解决方案。据我了解,片段是直接调用显示和关闭方法(android-developers.blogspot.in/2012/05/…)。这不是我的意图。
    • @AvinashR “两组代码”是什么意思?只有一个包含所有逻辑的片段和一个包含活动的片段,里面只有那个片段。
    • 看起来主题方式确实存在一些性能问题(由开发人员告知)。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我发现的最佳/最简单的解决方案是始终使用 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 的问题。 (我找到了解决方案)
      • 不明白为什么要在代码中设置主题,如果android资源系统可以处理它...更干净,代码更少。
      • @luciofm 很有趣。是否可以提供更多代码来显示这些样式如何与对话框/全屏匹配?我还是有点迷茫。
      • 感谢@luciofm,当我在运行时将活动主题更改为对话框时,背景不透明,现在可以使用单独的主题。
      【解决方案4】:

      使用Context.setTheme 方法以编程方式设置它们。正如医生所说

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

      所以,在主题之间切换需要在 onCreate 之前调用 setTheme

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

      【讨论】:

      【解决方案5】:

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

      我没有尝试以编程方式设置它,或者在 style.xml 中设置它,除了 AndroidManifest.xml 之外的几乎所有地方,我做了相反的事情,这对我很有效。 (我从上面issue的奇妙solution中得到的解决方案)

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

      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。在启动 Activity 时,如果设备不是平板电脑,请将主题设置为默认值。

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

      注意:

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

      参考:

      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

      PS:平板和手机上的最终应用如下:

      【讨论】:

        【解决方案6】:

        使用 DailogFragment,然后使用 setShowsDialog() 控制其显示方式

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-28
          • 1970-01-01
          相关资源
          最近更新 更多