【问题标题】:How to go back to a previous viewpager fragment from an activity?如何从活动返回到以前的 viewpager 片段?
【发布时间】:2020-07-23 18:23:34
【问题描述】:

我知道有与我要问的问题类似的问题,但没有一个能够解决我遇到的问题。

我有一个底部导航视图,其中包含五个使用 viewpager 的片段,其中一个片段打开一个活动。

问题

当我从片段打开活动时,它工作正常,但问题是当我按下返回时,它会回到打开活动的同一个片段。

解决方案

我希望当我退出活动时,它会转到前一个片段,而不是调用该活动的片段。

例如:如果用户在 HomeFragment 上并且用户点击了打开 Activity 的 Fragment(NewsFragment),并且用户按下回他们应该返回 HomeFragment,而不是 NewsFragment。

到目前为止我尝试了什么:

BottomnNvigationView 的 MainActivity 并且它在 Back Press 上

 private BottomNavigationView.OnNavigationItemSelectedListener navListener =
        new BottomNavigationView.OnNavigationItemSelectedListener() {

            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {

                switch (menuItem.getItemId()) {
                    case R.id.nav_library:
                        viewPager.setCurrentItem(0);
                        temp = temp.replace("-0", "") + "-0";
                        break;
                    case R.id.nav_technology:
                        viewPager.setCurrentItem(1);
                        temp = temp.replace("-1", "") + "-1";
                        break;
                    case R.id.nav_home:
                        viewPager.setCurrentItem(2);
                        temp = temp.replace("-2", "") + "-2";
                        break;
                    case R.id.nav_science:
                        viewPager.setCurrentItem(3);
                        temp = temp.replace("-3", "") + "-3";
                        break;
                    case R.id.nav_news:
                        viewPager.setCurrentItem(4);
                        temp = temp.replace("-4", "") + "-4";
                        Intent intent = new Intent(MainActivity.this,BrowserActivity.class);
                        startActivity(intent);
                        return true;
                }
                return true;
            }
        };
@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout)findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    }
    else {
        String[] words = temp.split("-");
        if(words.length<=2)
            if (viewPager.getCurrentItem() != 2) {
                temp = "";
                viewPager.setCurrentItem(2);
            }else
                finish();
        else {
            temp = temp.replace("-" + words[words.length - 1], "");
            int pos = viewPager.getCurrentItem();
            if (viewPager.getCurrentItem() == pos)
                pos = 2;
            else
                pos = 1;
            viewPager.setCurrentItem(Integer.parseInt(words[words.length - pos]));
        }
    }


}

从 Fragment (BrowersActivity) On Back Press 调用的 Activity

  @Override
public void onBackPressed() {

    if (viewPager.getCurrentItem() != 0) {
        viewPager.setCurrentItem(viewPager.getCurrentItem() - 1,false);
    }else{
        finish();
    }

}

任何帮助将不胜感激。

【问题讨论】:

    标签: android android-fragments android-activity android-viewpager


    【解决方案1】:

    最快的解决方案是在开始第二个活动后完成第一个活动:

                   case R.id.nav_news:
                        viewPager.setCurrentItem(4);
                        temp = temp.replace("-4", "") + "-4";
                        Intent intent = new Intent(MainActivity.this,BrowserActivity.class);
                        startActivity(intent);
                        finish()
                        return true;
    

    并且在onBackPressed的第二个activity中,重启第一个activity

        @Override
        public void onBackPressed() {
        super.onBackPressed()
        startActivity(new Intent(this, FirstActivity.class))
    }
    

    【讨论】:

    • 感谢您回答我的问题。虽然您的代码在不返回新闻片段的意义上确实有效,但我真正想要的是返回在我单击新闻片段以打开第二个活动之前调用的片段,而不是返回就像这段代码中的主要片段一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多