2013-01-17 16 views
9

Bir ViewBager ve bir TabsAdapter ile bir ActionBarSherlock gerçekleştirdim. İyi çalışıyor ama şimdi "Tab 1" deki başka bir Fragmandaki Yüklü bir Çerçeveden "itmeye" çalıştım. gibiActionBarSherlock, ViewPager, TabsAdapter iç içe Sekme Fragments

davranış olmalıdır: Benim Uygulama, 3 Sekmeler ettik

  • bir Button ile bir Parça on First Düğmesi basılması bunun
  • içinde nerede olduğunu ilk bkz Tab başlatırken Sekme, İlk Sekmedeki Parça değiştirilmeli ve başka bir Parçacık görüntülenmelidir.

Bunu uygulamaya çalıştım, ancak Değiştirirken siyah bir Parçam var.

Kodu:

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();  

      } 
     }); 
    } 
} 

Ben Android Geliştirme yeniyim, bu yüzden eğer mutlu olurum Birisi bana yardım edebilir. Bir çözüm aramak için çok fazla zaman araştırdım ama sonuç beklediğim gibi değildi.

Benim şimdiki projesi: Yakaladım http://cl.ly/3q1f2t1O2Y3j

+1

ABS'den örnek parça projesinin içinde "Sekmeler ve Çağrı" örneğini gördünüz mü? –

cevap

8

!

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

Yani sadece koymak mayın:

benim örnek, size değiştirmek istediğiniz Düzen bir id koymak gerekir, Açıklayayım android: id = "@ + id/Framelay" Sonra bu parçayı yeni parça için değiştirmek için kullanabilirim, yani bu Layout içindeki tüm içeriğin yerine DetailFragment adını verdiğim yeni Parçacığın yerini alacağım.

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

Yukarıda açıklandığı gibi, R.id.pager yerine android.R.id.content kullanıldığında, Geçerli Görünüm için çalışır, ancak bu kodu yürütürken ve başka bir Sekmeye geçerken, eklenen yeni Parça, Ekranda Görüntülenen Parçayı Üst üste bindirir. diğer Sekme. – brokedid

+1

Anladım, bana sahipsin, bu iyi bir soru, bir çözüm bulmaya çalışacağım. – Marckaraujo

+1

Bak, ne yazdım. başlangıçta yüklü olanla Fragment olarak – Marckaraujo