对于大屏幕,我有两个片段,它们应该是顶部/底部或左/右。问题是一个片段占用(几乎)所有空间占用一个片段。对于我的活动,我有两个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,第二次调用它。无论如何,在这两种情况下,我都应该看到我的列表,从头开始构建或保存列表。为什么不是,为什么这个方法被调用两次?
答案 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中的视图根据需要调整片段的大小。