0

大画面の場合、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回呼び出されるのですか?

4

1 に答える 1

1

これが問題の原因であるかどうかは完全にはわかりませんが (原因があると思われます)、使用してもコンテナーに追加FragmentTransaction.add(..)されず、基本的にコンテナーがそのフラグメントに置き換えられます。ここでの問題は、両方のフラグメントを同じコンテナーに追加しているため、同じスペースを占有して問題が発生することです。Fragment

これを行うより良い方法は、frag_contLinearLayout に 2 つのコンテナー ビュー (例: FrameLayouts) を追加し、それらに 2 つの個別の ID (例frag_oneおよびfrag_two) を与えることです。次に、onCreate(..) で、次のように変更します。

FragmentTransaction tof = getFragmentManager().beginTransaction();
tof.add(R.id.frag_one, of);
DetailFragmentInitial df = new DetailFragmentInitial();
tof.add(R.id.frag_two, df);
tof.commit();

これにより、id を持つレイアウトfrag_oneが OverviewFragment によって埋められ、id を持つレイアウトfrag_twoが DetailFragmentInitial に置き換えられるようになります。その後、main.xml のビューを使用して、フラグメントのサイズを適切に調整できます。

于 2012-08-02T14:25:47.703 に答える