【问题标题】:ViewPager - Launch Activity from setOnTabSelectedListenerViewPager - 从 setOnTabSelectedListener 启动 Activity
【发布时间】:2017-06-09 13:20:17
【问题描述】:

我试图在选择特定选项卡时启动一个活动,但是当我从该活动返回时,我希望显示前一个而不是我单击的选项卡。就像您单击 Instagram 上的加号按钮一样。

像这样:

  • 默认片段 1/选项卡 1

  • 转到片段 5/标签 5

  • 点击tab 3,弹出activity

  • 返回,查看片段 5/标签 5

现在,我将上次访问的选项卡索引存储在一个变量中,然后当单击选项卡 3 时,它会转到上次访问的选项卡。

tabLayout.setOnTabSelectedListener(
            new TabLayout.ViewPagerOnTabSelectedListener(viewPager) {
                @Override
                public void onTabSelected(TabLayout.Tab tab) {
                  //super.onTabSelected(tab); -- Should keep this or leave it commented out? 
                    int pos = tab.getPosition();
                    switch (pos) {
                        case 0:
                            viewPager.setCurrentItem(tab.getPosition(), false);
                            getSupportActionBar().setTitle("Home");
                            pre_pos = pos;
                            pre_title = "Home";
                            break;
                        case 1:
                            viewPager.setCurrentItem(tab.getPosition(), false);
                            getSupportActionBar().setTitle("Trending");
                            pre_pos = pos;
                            pre_title = "Trending";
                            break;
                        case 2:
                            viewPager.setCurrentItem(pre_pos, false);
                            getSupportActionBar().setTitle(pre_title);

                            Intent intent = new Intent(MainActivity.this, NewEvent_Activity.class);
                            startActivity(intent);
                            Toast.makeText(getApplicationContext(), 
                                    "Curr: "+ viewPager.getCurrentItem()+
                                    " Prev: " + pre_pos +
                                    " Clicked: " +tab.getPosition(), 
                                    Toast.LENGTH_SHORT).show();
                            break;
                        case 3:
                            viewPager.setCurrentItem(tab.getPosition(), false);
                            getSupportActionBar().setTitle("Notifications");
                            pre_pos = pos;
                            pre_title = "Notifications";
                            break;
                        case 4:
                            viewPager.setCurrentItem(tab.getPosition(), false);
                            getSupportActionBar().setTitle("Profile");
                            pre_pos = pos;
                            pre_title = "Profile";
                            break;
                    }
                }
            });

ViwPager.java 中,它在调用setCurrentItem() 时调用此函数

void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity) {
    if (mAdapter == null || mAdapter.getCount() <= 0) {
        setScrollingCacheEnabled(false);
        return;
    }
    //I think my problem lies in the following line (mCurItem == item)
    if (!always && mCurItem == item && mItems.size() != 0) {
        setScrollingCacheEnabled(false);
        return;
    }

    if (item < 0) {
        item = 0;
    } else if (item >= mAdapter.getCount()) {
        item = mAdapter.getCount() - 1;
    }
    final int pageLimit = mOffscreenPageLimit;
    if (item > (mCurItem + pageLimit) || item < (mCurItem - pageLimit)) {
        // We are doing a jump by more than one page.  To avoid
        // glitches, we want to keep all current pages in the view
        // until the scroll ends.
        for (int i = 0; i < mItems.size(); i++) {
            mItems.get(i).scrolling = true;
        }
    }
    final boolean dispatchSelected = mCurItem != item;

    if (mFirstLayout) {
        // We don't have any idea how big we are yet and shouldn't have any pages either.
        // Just set things up and let the pending layout handle things.
        mCurItem = item;
        if (dispatchSelected) {
            dispatchOnPageSelected(item);
        }
        requestLayout();
    } else {
        populate(item);
        scrollToItem(item, smoothScroll, velocity, dispatchSelected);
    }
}

我认为这是我的问题所在,但我无法对其进行编辑。 有什么建议吗?

谢谢。

【问题讨论】:

    标签: android android-fragments android-tablayout


    【解决方案1】:

    在活动上实现 ViewPager.OnPageChangeListener。在 viewpager 上设置监听器

     view_pager.setOnPageChangeListener(this);
    

    在 OnPageSelected() 方法中:

    @Override
    public void onPageSelected(int position) {
        if (position == 3) {
            startActivity(new Intent(this,activity.class));
        }
    }
    

    覆盖活动 onResume 方法并写入:

    @Override
    public void onResume() {
        super.onResume();
       view_pager.setCurrentItem(0);
    }
    

    【讨论】:

    • onResume() 也会被调用,当你第一次启动你的活动时,它会默认显示最后存储的索引。
    【解决方案2】:

    要做到这一点,您必须遵循这些简单的步骤

    步骤:1 在所有 ViewPager 片段中覆盖以下方法

     @Override
        public void setMenuVisibility(boolean menuVisible) {
            super.setMenuVisibility(menuVisible);
        }
    

    当您的片段可见时,将调用此方法。

    步骤:2 在 Fragmenr3 中添加一个条件,以便在您的 Fragment 可见时启动新的 Activity

    @Override
            public void setMenuVisibility(boolean menuVisible) {
                super.setMenuVisibility(menuVisible);
                if(menuVisible){
    Intent intent = new Intent(MainActivity.this, NewEvent_Activity.class);
                                startActivity(intent);
              }
            }
    

    现在它会在前面打开你的活动。但是您剩下的一个要求是,如果用户从活动中按下,您必须显示第二个 Last 片段,因此您已经提到您正在存储 Last 片段的索引位置,因此请按照以下步骤操作。

    步骤:3 在您的 ViewPager 活动中覆盖 onRestart()

    @Override
        protected void onRestart() {
            super.onRestart();
            view_pager.setCurrentItem(Stored last Index);
        }
    

    它会解决你的问题,它对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 2012-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多