指定 ListFragment 的位置 activity_main.xml

Specify where ListFragment goes in activity_main.xml

我的 activity_main.xmlLinearLayout 垂直平均分为 3 种方式。我想用 ListFragment 填充底部 LinearLayout 并用数据填充它。

目前,ListFragment 忽略了 3 LinearLayout,只是将自己置于它们之上。

LstFragment.java

public class LstFragment extends ListFragment{


public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragmentlayout, container, false);
    // Create an array of string to be data source of the ListFragment
    String[] datasource={"English","French","Khmer","Japanese","Russian","Chinese"};
    // Create ArrayAdapter object to wrap the data source
    ArrayAdapter<String> adapter=new ArrayAdapter<String>(getActivity(),R.layout.rowlayout,R.id.txtitem,datasource);
    // Bind adapter to the ListFragment
    setListAdapter(adapter);
    //  Retain the ListFragment instance across Activity re-creation
    setRetainInstance(true);
    return rootView;
}

// Handle Item click event
public void onListItemClick(ListView l, View view, int position, long id){
    ViewGroup viewg=(ViewGroup)view;
    TextView tv=(TextView)viewg.findViewById(R.id.txtitem);
    Toast.makeText(getActivity(), tv.getText().toString(),Toast.LENGTH_LONG).show();

}

}

MainActivity.java

public class MainActivity extends FragmentActivity {

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    LstFragment lstfragment=(LstFragment)getSupportFragmentManager().findFragmentByTag("lstfragment");
    if(lstfragment==null){
        lstfragment=new LstFragment();
        FragmentTransaction transact=getSupportFragmentManager().beginTransaction();
        transact.add(android.R.id.content,lstfragment,"lstfragment");
        transact.commit();

    }
}

}

activity_main.xml

<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="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

<LinearLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1"
    android:id="@+id/topSection">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Testing"
        android:id="@+id/textView3" />
</LinearLayout>

<LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1"
    android:id="@+id/middleSection">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Yo"
        android:id="@+id/textView2"
        android:layout_gravity="center_horizontal" />
</LinearLayout>

<LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1"
    android:id="@+id/bottomSection">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="WhatUP"
        android:id="@+id/textView"
        android:layout_gravity="center_horizontal" />
</LinearLayout>
</LinearLayout>

还有两个更简单的 .xml 布局文件,名为 fragmentlayout.xml,其中包含一个简单的 ListView @id/android:list 和一个 rowlayout.xml,其中有一个 TextView @id/textitem.

替换

   android:layout_height="fill_parent"

用这条线

   android:layout_height="0dp"

在所有三个子线性布局中

原因

android.R.id.content 为您提供视图的根元素,而无需知道其实际 name/type/ID。这就是为什么您的 Fragment 出现在所有内容的顶部。

您正试图将 Fragment 添加到此处的错误容器中

transact.add(android.R.id.content,lstfragment,"lstfragment");

解决方案

添加这个

<FrameLayout
    android:layout_width="fill_parent"
    android:id="@+id/fragment_container"
    android:layout_height="fill_parent">
</FrameLayout>

在第 3 个 LinearLayout 之后但在关闭根 LinerarLayout

之前

然后改为

transact.add(R.id.fragment_container,lstfragment,"lstfragment");

此外,

在所有 LinearLayout 中使用此 android:layout_height="wrap_content"