android viewpager with tablayout - 如何在选项卡内添加其他片段?

2024-02-19

so i have the classic viewpager in a tablayout that looks something like this: enter image description here

我的 viewPagerAdapter 类如下所示:

公共类 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;
}

}

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

so visually when i hit the search icon on the first tabs tabBar it should bring up a searchView and when i search for the users query it should bring up a another fragment with the results but only in the tab that it started from. Here is an example: enter image description here

我不能打电话fragtransaction.replace(somecontentview, somefragment); (or its add method)因为我没有将它们添加到内容视图中。我让 viewpager 帮我做这件事。那么这是如何实现的呢?


我想出了如何做到这一点。该选项卡应该是一个片段,其目的是仅包含其他片段。这个想法是基于此SO https://stackoverflow.com/a/19859871/835883。但我需要为 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 中,我只是发现它修复了一些错误并且运行良好。

在你的片段基类中,我从上面提到的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;
    }

现在让我们看看活动布局:

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

现在我将向您展示如何在托管选项卡布局的活动中设置选项卡布局: 其标准:

    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 获取当前片段。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android viewpager with tablayout - 如何在选项卡内添加其他片段? 的相关文章

随机推荐

  • 如何删除内联/内联块元素之间的空格?

    这些之间将有 4 像素宽的空间span要素 span display inline block width 100px background color palevioletred p span Foo span span Bar span
  • Skyfield 轨道与太阳系重力场的整合 - 速度问题

    在下面所示的时间测试中 我发现Skyfield http rhodesmill org skyfield 需要几百微秒到一毫秒才能返回obj at jd position km对于单个时间值jd 但较长时间的增量成本JulianDate对象
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • CouchDB 的自定义 REST API?

    我一直在谷歌上搜索 试图找到例子或者直接回答我的问题 是否可以为 couchDB 创建 扩展我自己的自定义 api 端点 例如我可以创建一个 api 调用吗http 127 0 0 1 5984 database FillDatabase
  • IBM .NET Data Provider 连接字符串与库列表的问题

    我尝试在 C 程序中使用 DB2 Net Data Provider 而不是依赖 ODBC 下面的连接字符串有效 但仅适用于一个库 假设我的库是 test1 和 test2 Data Source xxx xxx xxx xxx User
  • 创建元素时的 jQuery 事件

    我想在创建元素时触发一个事件 document on load TB title function console log loaded 是否有与此等效的有效方法 我看到有人建议 livequery 但这似乎很重 Thanks 我不认为这样
  • 如何使用python在mysql数据库中存储阿拉伯文本?

    我有一个阿拉伯字符串说 txt u Arabic u0627 u0644 u0637 u064a u0631 u0627 u0646 我想把这段阿拉伯文文本转换成mySql数据库 我尝试使用 txt smart str txt or txt
  • 如何在 PHP 中高效使用 try...catch 块

    我一直在 PHP 代码中使用 try catch 块 但我不确定是否正确使用了它们 例如 我的一些代码如下所示 try tableAresults dbHandler gt doSomethingWithTableA tableBresul
  • 在 JavaScript 中声明函数 [重复]

    这个问题在这里已经有答案了 这两种声明函数的方式有什么区别 function someFunc var someFunc function 我不是在技术意义上问 我并不是问哪种可读性更好 或者哪种风格更受欢迎 我和这里大多数人的观点不同 从
  • iPhone Facebook 视频上传

    我已经为此工作了几天 但似乎无法在任何地方找到直接的答案或示例 我正在尝试从我的 iPhone 应用程序中将视频上传到 Facebook 我可以使用以下命令毫无问题地连接到 Facebook 并已上传图片 facebook Facebook
  • 衡量代码质量时的代码行 VS 指令

    我有一个由许多模块组成的项目 我正在运行两者JaCoCo http www eclemma org jacoco 对于单元测试覆盖率和Sonar https www sonarqube org 为了代码质量 由于技术原因 我无法对我的模块之
  • Java:在实例化期间传递“this”的实例[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我的班级1 public class myClass1 public myClass2 myclass2 public void cr
  • 为什么有些 Python 变量保持全局,而有些需要定义为全局

    我在理解为什么有些变量是局部变量而有些变量是全局变量时遇到了一些困难 例如 当我尝试这个时 from random import randint score 0 choice index map a 0 b 1 c 2 d 3 questi
  • 何时调用 Thread.currentThread().interrupt() 何时不调用?

    从互联网上的多篇文章来看 建议不要吞咽InterruptedException 当我要重用同一个线程时 使用类似这样的线程池执行器来执行此操作更有意义 public static void main String args throws I
  • SQL LIKE % 对于整数

    在 T SQL 中 如何编写查询来为列的任何整数值选择行 比如数据是这样的 NAME AGE A 10 B 20 C 10 D 20 并且有一个
  • 根据控件宽度缩放 UISegmentedControl 标签

    这似乎是理所当然的 但我找不到任何方法来做到这一点 基本上我拥有的是UISegmentedControl带有两个本地化标签NSLocalizedString 我已经设置了字体大小 并且所有内容在英语和其他几种语言中看起来都很棒 但是 在日语
  • 位置:Flash 上的绝对 div

    是否有可能position absolute a div div 在 Flash 横幅上 无需添加wmode transparent 到横幅 我有一个灯箱需要显示在我的广告上方 但我无法直接修改横幅 因为它们来自第三方 Edit 问题主要出
  • 如何从 std::list 实现 O(1) 擦除

    问题是推荐的使用方式是什么std list实现 O 1 删除列表项 通常 当我选择双向链表时 我希望能够在 O 1 时间内从列表中删除一个元素 然后在 O 1 时间内将其移动到不同的列表 如果该元素有自己的prev and next指针 没
  • 是否有低级网络库来嗅探和更改网络流量? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种嗅探网络数据包并用 C 对其进行编码的方法 总之 改变网络流量 我不知道如何解释我的请求
  • android viewpager with tablayout - 如何在选项卡内添加其他片段?

    so i have the classic viewpager in a tablayout that looks something like this 我的 viewPagerAdapter 类如下所示 公共类 HomePagerAda