我有一个带有3个滑动ViewPagerfragments。每个fragment都有listview,其中包含一些图像。我试图在单击fragment中的图像之一时在viewpager上显示一个新的listview(就像一个活动),并且还可以在按下“后退”按钮时导航回viewpager。

我在片段内的listview onClick的代码如下(为进行测试,我在整个onClick而不是图像上使用listview

listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Log.d(TAG,"Clicked");
            ItemDetailFragment fragment = ItemDetailFragment.newInstance("ab","cd");
            FragmentTransaction transaction = getFragmentManager().beginTransaction();
            transaction.replace(R.id.containerr,fragment);
            transaction.addToBackStack(null);
            transaction.commit();
        }
});


日志语句可以正常打印,但不会显示该片段。

这是我的活动,其中包含viewpager

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:theme="@android:style/Theme.WithActionBar">

    <com.firstapp.myapplication.CustomViews.SlidingTabLayout
        android:id="@+id/sliding_tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <android.support.v4.view.ViewPager
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/viewPager">

    </android.support.v4.view.ViewPager>

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/containerr">
    </FrameLayout>

</LinearLayout>


请帮忙。

另外,在android文档的示例中,片段中导致片段事务的任何交互都首先传递给父活动,该父活动处理添加或替换新片段的过程。我在片段本身中处理这个问题。哪一种是正确的方法,两种方法有什么区别?

编辑:我需要在viewPager上添加片段,而不是添加片段。就像在单击viewpager片段中的某个元素时出现一个新屏幕一样。

谢谢!

最佳答案

我通过在viewpager中添加fragment来解决它(而不是直接将它放在我的activity中)。

我现在的活动是

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />


然后将先前的活动布局(问题中提到的)移到了ViewPagerFragment

现在,在我的活动的onCreate中,

ViewPagerFragment viewPagerFragment = new ViewPagerFragment();

getSupportFragmentManager().beginTransaction()
        .add(R.id.fragment_container, viewPagerFragment)
        .commit();


为了在单击viewpager片段中的某个项目时在viewpager上显示新的fragment,我这样做

listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        mListener.onFragmentInteraction(null);
    }
});


侦听器是在父活动中实现的接口,如下所示

@Override
public void onFragmentInteraction(Uri uri) {
    ItemDetailFragment itemDetailFragment = ItemDetailFragment.newInstance("ab","cd");
    getSupportFragmentManager().beginTransaction()
            .replace(R.id.fragment_container,itemDetailFragment)
            .addToBackStack(null)
            .commit();
}


我通过监听器接口实现了这一点,因为按照docs


  
    所有片段到片段的通信都是通过关联的活动完成的。两个片段永远不要直接通信。
  


现在就可以了! :D

10-07 19:29
查看更多