1

リストビューのヘッダーにフラグメントを追加したいのですが、これは次のように xml で実行できます。

ListFragment のヘッダーに Fragment のビューを埋め込む方法

しかし、このフラグメントに引数を渡したいのですが、私が知る限り、動的にしか実行できません (例getFragmentManager().beginTransaction().add().commit())

だから私は疲れています:

getActivity().getSupportFragmentManager()
                .beginTransaction()
                .add(R.id.my_fragment_container, fragment)
                .commit();

my_fragment_container はヘッダーにありますが、次のようになります。

No view found for id 0x7f0a0089 (com.twitter.android:id/my_fragment_container) for fragment MyFragment {423d3320 #4 id=0x7f0a0089}

ヘッダーにフラグメントを動的に追加することは可能ですか? または、xml でしかできない場合、(のようにsetArguments()) 引数を渡す方法はありますか?

4

1 に答える 1

5

ListViewより後のある時点でヘッダービューを添付しますonResume()

したがって、ヘッダー ビューがビュー階層に追加された後にのみ、フラグメントを追加する必要があります。FragmentManagerまた、 inからフラグメントを削除する必要がありますonPause()。そうしないと、このフラグメントに戻ったときに、以前に追加されたフラグメントを引き続き認識し、指定されたFragmentManagerビューを見つけようとするためです。ただし、ヘッダービューを再度アタッチidするまでは利用できません。ListView

落とし穴もあります。もし、あんたが:

  1. リストを下にスクロール
  2. いくつかの項目をクリックします
  3. 別の画面 / アクティビティに移動
  4. HWを押して戻る

ListView(3) の画面に移動する前と同じように配置されます。ただし、HeaderFragmentまだ付いていません。次に、ヘッダー ビューが表示されるまで上にスクロールすると、添付されます。HeaderFragment次に、ヘッダー ビューとヘッダー ビューの高さの変更を追加します。そして、奇妙なことが起こりListViewます. 私はまだこれを解決していません。

高さが固定されている場合HeaderFragmentは、ヘッダービューをその高さに設定して、この問題を完全に回避できます。

ListViewに表示されていると仮定するとFragment、これを解決した方法は次のとおりです。

public class MyListFragment extends Fragment {

    private Fragment headerFragment;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        headerFragment = HeaderFragment.newInstance();
    }

    @Override
    public final View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.list_layout, container, false);

        ListView list = (ListView) v.findViewById(R.id.list);
        View headerContainer = inflater.inflate(R.layout.list_header_container);
        list.addHeaderView(headerContainer);

        headerContainer.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
            @Override public void onViewDetachedFromWindow(View v) {}
            @Override public void onViewAttachedToWindow(View v) {
                getChildFragmentManager()
                    .beginTransaction()
                    .add(R.id.list_header_container, headerFragment)
                    .commit();
            }
        });

        // Set adapter etc

        return v;
    }

    @Override
    public void onPause() {
        super.onPause();
        getChildFragmentManager()
            .beginTransaction()
            .remove(headerFragment)
            .commit();
    }
}

list_header_container.xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:id="@+id/list_header_container"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"/>
于 2013-06-20T12:49:25.587 に答える