2015-04-04 117 views
1

我有一个ViewPager 3滑动fragments。每个fragment都有listview,其中包含一些图像。当单击listview中的某个图像时,我试图在viewpager上显示一个新的fragment(类似于活动),并且当按下后退按钮时还能够导航回viewpager。在viewpager上显示一个片段

我对listview的onClick代码是片段里面是如下(用于测试,我对整个listview而不是图像使用onClick

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 docs的例子中,导致片段事务的片段中的任何交互都首先传递给处理添加或替换新片段的父活动。我正在处理片段本身。哪一种方法是正确的,两种方法有什么区别?

编辑:我需要在viewPager上添加片段而不是它。这就像在点击viewpager片段内的一个元素时出现一个新的屏幕。

谢谢!

+0

如果您需要“over viewpager”,您可以做的最好的事情是,开始一个新的活动并将ItemDetail片段附加到它中。这是推荐的方式,而不是将附加片段添加到viewpager中。 – 2015-04-04 05:55:12

+0

嗨!谢谢回复。我不是试图将'fragment'附加到'viewpager',而是附加到具有视图寻呼机的父活动。 – aandis 2015-04-04 05:59:01

+0

你的意思是ItemDetail片段是3个滑动片段之一? – 2015-04-04 06:00:12

回答

2

我解决了它通过添加viewpagerfragment(而不是直接在我的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

+0

可以请你分享xml文件。如何将viewpager添加到片段? – lacs 2016-09-26 13:28:48

-1

初始化您的片段Activity类并将其添加到viewpager像下面

List<Fragment> fragments = getFragments(); 
pageAdapter = new MyPageAdapter(getSupportFragmentManager(), fragments); 
pager = (ViewPager) findViewById(R.id.viewpager); 
pager.setAdapter(pageAdapter); 

片段加入您的viewpager

private List<Fragment> getFragments() { 

    List<Fragment> fList = new ArrayList<Fragment>(); 

    fList.add(Fragment1.newInstance()); 
    fList.add(Fragment2.newInstance()); 
    fList.add(Fragment3.newInstance()); 

    return fList; 
} 

/********************** Fragment Page adapter *************************/ 
private class MyPageAdapter extends FragmentPagerAdapter { 
    private List<Fragment> fragments; 

    public MyPageAdapter(FragmentManager fm, List<Fragment> fragments) { 
     super(fm); 
     this.fragments = fragments; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return this.fragments.get(position); 
    } 

    @Override 
    public int getCount() { 
     return this.fragments.size(); 
    } 
} 

,打造您的片段类和处理内部的列表视图那些类

+0

感谢您的答案,但这不会让我添加碎片在ViewPager上,而是“到”viewPager。 – aandis 2015-04-04 06:54:38

+0

您可以使用另一个片段和主布局,并将其视图设置为可见并且在用户单击列表时消失。 – Kunu 2015-04-04 07:05:43