Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何避免重复替换相同的片段?_Android_Android Fragments_Navigation Drawer - Fatal编程技术网

Android 如何避免重复替换相同的片段?

Android 如何避免重复替换相同的片段?,android,android-fragments,navigation-drawer,Android,Android Fragments,Navigation Drawer,我正在创建我的第一个android应用程序。做完必要的作业后,我带着孩子来这里寻求帮助 片段A可以从导航抽屉中调用。同样,若我滑动导航栏并调用片段A,它的重叠可能会调用片段A。问题是用户必须单击后退两次才能进入主屏幕 我分享了一些截图和片段 正在启动片段A(Help\u Fragment()) 一次创建 protected void onCreate(Bundle savedInstanceState) { Log.d(taglaunch, "on Create - AppDrawer

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

片段A可以从导航抽屉中调用。同样,若我滑动导航栏并调用片段A,它的重叠可能会调用片段A。问题是用户必须单击后退两次才能进入主屏幕

我分享了一些截图和片段

正在启动片段A(Help\u Fragment())

一次创建

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

}


您可以使用片段管理器的findFragmentByTag()方法检查帮助片段是否已经存在。如果它不存在,则可以继续创建一个。除此之外,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
    }
如果片段存在,您可以使用下面的代码替换片段


有几种方法可以检查哪个是当前片段(显示),您可以在
createHelp()
或其他“替换”片段的方法中执行此检查,如果当前显示的片段与正在显示的片段类型相同,只需返回
我想你可以在这里找到答案:@Yazan谢谢你的帮助:)
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
    }
public void loadFragment(Fragment fragment) {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.frame_layout, fragment);
        transaction.commitAllowingStateLoss();
    }