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()

因此,只有在将标题视图添加到视图层次结构后,您才必须添加片段。此外,您需要从FragmentManagerin中删除片段onPause(),否则,在返回此片段时,FragmentManager仍会知道先前添加的片段,并尝试按id指定查找视图。ListView如果在再次附加标题视图之前不可用。

还有一个问题。如果你:

  1. 向下滚动列表
  2. 单击某个项目
  3. 转到另一个屏幕/活动
  4. 按硬件返回

现在ListView被定位为看起来就像在 (3) 中离开屏幕之前所做的一样。不过,HeaderFragment还没有附上。然后,如果您向上滚动直到标题视图变得可见,它就会被附加。然后我们添加HeaderFragment到标题视图和标题视图的高度变化。然后,奇怪的事情发生在ListView. 我还没有解决这个问题。

如果您HeaderFragment的高度是固定的,您可以将标题视图设置为那么高,并完全避免这个问题。

假设您ListView在 a中显示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 回答