【问题标题】:Present Fragment modally on tablet and normally on phones在平板电脑上模态呈现片段,通常在手机上呈现片段
【发布时间】:2015-04-10 15:41:14
【问题描述】:

我正在处理我的第一个 Android 应用程序,我现在有点迷茫。

我有一个 ListView,当用户点击这个列表中的一个元素时,应该会出现一个详细视图。我不会有任何麻烦,但我的应用程序将在平板电脑和手机上运行,​​我想在平板电脑上模态显示此详细视图,并且通常(使用 fragmentManager.beginTransaction().add(...))在手机上。

我知道如何创建 DialogFragment(事实上,我在应用程序的其他地方使用了一个),但我不确定 DialogFragment 是否可以用于正常事务。

而且我不知道如何区分我的应用是在手机还是平板电脑上运行(除了在 layout-sw600dp 文件夹中创建布局)

编辑

嗯,感谢玛格丽塔的回答,我找到了一个解决方案(不是唯一一个,而是一些可能性之一)。

1) 将 B 定义为 DialogFragment

2) 使用此代码在 res/values 文件夹中创建 values.xml

  <bool name="isTablet">false</bool>

3) 使用此代码在 res/values-sw600dp 文件夹中创建另一个 values.xml。这样,我有一个布尔资源告诉我应用程序是否在平板电脑上运行。

  <bool name="isTablet">true</bool>

4) 在 Fragment A(负责展示 Fragment B)上,创建一个类似这样的方法:

private void showFragmentB(){

    Resources res = getResources();
    boolean isTablet = res.getBoolean(R.bool.isTablet);

    if (isTablet) {

        // We're running on a tablet, so we show Fragment B as a dialog    
        FragmentB.newInstance().show(getActivity().getSupportFragmentManager(), FragmentB.class.toString());

    } else {
        // We're running on a phone, adding Fragment B to the stack 
        // with some animation
        FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
        transaction.setCustomAnimations(R.anim.abc_slide_in_bottom, R.anim.abc_slide_out_bottom);
        transaction.add(R.id.container, FragmentB.newInstance(), FragmentB.class.toString());
        transaction.addToBackStack(FragmentB.class.toString());
        transaction.commit();

    }
}

5) 每当出现片段 B 时调用该方法。

谢谢你帮助我。

【问题讨论】:

  • “我不确定 DialogFragment 是否可以用于正常事务”——AFAIK 可以。这样比较方便。 “除了在 layout-sw600dp 文件夹中创建布局”——好吧,如果您不需要自定义布局,您可以创建一个 res/values-sw600dp/bools.xml 来拥有一个 boolean 资源。不过,我会使用资源,而不是在运行时使用 DisplayMetrics 或其他方式查找内容。

标签: android android-fragments


【解决方案1】:

除了为不同的屏幕尺寸提供不同的布局(或资源)之外,没有其他(足够可靠和受支持的)方法来区分手机和平板电脑。

有两种方法可以使用简单的 Fragment 和 FrameLayout 以及使用 DialogFragment(虽然 DialogFragment 也可以用作简单的 Fragment):

  1. 您可以在 A 布局中定义 &lt;FrameLayout&gt; 容器(并在运行时在其中插入片段)。然后在手机的情况下,这个 FrameLayout 将为layout_widthlayout_height 提供"match_parent",在平板电脑的情况下,它可以是带有边距的wrap_content`` ormatch_parent```(或者,当然,一些预定义的dp 值)。

  2. 或者您可以使用一个 DialogFragment,例如res/valuesres/values-sw600dp 中的不同主题。如果你的布局足够“忙”——很多小部件——那么你甚至可能不需要两个主题。您可以只使用wrap_content,布局将缩小到手机的宽度,并且会占用平板电脑所需的空间。

我宁愿使用第二种方式,因为它似乎更干净。

【讨论】:

    【解决方案2】:

    您可以为平板电脑和移动设备使用不同的布局,并在具有相同 id 和片段 B 的布局中使用 FrameLayout 作为替换此 FrameLayout 内部的子片段。 请看这些 Layout for tablets in Android

    Fragments within Fragments

    【讨论】:

    • 在用户点击列表中的一个元素之前,是否可以隐藏片段 B?
    • 您单击列表中的一个元素,然后片段 b 显示在 FrameLayout 中,您现在无法单击其他元素,您应该按下并隐藏片段 B,然后您可以单击其他元素
    猜你喜欢
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 2013-06-09
    • 2013-11-12
    • 2015-09-17
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    相关资源
    最近更新 更多