gpt4 book ai didi

带有 tablayout 的 android viewpager - 如何在选项卡内添加其他 fragment ?

转载 作者:行者123 更新时间:2023-11-29 01:08:54 25 4
gpt4 key购买 nike

所以我在 tablayout 中有一个经典的 viewpager,看起来像这样: enter image description here

我的 viewPagerAdapter 类如下所示:

公共(public)类 HomePagerAdapter 扩展 FragmentPagerAdapter { 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;
}

所以现在我需要在其中一个选项卡上添加一个 fragment 。所以它真的是一个搜索 fragment 。我在选项卡栏中进行搜索,我希望后端搜索结果仅出现在其中一个选项卡(第一个)中。但我希望搜索结果显示在一个名为 searchFragmentResults 的 fragment 中,并且我希望它位于第一个选项卡的顶部。然后,当用户点击后退按钮时,它将返回到第一个选项卡中的原始内容。这可以用 View 寻呼机实现吗?

所以在视觉上,当我点击第一个选项卡 tabBar 上的搜索图标时,它应该会弹出一个 searchView,当我搜索用户查询时,它应该会弹出另一个包含结果的 fragment ,但仅在它开始的选项卡中。这是一个例子: enter image description here

我无法调用 fragtransaction.replace(somecontentview, somefragment); (或其添加方法) 因为我没有将它们添加到内容 View 中。我让 viewpager 为我做这件事。那么这是如何实现的呢?

最佳答案

我想出了如何做到这一点。该选项卡应该是一个 fragment ,其目的是仅包含其他 fragment 。这个想法是基于这个 SO .但是我需要为 viewPager 做这件事。让我们完成这些步骤。首先是 viewpager 适配器:

    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];
}

让我们进入一个容器,看看它会是什么样子:

将此添加到所有容器的 xml 中(以及您在视觉上想要的任何其他内容,但它们都必须具有相同的 container_framelayout id:

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

您不必将它放在 coordinatorLayout 中,我只是发现它修复了一些错误并且运行良好。

在你的 fragment 基类中,我从上面提到的 SO 复制了几乎相同的代码,但如果你想添加标签或不添加标签,我会稍作修改:

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

现在让我们看看 Activity 布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">


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

现在我将向您展示如何在托管 tablayout 的 Activity 中设置 tablayout:它的标准:

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

}
}

我想主要部分是 onBackPress 获取当前 fragment 。

关于带有 tablayout 的 android viewpager - 如何在选项卡内添加其他 fragment ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44743426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com