2013-04-26 7 views
10

Używam domyślnego kodu Fragmentu karty Swipe, który uruchamia Android po uruchomieniu nowej aplikacji dla systemu Android. Zorientowałem się, jak modyfikować moje dane i korzystać z kart, ale nie mam pojęcia, jak dodać prosty fragment do tego, co już tam jest. Chciałem dodać pasek informacyjny na górze kart lub tuż pod nimi. Jestem pewien, że to proste, po prostu nie mogę zrozumieć, jak lol. Uczę się na przykładach.Jak mogę dodać fragment do ViewPagera? addView powoduje awarię mojej aplikacji

Próbowałem dodać widok do strony podglądu, ale moja aplikacja ulega awarii i uważam, że robię to źle

W moim główną działalność: ...

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

masz adapter dla ViewPager, użyj metody getItem/instanciateItem (w zależności od tego, z czego korzystasz: fragmentów lub prostych widoków). ta metoda daje obiektowi viewpager wszystkie potrzebne widoki. – Andreas

+0

możesz zwrócić więcej niż jeden fragment w adapterze? Pomyślałem, jak dodać fragment za pomocą Santhosha, ale traktuję to jako kolejną "stronę", którą mogę przesuwać. Chcę, aby była ona trwała niezależnie od strony, na której się znajduję. Chciałem, żeby to było ponad zakładkami, ale nie sądzę, żeby to było możliwe. Więc myślę, że posiadanie go poniżej zakładek jest w porządku. Myśli? – CREW

Odpowiedz

14

Możesz zastosować następujące podejście:

Po prostu użyj fragmentów dla każdego widoku w pagera.

wpisz poniższy kod w metodzie onCreate() metody 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); 

Definicja próbki fragmentu:

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

Witaj Santhosh. Pomoże mi to zrozumieć, jak dodać fragment do mojego bieżącego adaptera znacznie łatwiej! Mogę dodać fragment, ale po prostu traktuję mój fragment, który dodaję jak kolejną stronę, którą mogę przesuwać. Jeśli przesuję palcem do innej karty, chcę, aby dodany fragment "paska stanu" pozostał na górze lub na dole, niezależnie od strony, którą przesuwam. W istocie pasek stanu jest podobny do paska poddziałania. Po prostu pozwala mi poznać status tego, co się dzieje. Czy muszę przerobić moją strategię? – CREW

+0

Fragmenty są dodawane do pagera widoku. Myślę, że możesz utworzyć układ (linearlayout [vertical]) dla aktywności fragmentów posiadającej fragment_container na górze, a następnie viewpager poniżej. – SKK

Powiązane problemy