在Android中使用ViewPager将子片段添加到父片段

罗西

我正在开发一个带有一些标签的应用程序 使用vviewPager的应用程序

每个选项卡都是一个片段,每个片段显示文章,类别和其他一些信息的列表视图。我要做的是,当我从列表视图的片段中点按一个项目时,用完整的文章或更多信息打开一个新的片段我已经读到这与嵌套Fragments有关,并且我必须使用method 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允许这样做。我只想知道嵌套片段的工作方式,以及如何以我的应用程序需要的方式使用它们。任何信息表示赞赏,谢谢。

我爱雨披

如果要用另一个片段替换viewpager中的一个片段,请查看this但是,我建议您创建另一个Fragment(一个容器),并将viewpager和fragments移到这个新片段中:

在此处输入图片说明

这样,当用户单击列表项时,可以将替换MainFragmentDetails Fragment

关于ChildFragmentManager(),当您有嵌套片段时使用。如果按照我的建议更改实现,则需要将ChildFragmentManager传递给PagerAdapter:

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

关于内部注释的代码行的另一件事VideosFragment使您的活动提交片段事务,而不是在片段内部进行。要获得更好的解释,请阅读此内容

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

android-将containerViewId中的片段添加到ViewPager中的片段

来自分类Dev

将片段添加到ViewPager时,活动已被破坏

来自分类Dev

将新片段添加到ViewPager时发生NullPointerException

来自分类Dev

使用ViewPager滑动视图将地图添加到片段中

来自分类Dev

Android将TextViews添加到片段中

来自分类Dev

Android-将标签添加到片段

来自分类Dev

如何将包添加到 Android 片段

来自分类Dev

使用片段将图像添加到选项卡

来自分类Dev

将片段添加到NavigationDrawer活动

来自分类Dev

无法将片段添加到fragmentManager

来自分类Dev

将SignaturePad添加到片段/视图

来自分类Dev

将片段添加到滚动视图

来自分类Dev

使用javascript将子元素添加到父元素

来自分类Dev

使用rmq将子屏幕添加到父屏幕

来自分类常见问题

如何从ViewPager访问父片段的子视图?

来自分类Dev

如何从ViewPager访问父片段的子视图?

来自分类Dev

无法将Google Map添加到Navigation Drawer片段

来自分类Dev

将片段添加到列表视图项

来自分类Dev

以编程方式将片段添加到现有ViewGroup

来自分类Dev

无法将多个片段添加到LinearLayout

来自分类Dev

将ListView添加到片段时出错

来自分类Dev

FragmentTransaction将片段添加到LinearLayout的顶部

来自分类Dev

将PlaceAutocompleteFragment添加到片段会引发错误

来自分类Dev

以编程方式将片段添加到Kotlin中的活动

来自分类Dev

如何将方法通道添加到Flutter片段

来自分类Dev

以编程方式将布局添加到片段

来自分类Dev

动态将复选框添加到片段

来自分类Dev

将地图添加到片段会产生异常

来自分类Dev

将片段添加到具有相同ID的容器