gpt4 book ai didi

android - 如何动态地将 fragment 添加到 ListView 标题?

转载 作者:行者123 更新时间:2023-11-29 15:22:19 24 4
gpt4 key购买 nike

我想在我的 ListView 的标题中添加一个 fragment ,这可以通过 xml 来完成,如下所示:

How to embed view of Fragment in the header of a 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}

是否可以动态地将 fragment 添加到标题中?或者,如果我只能通过 xml 来完成,有没有办法将参数传递给它(比如 setArguments())?

最佳答案

事情是 ListViewonResume() 之后的某个时间附加标题 View 。

所以您必须仅在标题 View 添加到 View 层次结构后添加 fragment 。此外,您需要在 onPause() 中从 FragmentManager 中删除 fragment ,否则,在返回此 fragment 时,FragmentManager 仍会知道以前添加的 fragment ,并尝试通过指定的 id 查找 View 。如果在 ListView 再次附加标题 View 之前将不可用。

还有一个陷阱。如果你:

  1. 向下滚动列表
  2. 点击一些项目
  3. 转到另一个屏幕/Activity
  4. 按 HW 返回

现在 ListView 的位置看起来就像在 (3) 中离开屏幕之前一样。但是,HeaderFragment 尚未附加。然后,如果您向上滚动直到标题 View 可见,它就会被附加。然后我们在header view中添加HeaderFragment,header view的高度会发生变化。然后,奇怪的事情发生在 ListView 中。我还没有解决这个问题。

如果您的 HeaderFragment 是固定高度,您可以将标题 View 设置到那么高,从而完全避免这个问题。

假设您在 Fragment 中显示 ListView,下面是我解决此问题的方法:

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"/>

关于android - 如何动态地将 fragment 添加到 ListView 标题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17201930/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com