2013-01-17 4 views
9

私はViewPagerとTabsAdapterでActionBarSherlockを実装しました。それはうまくいきましたが、今度は別のフラグメント "タブ1"にロードされたフレームワークから "プッシュ"しようとしました。ActionBarSherlock、ViewPager、TabsAdapterネストされたタブフラグメント

行動は次のようにする必要があります:私は起動するが、私はボタンでフラグメントがまず上のボタンを押すことで

  • である第一のタブが表示されたら、私のアプリケーションでは3つのタブをしました

    • タブの最初のタブのフラグメントを置き換え、別のフラグメントを表示する必要があります。

    私はこれを実装しようとしましたが、置換時に黒いフラグメントがありました。

    コード:

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

    私はAndroidの開発に新たなんだ、私はあれば幸せになると思います誰かが私を助けることができます。私はすでに解決策を探すのに多くの時間を調査しましたが、結果は期待通りでした。

    私の現在のプロジェクト:http://cl.ly/3q1f2t1O2Y3j

  • +1

    ABSのフラグメントサンプルプロジェクトの中の「タブとポケットベル」の例を見ましたか? –

    答えて

    8

    私はガッチャ!

    あなたは、私の例を交換したいあなたのレイアウト上のIDを配置する必要があり、私に説明してみましょう:

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

    だから私はちょうど私のを入れて:アンドロイド:ID =「@ + ID/Framelay」 次に、このIDを使用して新しいフラグメントを置き換えることができます。これは、DetailFragmentを呼び出したときに、このレイアウト内のすべてのコンテンツが新しいフラグメントに置き換えられることを意味します。

    +1

    上記のようにR.id.pagerの代わりにandroid.R.id.contentを使用すると、現在のビューで動作しますが、このコードを実行して別のタブに切り替えると、新しい追加されたFragment Overlays他のタブ。 – brokedid

    +1

    私はあなたが私を持っていることを知っています、良い質問です、私は解決策を見つけようとします。 – Marckaraujo

    +1

    私が書いたものを参照してください。 – Marckaraujo