2014-06-26 144 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