Hinzufügen Kind-Fragment zu Eltern-Fragment innerhalb eines ViewPager in Android

Bin ich, eine app zu entwickeln, die einige Registerkarten,so etwas wie dieses Hinzufügen Kind-Fragment zu Eltern-Fragment innerhalb eines ViewPager in Android

Jede Registerkarte ist ein Fragment, und jedes fragment zeigt eine Listenansicht der Artikel, Kategorien und einige andere Informationen. , Was ich versuche zu tun ist, wenn ich Tippen Sie auf ein Element aus dem listview in einem fragment, öffnen Sie ein neues Fragment mit dem vollständigen Artikel oder weitere Informationen. Ich habe gelesen, dass dies hat zu tun mit verschachtelten Fragmente, und dass ich die Methode getChildFragmentManager(). Ich bin mit einem ViewPager anzeigen meine Fragmente in den tabs, das ist meine Haupttätigkeit:

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) {
        }
    });
}

}
EDIT: und wenn ich Tippen Sie auf ein Element eines listview, die ich öffnen möchte, ein neues Fragment, das ist mein adapter für die 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);
}

}

Dies ist eines der Fragmente in der 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
    }
}
}

Die kommentierten Zeilen für fragmenttransaction und die Linien nach, die Gaben mir eine NPE, also denke ich, ich bin etwas fehlt. VideoPlayer ist die ChildFragment, und im moment möchte ich nur anzeigen können, das fragment, ohne info, nur um zu wissen wie es funktioniert. Dies ist mein adapter für die Fragmente:

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;
}

}

Habe ich nicht gefunden eine Anleitung für das, was ich Suche, deshalb hoffe ich, einige von Euch können mir helfen zu verstehen, wie es funktioniert. Ich weiß, es ist möglich, da die Android-API 4.2 ermöglicht es. Ich möchte nur wissen, wie der verschachtelten Fragmente, die arbeiten, und wie Sie den Weg auf meine apps, die es braucht. Jede information wird sehr geschätzt, danke.

  • Warum ist das fragment namens VideosActivity?
  • Check meine Antwort hier stackoverflow.com/questions/13379194/... für ein kleines Beispiel, ich denke, das ist, was Sie wollen(?!)
  • Ich bin nach einigen Konventionen, einige Dokumente, dass jemand mich, aber die Struktur ist für ein fragment, alle sind Fragmente... ich glaube nicht, dass der name wirklich zählt
  • Es ist nicht egal, für Klarheit. Wenn schon mal jemand schaut dein code, es wird sehr verwirrend sein, um zu sehen, eine Klasse namens VideosActivity nur zu erkennen, es ist nicht ein Activity. VideosFragment wäre viel besser.
  • danke, aber ich bin immer noch fehlen einige Dinge: WrapperFragment ist die befestigt man am Anfang der ViewPager (mainFragment), und warum würden Sie tun, eine neue Instanz davon. Auch kann ich sehen, dass Sie haben zwei innere Fragmente, welches ist die eine, die verwendet werden? Und wie nenne ich das neue fragment, wenn ich Tippen Sie auf einen Artikel aus der listView??
  • Sie müssen die WrapperFragment da kann man nicht nur bei Transaktionen, die mit der verwendeten Fragmente durch die ViewPager(also brauchen Sie einen "container" für die verschachtelten Fragmente). Die pager-adapter verwenden Sie nur das WrapperFragment. In diesem WrapperFragment Sie werden zunächst als geschachtelte fragment der normal-fragment, das Sie zurzeit zeigen(die Liste der Sachen). Wenn der Benutzer tippt auf ein Element, Sie werden propagieren, dass die Veranstaltung den WrapperFragment(enthält die Liste der Elemente), welche die Verwendung der getChildFragmentManager() zu ersetzen, die erste Liste fragment mit dem fragment mit den details.
  • Auch deine Liste-adapter der code falsch ist(ItemAdapter), sollten Sie niemals die Daten in der if - Klausel, wo Sie die convertView für null. Ich bin überrascht, dass Sie nicht sehen, jede Zeile Wiederholung noch. Und ich zweite, was kcoppock sagte, korrekte Benennung ist es ganz wichtig, anderen zu helfen, die versuchen, Ihnen zu helfen(wie die Benennung der adapter, der ViewPager als AdapterView, eine bekannte Klasse in das android-sdk, die mit Listen und raster, und nicht die Fragmente).
  • Bitte angeben, wo die NPE geworfen erhält. Ist es der FragmentManager? Sie sollten es in onCreate()
  • Ich habe die NPE in der Zeile ft.commit() und es sagte illegalstateexception: activity has been destroyed, und ich sagte es, also konnte ich die app starte
  • Hast du irgendwie vermischt zwei verschiedene Dinge. Ersten, Sie habe umgesetzt ActionBar-tabs mit ViewPager/Fragmente und in diesen Fragmenten, Sie scheinen auch einen ViewPager enthält die gleichen Fragmente wieder. Das ist eine Art, wenn eine Schleife, die Sie dort haben, sehr sehr seltsam. Sie sollte wirklich anfangen zu verstehen, was ein ViewPager ist, indem Sie ein Tutorial auf der Android-Entwickler-Seite oder erstellen Sie ein neues Android-Projekt mit dem ADT-Assistenten und starten Sie von dort aus mit einem Fragment Registerkarte Vorlage.

InformationsquelleAutor Rosie | 2014-06-26
Schreibe einen Kommentar