Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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
Java 如何通过在导航抽屉活动中单击后退按钮从其他片段返回特定片段_Java_Android - Fatal编程技术网

Java 如何通过在导航抽屉活动中单击后退按钮从其他片段返回特定片段

Java 如何通过在导航抽屉活动中单击后退按钮从其他片段返回特定片段,java,android,Java,Android,我知道前面讨论过这个主题,但没有一个对我的代码有帮助。我所做的: 在Home.java中(导航抽屉主活动)将其用于导航抽屉功能 @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { int id = item.getItemId(); Fragment fragment = null; Class fragmentClass = null; if (id == R

我知道前面讨论过这个主题,但没有一个对我的代码有帮助。我所做的:

在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;
}
通过单击导航抽屉项选择打开每个已声明的片段。另一方面,我还创建了另一个片段,该片段设置为在主活动实际启动时默认打开

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


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

确定最后解决这个问题,只需从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();
    }
只用

getSupportFragmentManager()
    .beginTransaction()
    .replace(...)
    .addToBackStack("tag").commit()
并删除所有其他代码,尤其是onBackPressed()中的代码