如何更改以不同显示尺寸显示片段的方式?

Posted

技术标签:

【中文标题】如何更改以不同显示尺寸显示片段的方式?【英文标题】:How can I change the way I display the fragments in differents display sizes? 【发布时间】:2019-05-25 13:36:19 【问题描述】:

我目前正在为android 设备制作应用程序,我想知道如何更改以不同显示尺寸(例如平板电脑)显示fragments 的方式。

此时我的所有片段都有一个活动,这导致我在更改页面时替换fragments,但对于平板电脑,我想在activity 中显示2 个片段。

我为我的主要活动创建了一个布局大的版本:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context=".PaginaInicial"
    tools:showIn="@layout/app_bar_pagina_inicial">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_
        android:layout_>

        <fragment
            class="pt.ipp.estg.schoolhelperapp.apontamento.ListaApontFragment"
            android:id="@+id/a_fragment"
            android:layout_weight="1"
            android:layout_
            android:layout_ />
        <fragment
            class="pt.ipp.estg.schoolhelperapp.apontamento.VerApontFragment"
            android:id="@+id/b_fragment"
            android:layout_weight="2"
            android:layout_
            android:layout_ />

</LinearLayout>

</android.support.constraint.ConstraintLayout>

片段容器位于主要活动的布局小版本中。

其中一个片段显示项目列表(@+id/a_fragment),另一个显示我之前选择的一个特定项目的信息(@+id/b_fragment)

【问题讨论】:

【参考方案1】:

更多详情请参考本文档:https://developer.android.com/training/multiscreen/screensizes

在 res/values/refs.xml 中创建一个默认别名资源值文件,并将以下代码放入其中。此值将引用您的布局文件,该文件只有一个片段。

<resources>
        <item name="activity_masterdetail" type="layout">@layout/layout_with_single_fragment</item>
     </resources>
现在需要创建一个替代资源,以便在较大的设备上,activity_masterdetail 别名将指向 layout_with_two_fragment.xml。 创建一个具有相同名称 refs.xml 但在可用限定符下具有最小屏幕宽度的资源限定符的新文件。使用 600dp 或更大的最小尺寸(sw600dp 限定符)

<resources>
<item name="activity_masterdetail" type="layout">@layout/layout_with_two_fragment</item>
</resources>

您的目标是拥有这样的逻辑:

对于指定尺寸以下的设备,例如手机,请使用 layout_with_single_fragment.xml。

对于超过指定大小的设备,请使用 layout_with_two_fragment.xml。

现在在显示列表的 man 活动中,使用 setContentView(R.layout.activity_masterDetail) 即引用布局的名称

如果此代码将在手机上运行,​​则activity_masterDetail会引用普通的refs.xml文件,但如果此代码在平板电脑上运行,则会使用资源限定的refs.xml文件。

在您的活动逻辑中,您希望在表格的同一屏幕上显示主布局和详细布局,但在手机上打开另一个活动,请在列表项的 onClick() 内使用以下逻辑

if (findViewById(R.id.a_fragment) == null) 
  Intent intent = A_Activity.newIntent(this, listItem.getId());
  startActivity(intent);
 else 
  Fragment newDetail = B_Fragment.newInstance(list_item.getId());
  getSupportFragmentManager().beginTransaction()
      .replace(R.id.b_fragment, newDetail)
      .commit();

【讨论】:

【参考方案2】:

您应该在link 之前查看此内容,它应该可以帮助您了解更多关于支持不同屏幕尺寸的信息。

这里有一个example,你可以试试。

【讨论】:

我已经尝试使用文档中的内容,但它不适用于我的情况。我现在在我的活动的布局大版本上收到 android.view.InflateException。 您是否尝试过示例链接中的示例应用程序? 是的,我的应用有点复杂,所以我正在尝试不同的方法,但是这个简单的话题让我很头疼, 我的意思是不要直接在您的应用程序上尝试,只需在链接中尝试那么简单下载项目并运行它,您可能会了解您的应用程序有什么问题或缺少什么 我做到了,但我有一个更大的问题,我所有的片段都在使用这种类型的布局,但我只是想要其中一些关于如何做到这一点的想法?更改片段时更改布局类型?

以上是关于如何更改以不同显示尺寸显示片段的方式?的主要内容,如果未能解决你的问题,请参考以下文章

更改片段后如何取消显示堆叠的吐司?

显示/隐藏片段并以编程方式更改可见性属性

如何使用 ViewPager 显示相同的片段,但每次加载不同的数据?

如何让网站适应不同尺寸的手机屏幕?

如何在显示旋转时以编程方式更改布局约束

如何以编程方式更改 tabbarItem 的图像