Android:片段布局问题

时间:2012-08-02 14:13:46

标签: android android-fragments

对于大屏幕,我有两个片段,它们应该是顶部/底部或左/右。问题是一个片段占用(几乎)所有空间占用一个片段。对于我的活动,我有两个main.xml(一个用于纵向一个用于横向)。但它们基本相似(除了方向)。

main.xml中

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:orientation="vertical" android:id="@+id/frag_cont" >
 </LinearLayout>

在onCreate中,我将片段添加到该布局:

public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    OverviewFragment of = new OverviewFragment();
    FragmentTransaction tof = getFragmentManager().beginTransaction();
    tof.add(R.id.frag_cont, of);
    DetailFragmentInitial df = new DetailFragmentInitial();
    tof.add(R.id.frag_cont, df);
    tof.commit();

}

这两个片段在onCreateView()

方面看起来有点类似
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{   
    return inflater.inflate(R.layout.overview, container, false);

}

最后,这些片段的两个xml文件看起来像这样,首先是较小的片段:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_weight="1">


<ImageView
    android:id="@+id/imageLogo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/logo"
    android:layout_centerInParent="true" />

    <TextView
    android:id="@+id/textB"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="text"
    android:layout_above="@id/imageLogo" 
    android:layout_centerHorizontal="true"/>
</RelativeLayout>

现在贪婪的人占据了空间:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"  
android:layout_weight="10000" >

 <ListView
    android:id="@+id/ListView01"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >
 </ListView>

</LinearLayout>

我假设当我将layout_weight设置为1时,两者都会占用相同的空间,但即使设置为1000:1,较大的一个也需要大约2/3的空间。离开重量会使整个屏幕上的碎片更大,而另一个则根本不可见。有什么想法吗?

修改

我按照下面给出的方法。现在在空间方面要好得多。在屏幕上旋转概览片段(基本上是列表视图)为空,另一个片段仍然可以。

在OverviewFragment.java中,我在onActivityCreated()中重新填充片段:

public void onSaveInstanceState(Bundle bundle)
{
    bundle.putSerializable("list", mList);
    super.onSaveInstanceState(bundle);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) 
{
     super.onActivityCreated(savedInstanceState);

    if(savedInstanceState != null)
    {
        mList = (ArrayList<myObject>) savedInstanceState.getSerializable("list");
    }
    else
    {
        mAppList = new ArrayList<myObject>();
        new getApps().execute();
    }

    ListView lv = (ListView) getActivity().findViewById(R.id.ListView01);
    lv.setOnItemClickListener(new TableItemSelected());
    mItemAdapter = new ItemAdapterOverview(getActivity().getApplicationContext(), mList);
    lv.setAdapter(mItemAdapter);
}

旋转屏幕时首先调用onSaveInstanceState(),然后调用onActivityCreated()两次。第一次调用saveInstanceState不是null,第二次调用它。无论如何,在这两种情况下,我都应该看到我的列表,从头开始构建或保存列表。为什么不是,为什么这个方法被调用两次?

1 个答案:

答案 0 :(得分:1)

不完全确定这是否会导致您的问题(我怀疑它确实存在),但使用FragmentTransaction.add(..)并非将<{em}} 添加到容器中,它本质上是用该Fragment替换容器。这里的问题是你将两个片段添加到同一个容器中,这样它们会占用相同的空间并导致问题。

更好的方法是在Fragment LinearLayout(例如frag_cont s)中添加两个容器视图,并为它们提供两个单独的ID(例如FrameLayout和{{ 1}})。然后在你的onCreate(..)中,将其改为:

frag_one

这将使得标识frag_two的布局由OverviewFragment填充,而标识为FragmentTransaction tof = getFragmentManager().beginTransaction(); tof.add(R.id.frag_one, of); DetailFragmentInitial df = new DetailFragmentInitial(); tof.add(R.id.frag_two, df); tof.commit(); 的布局由DetailFragmentInitial替换。然后,您可以使用main.xml中的视图根据需要调整片段的大小。