大画面の場合、2 つのフラグメントがあり、上/下または左/右のいずれかになります。問題は、1 つのフラグメントが (ほぼ) すべてのスペースを 1 つのフラグメントで占めていることです。私のアクティビティには、2 つの main.xml があります (1 つは縦向き、もう 1 つは横向き)。しかし、それらは基本的に似ています (向きは別として)。
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();
}
2 つのフラグメントは、onCreateView() に関しては似ています。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
return inflater.inflate(R.layout.overview, container, false);
}
最後に、これらのフラグメントの 2 つの 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() が2 回呼び出されます。saveInstanceState の最初の呼び出しは null ではありませんが、2 回目は null です。とにかく、どちらの場合も、最初から作成するか、保存したリストのいずれかで、リストが表示されるはずです。なぜそうではなく、なぜそのメソッドが2回呼び出されるのですか?