在Android中使用动态生成的嵌套片段的垂直布局

时间:2014-08-27 22:39:20

标签: android android-fragments android-xml android-nested-fragment

因此,经过多次荒谬的跳跃和一般的扭曲之后,我说服Android做了一个基本的,经常需要的任务。那就是使用任意数量的不同布局和关联变量为任意数量的视图生成零,并将它们插入到另一个视图中,以便它们垂直堆叠。

差不多。

Android不情愿地同意在我阅读并修改this question.

中的代码后包含所有观看内容
public void setPeriods(ArrayList <HashMap> periods) {
    for(HashMap<String, Object> period: periods){
        FragmentManager childFragMan = getChildFragmentManager();

        FragmentTransaction childFragTrans = childFragMan.beginTransaction();
        ForecastPeriod forecastPeriod = new ForecastPeriod();
        childFragTrans.add(R.id.forecast_period, forecastPeriod);
        childFragTrans.commit();
        forecastPeriod.setTitle((String)period.get("name"));
    }
}

问题在于视图不会堆叠,或者至少是Android,就好像嘲讽我一样#堆积&#34;他们但在Z平面上,所以他们完全相互重叠。怎么会这样?

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:paddingTop="20dp"
    android:paddingLeft="20dp"
    android:paddingRight="20dp"
    android:paddingBottom="0dp"
    tools:context="com.blah.deblah.ForecastPeriods">

    <fragment
        android:id="@+id/forecast_period"
        android:name="com.blah.deblah.ForecastPeriod"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        tools:layout="@layout/fragment_forecast_period" />

</LinearLayout>

如何更改(希望)XML以使这些人垂直堆叠?

下面是要插入的片段的XML。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:context="com.blah.deblah.ForecastPeriod">

        <TextView
            android:id="@+id/period_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="top|center"
            android:fontFamily="sans-serif-bold"
            android:gravity="start"
            android:singleLine="true"
            android:text="@string/title"
            android:textColor="#cccccc"
            android:textSize="24dp" />

        <TextView
            android:id="@+id/period_headline"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="top|center"
            android:layout_below="@id/period_title"
            android:layout_marginTop="20dp"
            android:fontFamily="sans-serif-light"
            android:maxHeight="90dp"
            android:gravity="left"
            android:text="@string/loremipsum"
            android:textColor="#cccccc"
            android:textSize="24dp" />

        <TextView
            android:id="@+id/period_body"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="top|center"
            android:layout_below="@id/period_headline"
            android:layout_marginTop="20dp"
            android:fontFamily="sans-serif-light"
            android:gravity="left"
            android:text="@string/loremipsum"
            android:textColor="#cccccc"
            android:textSize="18dp" />

 </RelativeLayout>

1 个答案:

答案 0 :(得分:1)

您遇到这么多麻烦的原因是因为您对碎片的理解从根本上是不正确的。请参阅this question,当我理解它们时,我提出了这一点,并且大大清除了这一切。 Android根本不希望你像你想要的那样使用Fragments,所以当然它不会按照你的预期去做。

一般来说,片段不一定是单个UI组件,而是更像是一个与其他任何UI组件更相似的活动,从而使其更有用。您尝试使用Fragment的内容应该使用自定义View或ListView来完成。

顺便说一下,您也错误地在代码中声明了Fragment。您应该使用包名称作为XML标记,或者使用FrameLayout并将Fragment插入指定的FrameLayout,而不是<fragment>