【问题标题】:How to go back on a particular fragment from other fragments by back button click in navigation drawer activity如何通过在导航抽屉活动中单击后退按钮从其他片段返回特定片段
【发布时间】:2016-08-23 14:42:21
【问题描述】:

我知道之前在这里讨论过的这个主题,但它们都对我的代码没有任何意义。我做了什么:

在 Home.java 中(导航抽屉主活动)将此用于导航抽屉功能

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

    int id = item.getItemId();
    Fragment fragment = null;
    Class fragmentClass = null;

    if (id == R.id.nav_breakfast) {
        fragmentClass = Breakfast.class;
    } else if (id == R.id.nav_lunch) {
        fragmentClass = Lunch.class;
    } else if (id == R.id.nav_wallet) {
        fragmentClass = Wallet.class;
    } else if (id == R.id.nav_history) {
        fragmentClass = History.class;
    } else if (id == R.id.nav_reset) {
        fragmentClass = ResetPass.class;
    } else if (id == R.id.nav_send) {
        fragmentClass = ContactUs.class;
    } else if (id == R.id.nav_help) {
        fragmentClass = Help.class;
    } else if (id == R.id.nav_about) {
        fragmentClass = AboutUs.class;
    }

    try {
        assert fragmentClass != null;
        fragment = (Fragment) fragmentClass.newInstance();
    } catch (Exception e) {
        e.printStackTrace();
    }

    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).addToBackStack(null).commit();

    drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    assert drawer != null;
    drawer.closeDrawer(GravityCompat.START);

    return true;
}

通过单击导航抽屉项目选择打开每个声明的片段。另一方面,我还创建了另一个片段,该片段设置为在 Home 活动实际启动时默认打开

 if (savedInstanceState == null) {
        Fragment fragment = null;
        Class fragmentClass;
        fragmentClass = AllProduct.class;
        try {
            fragment = (Fragment) fragmentClass.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }

        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();

在 onBackPressed() 上我使用了这个:

@Override
public void onBackPressed() {
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    }
    else if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
        getSupportFragmentManager().popBackStack();
    }
    else if (doubleBackToExitPressedOnce) {
        super.onBackPressed();
    }
    else {
        this.doubleBackToExitPressedOnce = true;
        Toast.makeText(this, "Press again to exit", Toast.LENGTH_SHORT).show();

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                doubleBackToExitPressedOnce = false;
            }
        }, 2000);
    }

所有片段活动都以这种方式编码:

public class AllProduct extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_all_product, container, false);

    return view;
}

@Override
public void onResume() {
    super.onResume();
    getActivity().setTitle(R.string.app_name);
}

}

现在一切正常,只有一个问题。假设我想从导航抽屉(不是上面提到的默认片段)打开 Fragment [1],然后再次打开导航抽屉并打开 Fragment [2],然后是 Fragment [3]。现在假设我在 Fragment [3] 中,通过按下后退按钮,我直接想要转到上面提到的 Default 片段。它首先进入片段 [2],片段 [1],然后是默认片段。但是我想在任何地方,在哪个片段中,我必须通过按下后退按钮回到默认片段。

【问题讨论】:

    标签: java android


    【解决方案1】:

    随便用

    getSupportFragmentManager()
        .beginTransaction()
        .replace(...)
        .addToBackStack("tag").commit()
    

    并删除所有其他代码,尤其是 onBackPressed() 中的代码

    【讨论】:

      【解决方案2】:

      Ok 终于解决了这个问题,只需从 onNavigationItemSelected 中删除 .addToBackStack(null) 即可。然后添加:

       getView().setFocusableInTouchMode(true);
          getView().requestFocus();
          getView().setOnKeyListener(new View.OnKeyListener() {
              @Override
              public boolean onKey(View v, int keyCode, KeyEvent event) {
      
                  if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){
                      Fragment fragment = null;
                      Class fragmentClass;
                      fragmentClass = AllProduct.class;
                      try {
                          fragment = (Fragment) fragmentClass.newInstance();
                      } catch (Exception e) {
                          e.printStackTrace();
                      }
      
                      FragmentManager fragmentManager = getFragmentManager();
                      fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();
      
                      return true;
                  }
                  return false;
              }
          });
      

      在 onResume() 下的每个片段中

      并删除:

      else if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
              getSupportFragmentManager().popBackStack();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-01
        相关资源
        最近更新 更多