2013-04-26 12 views
10

Ich benutze den Standard Swipe Tab Fragment-Code, mit dem Android startet, wenn Sie eine neue Android-Anwendung starten. Ich habe herausgefunden, wie ich meine Daten ändern und die Tabs verwenden kann, aber ich habe noch nicht herausgefunden, wie man ein einfaches Fragment zu dem hinzufügt, was bereits vorhanden ist. Ich wollte eine Infobar oben auf den Tabs oder direkt unter ihnen hinzufügen. Ich bin sicher, es ist einfach, ich kann einfach nicht herausfinden, wie lol. Ich lerne anhand von Beispielen.Wie kann ich einem ViewPager ein Fragment hinzufügen? addView stürzt meine App ab

Ich habe versucht, Viewpager eine Ansicht hinzuzufügen, aber meine App stürzt ab, und ich glaube, ich mache es total falsch.

In meinem MainActivity: ...

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // Set up the action bar. 
    final ActionBar actionBar = getActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    mSectionsPagerAdapter = new SectionsPagerAdapter(
      getSupportFragmentManager()); 

    // Set up the ViewPager with the sections adapter. 
    mViewPager = (ViewPager) findViewById(R.id.pager); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 
    SubBarFragment infobar = new SubBarFragment(); 
    mViewPager.addView(infobar.getView());  
.....[extra code for menus and things] 

public class SectionsPagerAdapter extends FragmentPagerAdapter { 

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

    @Override 
    public Fragment getItem(int position) { 
....[code to show specific tabs and return the tab's fragment] 

infobarfragment.java

public class InfobarFragment extends Fragment { 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.infobar, container, false); 
     return view; 
     } 

} 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity" /> 

infobar.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 

    <ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/ic_wifi" /> 

    <TextView 
     android:id="@+id/statusText1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     android:text="Wifi Status Information" /> 

</LinearLayout> 
+0

Sie haben einen Adapter für den ViewPager, verwenden Sie die Methode getItem/instanciateItem (hängt davon ab, was Sie verwenden: Fragmente oder einfache Ansichten). Diese Methode gibt dem viewpager-Objekt alle erforderlichen Ansichten. – Andreas

+0

können Sie mehr als ein Fragment im Adapter zurückgeben? Ich habe mir überlegt, wie man mit Hilfe von Santhosh Fragmente hinzufügen kann, aber es behandelt es nur als eine andere Seite, die ich durchwischen kann. Ich möchte, dass es beständig bleibt, egal auf welcher Seite ich bin. Ich wollte, dass es über den Tabs liegt, aber das ist nicht möglich. Es ist also okay für jetzt, denke ich. Gedanken? – CREW

Antwort

14

können Sie diesem Ansatz folgen:

nur Fragmente für jede Ansicht in einem Pager verwenden.

schreiben Sie den folgenden Code in onCreate() Methode der FragmentActivity.

List<Fragment> fragments = new Vector<Fragment>(); 

//for each fragment you want to add to the pager 
Bundle page = new Bundle(); 
page.putString("url", url); 
fragments.add(Fragment.instantiate(this,MyFragment.class.getName(),page)); 

//after adding all the fragments write the below lines 

this.mPagerAdapter = new PagerAdapter(super.getSupportFragmentManager(), fragments); 

mPager.setAdapter(this.mPagerAdapter); 

Eine Probe Fragment Definition:

public class MyFragment extends Fragment { 


public static MyFragment newInstance(String imageUrl) { 

final MyFragment mf = new MyFragment(); 

    final Bundle args = new Bundle(); 
    args.putString("somedata", "somedata"); 
    mf.setArguments(args); 

    return mf; 
} 

public MyFragment() {} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    String data = getArguments().getString("somedata"); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // Inflate and locate the main ImageView 
    final View v = inflater.inflate(R.layout.my_fragment_view, container, false); 
    //... 
    return v; 
} 

FragmentPagerAdapter

public class MyFragmentAdapter extends FragmentPagerAdapter { 

public static int pos = 0; 

private List<Fragment> myFragments; 

public MyFragmentAdapter(FragmentManager fm, List<Fragment> myFrags) { 
    super(fm); 
    myFragments = myFrags; 
} 

@Override 
public Fragment getItem(int position) { 

    return myFragments.get(position); 

} 

@Override 
public int getCount() { 

    return myFragments.size(); 
} 

@Override 
public CharSequence getPageTitle(int position) { 

    setPos(position); 

    String PageTitle = ""; 

    switch(pos) 
    { 
     case 0: 
       PageTitle = "page 1"; 
       break; 
     case 1: 
       PageTitle = "page 2"; 
       break; 
     case 2: 
       PageTitle = "page 3"; 
       break; 
     case 3: 
       PageTitle = "page 4"; 
       break; 
     case 4: 
       PageTitle = "page 5"; 
       break; 
     case 5: 
       PageTitle = "page 6"; 
       break; 
     case 6: 
       PageTitle = "page 7"; 
       break; 
    } 
    return PageTitle; 
} 

public static int getPos() { 
    return pos; 
} 

public static void setPos(int pos) { 
    MyFragmentAdapter.pos = pos; 
} 
} 
+0

Hallo Santhosh. Dies hilft mir zu verstehen, wie ich meinem aktuellen Adapter ein Fragment viel einfacher hinzufügen kann! Ich kann ein Fragment hinzufügen, aber es behandelt nur mein Fragment, das ich wie eine andere Seite hinzufüge, die ich durchwischen kann. Wenn ich auf einen anderen Tab wische, möchte ich, dass mein Fragment "statusbar", das ich hinzugefügt habe, oben oder unten bleibt, egal auf welcher Seite ich wische. Im Wesentlichen ist die Statusleiste wie eine Unteraktionsleiste. Lässt mich einfach wissen, was los ist. Muss ich meine Strategie überarbeiten? – CREW

+0

Die Fragmente werden dem Ansichts-Pager hinzugefügt. Ich denke, dass Sie ein Layout (linearlayout [vertikal]) für die Fragmentaktivität erstellen können, die fragment_container an der Spitze und dannpyspager darunter hat. – SKK

Verwandte Themen