ListView
より後のある時点でヘッダービューを添付しますonResume()
。
したがって、ヘッダー ビューがビュー階層に追加された後にのみ、フラグメントを追加する必要があります。FragmentManager
また、 inからフラグメントを削除する必要がありますonPause()
。そうしないと、このフラグメントに戻ったときに、以前に追加されたフラグメントを引き続き認識し、指定されたFragmentManager
ビューを見つけようとするためです。ただし、ヘッダービューを再度アタッチid
するまでは利用できません。ListView
落とし穴もあります。もし、あんたが:
- リストを下にスクロール
- いくつかの項目をクリックします
- 別の画面 / アクティビティに移動
- 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"/>