我有一个带有3个滑动ViewPager
的fragments
。每个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