2014-06-26 146 views
2

withing一个ViewPager我正在开发,有一些标签的应用程序,像这样app using vviewPager添加子片段父片段的Android

每个选项卡是一个片段,每个片段显示的文章,类别列表视图和一些其他信息。 我想要做的是当我从一个片段中的列表视图中点击一个项目,打开一个新的片段与全文或更多信息。我读过这与嵌套片段有关,并且我必须使用方法getChildFragmentManager()。我使用的是ViewPager显示我在选项卡中的片段,这是我的主要活动:

public class MainActivity extends FragmentActivity{ 
    private String tabs[]={"Tab1, Tab2,.<other Fragments>..,VideosFragment"}; 
    ViewPager viewPager=null; 
    FragmentManager fragmentManager=getSupportFragmentManager(); 
    android.support.v4.app.FragmentTransaction ft=fragmentManager.beginTransaction(); 
    AdapterView adapterView; 
    public static final int TIME_ENTRY_REQUEST_CODE=1; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     viewPager=(ViewPager)findViewById(R.id.pager); 
     viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){ 
     public void onPageSelected(int position){ 
      getActionBar().setSelectedNavigationItem(position); 
     } 
    }); 
    viewPager.setAdapter(new AdapterView(fragmentManager)); 
    viewPager.setOffscreenPageLimit(tabs.length); 
    adapterView=new AdapterView(getSupportFragmentManager()); 
    /*initialization of the action bar: color, icon & title.*/ 
    final android.app.ActionBar actionbar=getActionBar(); 
    ColorDrawable color=new ColorDrawable(Color.parseColor("#cd853f")); 
    actionbar.setBackgroundDrawable(color); 
    actionbar.setTitle("Title"); 
    ActionBar.TabListener tabListener=new ActionBar.TabListener() { 
     @Override 
     public void onTabUnselected(Tab tab, FragmentTransaction ft) { 

     } 


     @Override 
     public void onTabSelected(Tab tab, FragmentTransaction ft) { 
      viewPager.setCurrentItem(tab.getPosition()); 
      ft=getFragmentManager().beginTransaction(); 
      //ft.replace(layouts[tab.getPosition()], (adapterView.getItem(tab.getPosition())); 
      ft.commit(); 

     } 

     @Override 
     public void onTabReselected(Tab tab, FragmentTransaction ft) { 

     } 
    }; 
    /*Displaying Tabs for the app */ 
    for(int i=0;i<tabs.length;i++) 
     actionbar.addTab(actionbar.newTab().setText(tabs[i]).setTabListener(tabListener)); 
    actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageSelected(int position) { 
      actionbar.setSelectedNavigationItem(position); 
     } 

     @Override 
     public void onPageScrolled(int arg0, float arg1, int arg2) { 
     } 

     @Override 
     public void onPageScrollStateChanged(int arg0) { 
     } 
    }); 
} 

} 编辑:,当我在ListView的项目挖掘,我想开一个新片段,这是我的适配器为ListView:

public class ItemAdapter extends BaseAdapter implements OnItemClickListener{ 
Item item=new Item(); 
private ArrayList<Item> news=new ArrayList<Item>(); 
private static final int NO_PICTURE_VIEW=0; 
private static final int PICTURE_VIEW=1; 

public ItemAdapter(Context context,ArrayList<Item> items) { 
    super(); 
    news.addAll(items); 
} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return news.size(); 

} 

@Override 
public Item getItem(int index) { 
    // TODO Auto-generated method stub 
    return getItem(index); 
} 

@Override 
public long getItemId(int index) { 
    // TODO Auto-generated method stub 
    return index; 
} 

public int getViewTypeCount() { 
    return 2; 
} 

public int getItemViewType(int position) { 
    Item article=news.get(position); 
    // if(article.getImageUrl()!=null&&!article.getImageUrl().equals("")&&article.getImageUrl().indexOf("no_pic.png")==-1)//if there's no pic  
    if(article.getImage()!=null)  
     return PICTURE_VIEW; 
     else 
      return NO_PICTURE_VIEW; 
} 
@Override 
public View getView(int index, View view, ViewGroup parent) { 
    item=news.get(index); 
    int type=getItemViewType(index); 
     if(view==null){ 
      LayoutInflater inflater=LayoutInflater.from(parent.getContext()); 
      if(type==NO_PICTURE_VIEW){ 
       view=inflater.inflate(R.layout.item_no_picture_list,parent,false); 
       TextView titleView=(TextView)view.findViewById(R.id.titleNoPicture); 
       titleView.setText(item.getTitle()); 
      } 
      else{ 
       view=inflater.inflate(R.layout.item_picture_list,parent,false); 
       TextView titleView=(TextView)view.findViewById(R.id.titleArticle); 
       ImageView image=(ImageView)view.findViewById(R.id.imageItem); 
       titleView.setText(item.getTitle()); 
       image.setImageBitmap(item.getImage()); 
      } 
    } 

    return view; 
} 

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, 
     long id) { 
    Log.d("ItemAdapter","clicked on "+position); 
} 

}

这是ViewPager一个片段:

public class VideosFragment extends Fragment{ 

static ListView listvideo; 
ItemAdapter itemAdapter; 
Context context; 
Activity activity; 
FragmentManager fm=getChildFragmentManager(); 
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){ 
     super.onCreateView(inflater, container, savedInstanceState); 
     View view=inflater.inflate(R.layout.videos_activity, container,false); 
     listvideo=(ListView)view.findViewById(R.id.videoslist); 
     context=getActivity(); 
     setRetainInstance(true); 
     return view; 
    } 

public void onViewCreated(View view, Bundle savedInstanceState){ 
    super.onViewCreated(view, savedInstanceState); 
    ViewPager vp=(ViewPager)view.findViewById(R.id.pager); 
    vp.setAdapter(new AdapterView(fm)); 
} 

public void displayVideos(final List<Item> videos){ 
    try {   
     if(videos==null || videos.size()==0){ 
      Log.d("videos activity","the list is null!!");   
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    for(int i=0;i<videos.size();i++){ 

    } 
    itemAdapter=new ItemAdapter(context,(ArrayList<Item>) videos); 
    listvideo.setAdapter(itemAdapter); 
    listvideo.setOnItemClickListener(new OnItemClickListener(){ 
     @Override 
     public void onItemClick(android.widget.AdapterView<?> parent, 
       View view, int position, long id) { 
      Log.d("HomeActivity","Tapped on "+position); 
      //FragmentTransaction ft=fm.beginTransaction(); 
      //Fragment vp=new VideoPlayer(); 
      //ft.add(R.id.videoview, vp); 
      ///ft.addToBackStack("VideosActivity"); 
      //ft.commit(); 
     } 
    }); 
} 

public static class MyAdapter extends FragmentPagerAdapter { 

    public MyAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public int getCount() { 
     return 4; 
    } 

    @Override 
    public Fragment getItem(int position) { 

     return new VideoPlayer();//ChildFragment 
    } 
} 
} 

fragmenttransaction的注释行和之后的行给了我一个NPE,所以我想我错过了一些东西。 VideoPlayer是ChildFragment,目前我只希望能够显示没有信息的片段,只是为了知道它是如何工作的。这是我的片段适配器:

class AdapterView extends FragmentPagerAdapter{ 
public static int NUM_ITEMS=3; 
Tab1 tab1=new Tab1(); 
    Tab2 tab2=new Tab2(); 
VideoFragment va=new VideoFragment(); 

public AdapterView(FragmentManager fm) { 
    super(fm); 
} 

@Override 
public Fragment getItem(int i) { 
    Log.d("FRAGMENT","EN: "+i); 
    switch(i){ 
    case 0: 
     return tab1; 
    case 1: 
     return tab2; 
    case 2: 
      return va; 
    default: 
     return null; 
    } 
} 

@Override 
public int getCount() { 
    return NUM_ITEMS; 
} 

}

我还没有发现什么,我正在寻找一个教程,所以我希望你们中的一些可以帮助我理解它是如何工作的。我知道这是可能的,因为Android API 4.2允许它。我只想知道嵌套片段如何工作,以及如何以我的应用程序需要的方式使用它们。任何信息表示赞赏,谢谢。

+0

为什么您的片段名为'VideosActivity'? – kcoppock

+0

检查我的答案在这里http://stackoverflow.com/questions/13379194/how-to-add-a-fragment-inside-a-viewpager-using-nested-fragment-android-4-2/13381792#13381792为一个小例子,我想这就是你想要的(?) – Luksprog

+0

我遵循一些约定,某些文件有人提供给我,但是结构是用于片段的,都是碎片......我不认为名称真的很重要 – Rosie

回答

6

如果你想要的是用另一个片段替换viewpager内的片段,看看this。不过我建议你创建另一个片段(容器),并移动viewpager和片段这个新片段内:

enter image description here

当用户点击列表中的项目通过这种方式,可以更换MainFragmentDetails Fragment

关于ChildFragmentManager(),它在嵌套片段时使用。如果你改变你的执行情况我建议,你需要一个ChildFragmentManager传递到您的PagerAdapter:

viewPager.setAdapter(new AdapterView(getChildFragmentManager())); 

另一件事里面VideosFragment的代码的注释行。让你的活动提交片段事务,而不是在Fragment中进行。为更好地解释,请阅读this