Android Fragmentの中にFragmentを作る場合の注意

Android

Android Fragmentの中にFragmentを作る、いわゆる入れ子の状態でFragmentを表示させたいというので若干はまりましたのでメモしておきます。

書いて説明するのは難しいので、図を張っておきますが、ReviewFragmentというFragmentがまずReviewが必要な数だけ生成され、その中にReceiverFragmentが必要な数だけ生成され、またその中にSenderFragmentが必要な数生成される、という三層の入れ子になっています。

nested_fragment.png

で、普通に下記のように子供のFragmentを追加していたのですが、

 public class ReviewFragment extends Fragment {
 
    private ArrayList<Receiver> receiverArrayList;
    private ArrayList<Sender> senderArrayList;
 
    public ReviewFragment() {
 
    }
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
 
        View v = inflater.inflate(R.layout.review_fragment, container, false);
        Bundle bundle = this.getArguments();
        Delivery delivery = bundle.getParcelable("delivery");
 
        int delivery_number = bundle.getInt("delivery_number") + 1;
        TextView delivery_info_tv = (TextView) v.findViewById(R.id.delivery_info);
        delivery_info_tv.setText(R.string.delivery + delivery_number);
 
        senderArrayList = delivery.getSenderList();
 
        receiverArrayList = delivery.getReceiverList();
        makeReceiverFragment(receiverArrayList);
 
        return v;
    }
 
 
    private void makeReceiverFragment(ArrayList<Receiver> receiverArrayList) {
 
 
        for (int count = 0; count < receiverArrayList.size(); count++) {
 
            FragmentManager fragMan = getFragmentManager();
            FragmentTransaction fragTransaction = fragMan.beginTransaction();
            Fragment review_receiver_fragment = new ReviewReceiverFragment();
 
            Receiver receiver = receiverArrayList.get(count);
            Bundle to_receiver_bundle = new Bundle();
            to_receiver_bundle.putParcelable("receiver", receiver);
 
            Log.d("ReviewFragment", receiver.getCompany_name());
 
            to_receiver_bundle.putParcelableArrayList("senderList", (ArrayList<Sender>) senderArrayList);
            to_receiver_bundle.putInt("delivery_number", count);
            review_receiver_fragment.setArguments(to_receiver_bundle);
 
            fragTransaction.add(R.id.each_receiver, review_receiver_fragment);
            fragTransaction.commit();
 
        }
 
    }
 }
 
 //以下、ほかのSenderFragment、ReceiverFragmentも同様に作成

そうすると、まずSenderFragmentが先に4つ表示されて、入れ子にならないのです。

下記のブログさんに答えが書いてありまして、

http://yuyakaido.hatenablog.com/entry/2014/02/16/230947

入れ子の場合、子供のFragmentを追加するには

 FragmentManager fragMan = getChildFragmentManager();

を利用しないといけなかったんですね。

そこを書き換えるだけで、解決です!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です