【问题标题】:Back Handling in Fragment While Using Navigation DrawerLayout使用 Navigation DrawerLayout 时在 Fragment 中的返回处理
【发布时间】:2017-12-28 12:37:34
【问题描述】:

如果我点击任何抽屉项目超过一次(例如 5 次),我在Navigation drawer 中遇到问题,然后在后按时我得到 5 次相同的片段。

假设首先我点击了Fragment 一个然后在fragment 上点击了5 次然后在返回处理或返回第一个5 次第二个fragment 被调用并且fragment 一个。

如果相同,我想要那个。我点击了多次的片段,无需将其推送到堆栈上。

如何处理?

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener,HomeListFragment.MyListFragmentListener {

    private Stack<Fragment> fragmentStack;
    private FragmentManager fragmentManager;
    private HomeListFragment homeListFragment;
    private ResultListFragment resultListFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

      /*  FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });*/

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle 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);


        fragmentStack = new Stack<Fragment>();

        homeListFragment = new HomeListFragment();
        homeListFragment.registerForListener(this);

        fragmentManager = getSupportFragmentManager();
        FragmentTransaction ft = fragmentManager.beginTransaction();
        ft.add(R.id.container, homeListFragment);
        fragmentStack.push(homeListFragment);
        ft.commit();


    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            if (fragmentStack.size() >1) {
                FragmentTransaction ft = fragmentManager.beginTransaction();
                fragmentStack.lastElement().onPause();
                ft.remove(fragmentStack.pop());
                fragmentStack.lastElement().onResume();
                ft.show(fragmentStack.lastElement());
                ft.commit();
            } else {
                super.onBackPressed();
            }
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onItemClickedListener(String valueClicked) {
        Toast.makeText(this, valueClicked, Toast.LENGTH_LONG).show();

        FragmentTransaction ft = fragmentManager.beginTransaction();

        resultListFragment = new ResultListFragment();
        ft.add(R.id.container, resultListFragment);
        fragmentStack.lastElement().onPause();
        ft.hide(fragmentStack.lastElement());
        fragmentStack.push(resultListFragment);
        ft.commit();
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_camera) {
            FragmentTransaction ft = fragmentManager.beginTransaction();

            One one = new One();
            ft.replace(R.id.container, one,"One");
            fragmentStack.lastElement().onPause();
            ft.hide(fragmentStack.lastElement());
            fragmentStack.push(one);
            ft.commit();
        } else if (id == R.id.nav_gallery) {
            FragmentTransaction ft = fragmentManager.beginTransaction();

            Two two = new Two();
            ft.replace(R.id.container, two,"Two");
            fragmentStack.lastElement().onPause();
            ft.hide(fragmentStack.lastElement());
            fragmentStack.push(two);
            ft.commit();
        } else if (id == R.id.nav_slideshow) {
            FragmentTransaction ft = fragmentManager.beginTransaction();

            Three three = new Three();
            ft.replace(R.id.container, three,"Three");
            fragmentStack.lastElement().onPause();
            ft.hide(fragmentStack.lastElement());
            fragmentStack.push(three);
            ft.commit();
        } else if (id == R.id.nav_manage) {
            FragmentTransaction ft = fragmentManager.beginTransaction();

            Four four = new Four();
            ft.replace(R.id.container, four,"Four");
            fragmentStack.lastElement().onPause();
            ft.hide(fragmentStack.lastElement());
            fragmentStack.push(four);
            ft.commit();

        } else if (id == R.id.nav_share) {

        } else if (id == R.id.nav_send) {

        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

请帮忙

【问题讨论】:

    标签: android android-layout android-studio android-fragments fragment


    【解决方案1】:

    //你是用backstack来保存之前的fragment 移除所有的fragment栈

            One one = new One();
            ft.replace(R.id.container, one,"One");
            ft.commit();
    

    或者你可以在 backPress 方法中使用下面的代码

     getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    

    【讨论】:

      【解决方案2】:

      您可以通过标签简单地检查当前片段实例是否存在。检查片段是否存在,然后按此执行您的逻辑。

      Fragment fragment = getFragmentManager().findFragmentByTag("yourstringtag");
              if (fragment instanceof yourFragment) {
                  // No need to commit new one
              } else {
                  // Commit new one
              }
      

      使用 currentFragment 实例解决此问题的另一种简单方法。请将此作为示例逻辑,我没有检查它。

      private Fragment mFragment;
      @Override
      public boolean onNavigationItemSelected(MenuItem item) {
          // Handle navigation view item clicks here.
          int id = item.getItemId();
      
          if (id == R.id.nav_camera) {
      
              if (!(mFragment instanceof One)) {
                  FragmentTransaction ft = fragmentManager.beginTransaction();
      
                  One one = new One();
                  ft.replace(R.id.container, one, "One");
                  fragmentStack.lastElement().onPause();
                  ft.hide(fragmentStack.lastElement());
                  fragmentStack.push(one);
                  mFragment = one;
                  ft.commit();
              }
      
          }
          DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
          drawer.closeDrawer(GravityCompat.START);
          return true;
      }
      

      【讨论】:

      • 在 yourFragment 上我必须通过的地方@Alex Chengalan
      • 它取决于你的片段,例如:if (id == R.id.nav_camera)yourFragment = One 里面,yourstringtag 是 "One"
      • 不兼容的类型。必需:android.support.v4.app.Fragment 找到:android.app.Fragment
      • 使用getSupportFragmentManager 而不是getFragmentManager
      • 这里这个问题已经解决了,但是又出现了另一个问题,假设我先点击一个片段,然后点击第二个,然后点击第三个,依此类推,然后再次点击片段中的任何一个,它就不会出现。在顶部@Alex Chengalan
      猜你喜欢
      • 2014-03-20
      • 2019-08-01
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-05
      相关资源
      最近更新 更多