2013-01-17 3 views
9

Ho implementato ActionBarSherlock con un ViewPager e un TabsAdapter. Funziona bene ma ora ho provato a "spingere" da un Framework caricato in "Tab 1" un altro frammento.ActionBarSherlock, ViewPager, TabsAdapter Frammenti di tabulazione nidificati

Il comportamento dovrebbe essere come:

  • ho 3 schede nella mia richiesta, al momento del lancio vedo la prima scheda in cui un frammento con un pulsante è in essa
  • Premendo il pulsante sul primo Tab, il frammento sulla prima scheda dovrebbe essere sostituito e un altro frammento dovrebbe essere visualizzato

Ho provato a implementare questo, ma ho un frammento nero quando si sostituisce.

Il Codice:

FragmentDemoActivity.java

public class FragmentDemoActivity extends SherlockFragmentActivity { 
    CustomViewPager mViewPager; 
    TabsAdapter mTabsAdapter; 

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

     ActionBar bar = getSupportActionBar(); 
     bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
     bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); 

     mViewPager = (CustomViewPager)findViewById(R.id.pager); 
     mViewPager.setSwipingEnabled(false); 

     mTabsAdapter = new TabsAdapter(this, bar, mViewPager); 
     mTabsAdapter.addTab(bar.newTab().setText("tab1"), 
       FragmentA.class, null); 
     mTabsAdapter.addTab(bar.newTab().setText("tab2"), 
       FragmentB.class, null); 

    setTitle(R.string.app_name); 

     if (savedInstanceState != null) { 
      bar.setSelectedNavigationItem(savedInstanceState.getInt("tab")); 
     } 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt("tab", getSupportActionBar().getSelectedNavigationIndex()); 
    } 

    public static class TabsAdapter extends FragmentPagerAdapter 
      implements ViewPager.OnPageChangeListener, ActionBar.TabListener { 
     private final Context mContext; 
     private final ActionBar mBar; 
     private final ViewPager mViewPager; 
     private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); 

     static final class TabInfo { 
      private final Class<?> clss; 
      private final Bundle args; 

      TabInfo(Class<?> _class, Bundle _args) { 
       clss = _class; 
       args = _args; 
      } 
     } 

     public TabsAdapter(FragmentActivity activity, ActionBar bar, ViewPager pager) { 
      super(activity.getSupportFragmentManager()); 
      mContext = activity; 
      mBar = bar; 
      mViewPager = pager; 
      mViewPager.setAdapter(this); 
      mViewPager.setOnPageChangeListener(this); 
     } 

     public void addTab(ActionBar.Tab tab, Class<? extends Fragment> clss, Bundle args) { 
      TabInfo info = new TabInfo(clss, args); 
      tab.setTag(info); 
      tab.setTabListener(this); 
      mTabs.add(info); 
      mBar.addTab(tab); 
      notifyDataSetChanged(); 
     } 

     @Override 
     public int getCount() { 
      return mTabs.size(); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      TabInfo info = mTabs.get(position); 
      return Fragment.instantiate(mContext, info.clss.getName(), info.args); 
     } 



     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
     } 

     @Override 
     public void onPageSelected(int position) { 
      mBar.setSelectedNavigationItem(position); 
     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 
     } 

     @Override 
     public void onTabSelected(Tab tab, FragmentTransaction ft) { 
      Object tag = tab.getTag(); 
      for (int i=0; i<mTabs.size(); i++) { 
       if (mTabs.get(i) == tag) { 
        mViewPager.setCurrentItem(i,false); 
       } 
      } 
     } 

     @Override 
     public void onTabUnselected(Tab tab, FragmentTransaction ft) { 

     } 

     @Override 
     public void onTabReselected(Tab tab, FragmentTransaction ft) { 

     } 
    } 

} 

FragmentA.java

public class FragmentA extends Fragment { 
    Button button; 
    int num; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved) 
    { 
     return inflater.inflate(R.layout.frag_a, group, false); 
    } 

    @Override 
    public void onActivityCreated (Bundle savedInstanceState) 
    { 
     super.onActivityCreated(savedInstanceState); 
     num = 0; 
     button = (Button) getActivity().findViewById(R.id.button1); 
     button.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       FragmentB f1 = new FragmentB(); 
       FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); 
       ft.replace(R.id.pager, f1,"newTag"); 
       ft.show(f1); 
       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
       ft.addToBackStack(null); 
       ft.commit();  

      } 
     }); 
    } 
} 

Sono nuovo a sviluppo di Android, quindi sarei felice se qualcuno è in grado di aiutarmi. Ho già studiato molto tempo per cercare una soluzione, ma il risultato non era quello che mi aspettavo.

Il mio attuale progetto: http://cl.ly/3q1f2t1O2Y3j

+1

Hai visto l'esempio "Schede e cercapersone" all'interno del progetto di esempio di frammenti di ABS? –

risposta

8

I Gotcha!

Mi spiego meglio, è necessario mettere un id del formato che si desidera sostituire, il mio esempio:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/Framelay" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 

    <TextView 
     android:id="@+id/txtSearchTopic" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="10dp" 
     android:layout_marginTop="10dp" 
     android:text="TextView" /> 

</FrameLayout> 

Così ho appena messo la mia: android: id = "@ + id/Framelay" Quindi posso usare questo ID per sostituire il nuovo frammento, ciò che intendo è che tutto il contenuto all'interno di questo Layout verrà sostituito dal nuovo Frammento, come ho chiamato DetailFragment.

FragmentManager fragmentManager = getFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager 
     .beginTransaction(); 
DetailFragment fragment3 = new DetailFragment(); 
fragmentTransaction.replace(R.id.Framelay, fragment3); 
fragmentTransaction.commit(); 
+1

Quando si utilizza android.R.id.content invece di R.id.pager come descritto sopra funziona per la vista corrente, ma quando si esegue questo codice e si passa a un'altra scheda, il nuovo frammento aggiunto si sovrappone al frammento visualizzato nel altra scheda – brokedid

+1

Vedo, mi hai preso, questa è una bella domanda, cercherò di trovare una soluzione. – Marckaraujo

+1

Vedi, cosa ho scritto. – Marckaraujo