有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在片段中被压回运行主活动中的函数

我有一个调用片段的活动,如下所示:

主要活动中的导航抽屉:

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

    if(id == R.id.nav_jobs_layout){
        fragmentManager.beginTransaction()
                .replace(R.id.content_frame, new JobsFragment())
                .addToBackStack("Jobs")
                .commit();
    }else if(id == R.id.nav_shipments_out){
        fragmentManager.beginTransaction()
                .replace(R.id.content_frame, new ShipmentsOutFragment())
                .addToBackStack("ShipmentsOut")
                .commit();
    }else if(id == R.id.logout){
        SharedPreferences preferences = getSharedPreferences("MyPreferences", Context.MODE_PRIVATE);
        Authentication auth = new Authentication(preferences);
        auth.logout();

        Intent intent = new Intent(MainActivity.this, LoginActivity.class);
        startActivity(intent);
    }
}

当我点击发货时,它会打开我的发货片段,在那里我有一个发货列表供用户选择。根据选择,我打开另一个片段,它将显示在那里。这是在这里完成的:

ShipmentFragment:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        Shipment shipment = shipments.get(position);

        安卓.app.FragmentManager fragmentManager = getFragmentManager();

        ShipmentsOutDetailsFragment newFragment = new ShipmentsOutDetailsFragment();

        newFragment.shipment = shipment;

        fragmentManager.beginTransaction()
                .replace(R.id.content_frame, newFragment)
                .addToBackStack("Shipments")
                .commit();
    }
});

在下一个片段中,我将显示所选装运的详细信息。当您单击该片段时,问题就出现了。就像每次我重新加载基本装运时加载第一个片段一样

单击“上一步”时,似乎会运行onBackPressed函数,如图所示,该函数位于主活动中。我怎样才能阻止它运行?是否有一个覆盖我可以放进任何一个片段

这是主活动中的恼人的onBackPressed,我不想在我点击第二个片段时运行它,但在第一个片段上运行

@Override
public void onBackPressed() {
    DrawerLayout drawer = findViewById(R.id.drawer_layout);

    Log.v("BackPressed", "This function has been run");

    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();

        this.finish();
    }
}

共 (2) 个答案

  1. # 1 楼答案

    尝试如下

        @Override
        public void onBackPressed() {
            DrawerLayout drawer = findViewById(R.id.drawer_layout);
            if (drawer.isDrawerOpen(GravityCompat.START)) {
                drawer.closeDrawer(GravityCompat.START);
            } else {
                int count = getFragmentManager().getBackStackEntryCount();
                if (count == 0) {
                    super.onBackPressed(); //this method just will be called when there is none more fragments
                } else getFragmentManager().popBackStack();
            }
        }
    
  2. # 2 楼答案

    您可以声明两个feild:

     final static int JOBS_FRAGMENT = 0;
     final static int SHIPMENTS_OUT_FRAGMENT = 1;
    

    另一个variable可以保存当前的fragment显示:

     public int currentFragmentShown = JOBS_FRAGMENT; // Or add the fragment shown by default on the start of the activity
    

    然后在每次更改fragment时更改currentFragmentShwon的值:

        if(id == R.id.nav_jobs_layout){
            fragmentManager.beginTransaction()
                    .replace(R.id.content_frame, new JobsFragment())
                    .addToBackStack("Jobs")
                    .commit();
            currentFragmentShown = JOBS_FRAGMENT;
        }else if(id == R.id.nav_shipments_out){
            fragmentManager.beginTransaction()
                    .replace(R.id.content_frame, new ShipmentsOutFragment())
                    .addToBackStack("ShipmentsOut")
                    .commit();
            currentFragmentShown = SHIPMENTS_OUT_FRAGMENT;
        }
    

    然后在ideonBackPressed()函数中,您可以执行以下操作:

    @Override
    public void onBackPressed() {
    
     if (currentFragmentShown == JOBS_FRAGMENT) {
            //Do whatever you want to do when jobs fragment is shown
        } else {
            //Do whatever you want to do when shippement out fragment fragment is shown
        }
    }
    

    这也许不是最好的解决方案,但我希望这能有所帮助