2017-06-25 2 views
2

, so habe ich die klassischen viewpager in einem tablayout, die etwa wie folgt aussehen: enter image description hereandroid viewpager mit tablayout - wie man andere Fragmente innerhalb eines Tabs hinzufügt?

Meine viewPagerAdapter Klasse sieht wie folgt aus:

public class HomePagerAdapter FragmentPagerAdapter erweitert { int mNumOfTabs;

public HomePagerAdapter(FragmentManager fm, int NumOfTabs) { 
    super(fm); 
    this.mNumOfTabs = NumOfTabs; 
} 

@Override 
public Fragment getItem(int position) { 

    switch (position) { 
     case 0: 
      TabHomeFragment tab1 = new TabHomeFragment(); 
      return tab1; 
     case 1: 
      TabShopFragment tab2 = new TabShopFragment(); 
      return tab2; 
     case 2: 
      TabMeFragment tab3 = new TabMeFragment(); 
      return tab3; 
     default: 
      return null; 
    } 
} 

@Override 
public int getCount() { 
    return mNumOfTabs; 
} 

}

So, jetzt auf eine der Registerkarten ich brauche ein Fragment auf ihm hinzuzufügen. also ist es wirklich ein Suchfragment. Ich mache eine Suche in der Tab-Leiste und ich möchte die Back-End-Suchergebnisse in nur einer der Registerkarten angezeigt (die erste). aber ich möchte, dass die Suchergebnisse in einem Fragment namens searchFragmentResults angezeigt werden und ich möchte, dass es auf der ersten Registerkarte angeordnet wird. Wenn der Benutzer dann auf die Zurück-Schaltfläche klickt, wird nur der ursprüngliche Inhalt auf der ersten Registerkarte angezeigt. Ist das mit View Pager möglich?

so visuell, wenn ich das Suchsymbol auf den ersten Tabs tabBar erstelle eine searchView und wenn ich für die Benutzer Abfrage suchen, sollte es ein anderes Fragment mit den Ergebnissen, aber nur in der Registerkarte, die es von gestartet . Hier ist ein Beispiel: enter image description here

Ich kann fragtransaction.replace(somecontentview, somefragment); (or its add method) nicht aufrufen, weil ich sie nicht zu einem Contentview hinzugefügt habe. Ich lasse den Viewpager es für mich machen. Wie wird das erreicht?

Antwort

1

Ich habe herausgefunden, wie das geht. Die Registerkarte sollte ein Fragment sein, das nur andere Fragmente enthalten soll. Die Idee basiert auf dieser SO. Aber ich musste es für einen viewPager tun. Lasst uns die Stufen durchgehen. zuerst den viewpager Adapter:

public class HomePagerAdapter extends FragmentStatePagerAdapter { 

    //integer to count number of tabs 
    int tabCount; 
    private Fragment mCurrentFragment; 

    private String[] tabTitles = new String[]{"tab0", "tab1", "tab2, "tab3"}; 

    //Constructor to the class 
    public HomePagerAdapter(FragmentManager fm, int tabCount) { 
     super(fm); 
     this.tabCount = tabCount; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
      case 0: 
       TabHomeContainerFragment tab1 = new Tab0ContainerFragment(); 
       return tab1; 
      case 1: 
       TabShopFragment tab2 = new Tab1ContainerFragment(); 
       return tab2; 
      case 2: 
       TabMeFragment tab3 = new Tab2ContainerFragment(); 
       return tab3; 
      case 3: 
       TabBagFragment tab4 = new Tab3ContainerFragment(); 
       return tab4; 
      default: 
       return null; 
     } 
    } 

    //Overriden method getCount to get the number of tabs 
    @Override 
    public int getCount() { 
     return tabCount; 
    } 

    public Fragment getCurrentFragment() { 
     return mCurrentFragment; 
    } 
//* this is key to get the current tab to pop the fragments afterwards**/ 
    @Override 
    public void setPrimaryItem(ViewGroup container, int position, Object object) { 
     if (getCurrentFragment() != object) { 
      mCurrentFragment = ((Fragment) object); 
     } 
     super.setPrimaryItem(container, position, object); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return tabTitles[position]; 
    } 

Lets in einen Behälter gehen, um zu sehen, wie es aussehen würde:

dies für alle Container zu Ihrem xml hinzufügen (zusammen mit allem, was Sie visuell wollen, aber sie alle müssen die gleiche ID von container_framelayout:

 <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/main_content" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

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

    </android.support.design.widget.CoordinatorLayout> 

Sie es in einem coordinatorLayout setzen müssen nicht ich finde es nur einige Bugs behebt und funktioniert gut

in Sie. r Fragmente Basisklasse kopiert i fast den gleichen Code aus dem SO i oben erwähnt, aber leichte Modifikation, wenn Sie Namen hinzufügen möchten oder nicht:

public void replaceFragment(Fragment fragment, boolean addToBackStack,String tag) { 
     FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); 
     if (addToBackStack) { 
      transaction.addToBackStack(null); 
     } 
     transaction.replace(R.id.container_framelayout, fragment,tag); 
     transaction.commit(); 
     getChildFragmentManager().executePendingTransactions(); 
    } 

    public boolean popFragment() { 
     Log.e("test", "pop fragment: " + getChildFragmentManager().getBackStackEntryCount()); 
     boolean isPop = false; 
     if (getChildFragmentManager().getBackStackEntryCount() > 0) { 
      isPop = true; 
      getChildFragmentManager().popBackStack(); 
     } 
     return isPop; 
    } 

können an der Aktivitäten Layout aussehen Jetzt:

<android.support.v4.view.ViewPager 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1" 
    android:background="@color/white"/> 

<android.support.design.widget.TabLayout 
    android:id="@+id/tabLayout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    app:tabMode="fixed" 
    app:tabGravity="fill" 
    app:tabTextColor="@color/black" 
    app:tabSelectedTextColor="@android:color/darker_gray" 
    /> 

Jetzt werde ich Ihnen zeigen, wie die tablayout der Tätigkeit einzurichten Hosting den tablayout: seinen Standard:

public class HomePageActivity implements TabLayout.OnTabSelectedListener { 

       private final int NUM_OF_TABS = 4; 

       @BindView(R.id.pager) 
       public ViewPager viewPager; 

       public HomePagerAdapter adapter; 

       @BindView(R.id.tabLayout) 
       TabLayout tabLayout; 

       @NonNull 
       @Override 
       public HomePagePresenter createPresenter() { 
        return new HomePagePresenter(); 
       } 

       @Override 
       protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_homepage); 
        ButterKnife.bind(this); 
        initView(); 
       } 

       private void initView() { 

        for (int i = 0; i < NUM_OF_TABS; i++) 
         tabLayout.addTab(tabLayout.newTab()); 

        adapter = new HomePagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount()); 

        //Adding adapter to pager 
        viewPager.setAdapter(adapter); 

        tabLayout.addOnTabSelectedListener(this); 

        tabLayout.setupWithViewPager(viewPager); 

        // configure tab icons 
        int[] imageTabResId = { 
          R.drawable.welcome1, 
          R.drawable.welcome2, 
          R.drawable.welcome3, 
          R.drawable.welcome1}; 

        for (int i = 0; i < imageTabResId.length; i++) { 
         tabLayout.getTabAt(i).setIcon(imageTabResId[i]); 
        } 
       } 

/** this is key. we get the current fragment showing and pop it **/ 
       @Override 
       public void onBackPressed() { 
        boolean isPopFragment = false; 
        isPopFragment = ((BaseFragment) adapter.getCurrentFragment()).popFragment(); 
        if (!isPopFragment) { 
         finish(); 
        } 
       } 

       @Override 
       public void onTabSelected(TabLayout.Tab tab) { 
        viewPager.setCurrentItem(tab.getPosition()); 
       } 

       @Override 
       public void onTabUnselected(TabLayout.Tab tab) { 

       } 

       @Override 
       public void onTabReselected(TabLayout.Tab tab) { 

       } 
      } 

Ich denke, der Hauptteil ist onBackPress bekommen das aktuelle Fragment.

Verwandte Themen