2013-01-17 32 views
9

Tôi đã triển khai một ActionBarSherlock với một ViewPager và một TabsAdapter. Nó hoạt động tốt nhưng bây giờ tôi đã cố gắng "đẩy" từ một khung Loaded trong "Tab 1" một Fragment.ActionBarSherlock, ViewPager, TabsAdapter Các mảnh tab lồng nhau

Các hành vi nên được như thế:

  • Tôi đã 3 Tabs trong ứng dụng của tôi, khi tung ra tôi thấy các Tab đầu tiên, nơi một Fragment với một nút trong đó
  • Nhấn nút trên đầu tiên Tab, Fragment trên Tab đầu tiên nên được thay thế và một Fragment khác sẽ được hiển thị

Tôi đã cố gắng thực hiện điều này, nhưng tôi đã có một mảnh màu đen khi thay thế.

Bộ luật:

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

      } 
     }); 
    } 
} 

Tôi mới vào phát triển Android, vì vậy tôi sẽ rất vui nếu ai đó có thể giúp tôi. Tôi đã nghiên cứu rất nhiều thời gian để tìm kiếm một giải pháp nhưng kết quả không như tôi mong đợi.

Dự án hiện tại của tôi: http://cl.ly/3q1f2t1O2Y3j

+1

Bạn đã thấy ví dụ "Tab và máy nhắn tin" bên trong dự án ví dụ mảnh từ ABS? –

Trả lời

8

Tôi đã hiểu!

Hãy để tôi giải thích, bạn cần phải đặt một id trên Layout của bạn mà bạn muốn thay thế, ví dụ của tôi:

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

Vì vậy, tôi chỉ tôi đưa: android: id = "@ + id/Framelay" Sau đó, tôi có thể sử dụng Id này để thay thế cho đoạn mới, ý tôi là tất cả nội dung bên trong Bố cục này sẽ được thay thế bằng Phân đoạn mới, như tôi gọi là DetailFragment.

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

Khi sử dụng android.R.id.content thay vì R.id.pager như bạn đã mô tả ở trên, nó hoạt động cho Chế độ xem hiện tại, nhưng khi thực thi mã này và sau đó chuyển sang một Tab khác, Fragment Overlays Fragment mới được hiển thị trong Tab khác. – brokedid

+1

Tôi hiểu, bạn đã cho tôi, đó là một câu hỏi hay, tôi sẽ cố gắng tìm một giải pháp. – Marckaraujo

+1

Hãy xem, những gì tôi đã viết. – Marckaraujo

Các vấn đề liên quan