在 LinearLayout 中的现有片段下方动态添加片段

Dynamically adding fragments below an existing fragment in a LinearLayout

我正在制作一个 activity,其中有一个基于用户输入的地址的评论部分。 用户将通过按下按钮添加一个新的评论部分。这是一个不固定数量的部分,因此我最初将此部分作为片段添加到 xml 中。 我有一个 onClick 函数,可以将另一个片段添加到线性布局。

我的问题是新片段总是添加到 linearlayout 的顶部,即在现有 fragment/fragments 上方(即新片段会将所有其他片段向下推)。

如何添加新片段以使其显示在现有片段下方?

.java 文件中的代码:

public class SpecialReportAdden extends ActionBarActivity {
int numOfFragments;
LinearLayout addenHolder;


TextView report;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_special_report_adden);
    numOfFragments=1;

    Button addenSave = (Button)findViewById(R.id.btnAddendumSave);
    Button addenAddComment = (Button)findViewById(R.id.btnAddendumAddComment);
    addenHolder =(LinearLayout)findViewById(R.id.AddenLinLayHolder);

    addenSave.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //this should save all comments including those added in dynamically produced fragments

            //save database

            Intent i = new Intent (SpecialReportAdden.this, MenuPage.class);
            startActivity(i);
        }
    });


    addenAddComment.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.i("number of Fragments at start of OnClick", Integer.toString(numOfFragments));
            Fragment newAddenFrag = addNewfragment(numOfFragments);
            FragmentManager fm = getFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
            ft.add(R.id.AddenLinLayInnerHolder, newAddenFrag);
            ft.addToBackStack(null);
            ft.commit();

            numOfFragments++;
            Log.i("number of Fragments updated", Integer.toString(numOfFragments));
        }
    });
}


public Fragment addNewfragment(int number) {
    AddendumLinInputFragment adden = new AddendumLinInputFragment();
    TextView tx = (TextView) findViewById(R.id.txtVAddendumFragReportNum);
    tx.setText("Report "+number+" :");
    tx.setTextColor(Color.BLACK);
    TextView address = (TextView)findViewById(R.id.txtVAddendumFragAddress);
    address.setText("A new address");
    address.setTextColor(Color.BLUE);
    return  adden;
}

xml 文件 .java activity

<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="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.danielt.pestcontrol.SpecialReportAdden"
android:id="@+id/RellayAddenComments">

<TextView
    android:id="@+id/txtVAddendumTitle" android:text="Service Report Addendum" android:textStyle="bold" android:layout_centerHorizontal="true" android:elegantTextHeight="true" android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="20dp"/>

<TextView
    android:id="@+id/txtVAddendumTechName"
    android:layout_below="@+id/txtVAddendumTitle"
    android:layout_marginTop="16dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Technician Name: "
    android:textSize="18sp"
    />

<TextView
    android:id="@+id/txtVAddendumDate"
    android:layout_below="@+id/txtVAddendumTechName"
    android:layout_marginTop="16dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Date: "
    android:textSize="18sp"
    />
<ScrollView
    android:id="@+id/scrlVAddendum"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/txtVAddendumDate">
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/AddenLinLayHolder"
        android:orientation="vertical">
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/AddenLinLayInnerHolder"
            android:orientation="vertical">


            <fragment
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:name="com.example.danielt.pestcontrol.AddendumLinInputFragment"
                android:id="@+id/addendum1CommentsFragment"
                android:layout_below="@+id/txtVAddendum1Date"
                android:layout_marginTop="24dp"
                tools:layout="@layout/fragment_addendum_lin_input" />
        </LinearLayout>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Add another Addendum Comment"
            android:id="@+id/btnAddendumAddComment"
            android:layout_below="@+id/scrlVAddendum"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="36dp" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Save / Update Comments"
            android:id="@+id/btnAddendumSave"
            android:layout_below="@+id/btnAddendumAddComment"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="44dp" />

    </LinearLayout>


</ScrollView>

我还没有添加片段代码,但如果有人想看的话,我会添加的。 感谢您的帮助。

您不需要仅包含评论视图的片段。只需膨胀新评论视图并​​将其添加到父视图即可。

LayoutInflater inflater = LayoutInflater.from(context);
View inflatedLayout= inflater.inflate(R.layout.yourLayout, container, false);
container.addView(inflatedLayout);

容器是包含所有评论的视图。

关于添加片段,根据Fragments documentation:

If you're adding multiple fragments to the same container, then the order in which you add them determines the order they appear in the view hierarchy

因此,如果它的行为不同,可能与 OS 版本或错误有关 :)