【问题标题】:How to avoid replacing same fragment over and over?如何避免一遍又一遍地替换相同的片段?
【发布时间】:2017-03-19 14:22:15
【问题描述】:

我正在创建我的第一个 android 应用程序。做完必要的功课后,我带来这里寻求帮助。

可以从导航抽屉中调用片段 A。如果我再次滑动导航栏并调用 Fragment A。它与之前调用的 Fragment A 重叠。问题是用户必须单击两次才能返回主屏幕。

我分享了一些截图和sn-p。

启动片段 A(Help_Fragment())

 private void createHelp() {

    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
    Log.d(taglaunch, "Switching to Help Fragment");
    Fragment fragment = new Help_Fragment();
    fragmentTransaction.setCustomAnimations(R.animator.slide_in_left,
            R.animator.slide_out_right, R.animator.exit_to_left, R.animator.exit_to_right);
    fragmentTransaction.replace(R.id.app_bar, fragment).addToBackStack(null).commit();

}

创建

 protected void onCreate(Bundle savedInstanceState) {
    Log.d(taglaunch, "on Create - AppDrawer");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_appdrawer);
    mainActivityAdapter = new MainActivityAdapter(getFragmentManager());
    navigate();
    switchtofragment();
    getFragmentManager().addOnBackStackChangedListener(backStackListener);

}

 public void switchtofragment() {
        tabLayout = (TabLayout) findViewById(R.id.tab_layout);
        tabLayout.addTab(tabLayout.newTab().setText("TAB1"));
        tabLayout.addTab(tabLayout.newTab().setText("TAB2"));
        viewPager = (ViewPager) findViewById(R.id.view_pager);
        viewPager.setAdapter(mainActivityAdapter);
        tabLayout.setOnTabSelectedListener(this);
        tabLayout.setupWithViewPager(viewPager);

    }

public void navigate() {

    toolbar = (Toolbar) findViewById(R.id.toolbar);

    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);

}

Fragment A screenshot.

Navigation Drawer

【问题讨论】:

  • 有几种方法可以检查哪个是当前片段(显示),您可以在createHelp() 或其他“替换”片段的方法中进行此检查,如果当前显示的片段与那个片段的类型相同正在显示,只是return;
  • 我想你可以在这里找到答案:stackoverflow.com/a/38475373/3436343
  • @Yazan 感谢您的帮助:)

标签: android android-fragments navigation-drawer


【解决方案1】:

如果片段存在,您可以使用以下代码替换片段。

public void loadFragment(Fragment fragment) {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.frame_layout, fragment);
        transaction.commitAllowingStateLoss();
    }

【讨论】:

    【解决方案2】:

    您可以使用 Fragment Manager 的 findFragmentByTag() 方法检查 Help_Fragment 是否已经存在。如果它不存在,那么您可以继续创建一个。除此之外,replace 方法替换以编程方式添加的片段,即像框架布局一样添加到容器中。但是这个解决方案可能只是一种解决方法。试试这个,让我们知道。 :)

    代码:-

    FragmentManager manager=getSupportFragmentManager();
        Help_Fragment fragment1= (Help_Fragment) manager.findFragmentByTag("Help_Fragment");
        if(fragment1==null)
        {
            FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
            Log.d(taglaunch, "Switching to Help Fragment");
            Fragment fragment = new Help_Fragment();
            fragmentTransaction.setCustomAnimations(R.animator.slide_in_left,
                    R.animator.slide_out_right, R.animator.exit_to_left, R.animator.exit_to_right);
            fragmentTransaction.replace(R.id.app_bar, fragment,"Help_Fragment").addToBackStack(null).commit();
        }
        else{
            // Display a Toast that fragment exists
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-30
      • 1970-01-01
      • 2021-06-05
      • 2016-12-20
      • 2017-02-15
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多