片段之间的麻烦导航

Troubles navigation between fragment

关于这个问题,我已经调查了 4 个小时,但没有得到任何帮助。

总而言之,我正在尝试使用导航视图在 Android Studio 中的片段之间导航。我想从 Home Fragment 转到 Services Fragment。

第一个 Home Fragment 总是加载,但是当我点击 Services 项目时,片段 Services 加载,但来自 Home 的数据也总是保留在片段上。

这是我的代码:

家庭片段CLASS

public class HomeFragment extends Fragment {

private HomeViewModel homeViewModel;
private PieChart pieChart;

private UserService userService;
private Calendar calendar;

public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {
    homeViewModel = ViewModelProviders.of(this).get(HomeViewModel.class);
    View root = inflater.inflate(R.layout.fragment_home, container, false);

    pieChart = root.findViewById(R.id.pieChart);

    userService = UserRepository.getUserService();

    getData();

    return root;
}


private void getData(){
    calendar = Calendar.getInstance();
    int month = calendar.get(Calendar.MONTH)+1;
    Log.i("INT MONTH", String.valueOf(month));

    userService.getHoursPerService(String.valueOf(UserCache.empleado.getId_emp()),String.valueOf(month)).enqueue(new Callback<List<Servicio>>() {
        @Override
        public void onResponse(Call<List<Servicio>> call, Response<List<Servicio>> response) {

            if(response.body().size() == 0){
                pieChart.setNoDataText("Sin horas actuales.");
                pieChart.setNoDataTextColor(ContextCompat.getColor(getContext(), R.color.colorPrimaryDark));
                pieChart.invalidate();
            }else{
                List<Servicio> list = response.body();

                List<PieEntry> pieEntries = new ArrayList<>();

                for(int cont=0;cont<list.size();cont++){
                    pieEntries.add(new PieEntry(list.get(cont).getTotalHoras(), list.get(cont).getLugarServicio()));
                }
                SimpleDateFormat sdf = new SimpleDateFormat("MMMM");
                String actual_month = sdf.format(calendar.getTime());

                PieDataSet dataSet = new PieDataSet(pieEntries, getResources().getString(R.string.txt_hours_of)+" "+actual_month);

                dataSet.setSliceSpace(3f);
                dataSet.setSelectionShift(5f);
                dataSet.setColors(ColorTemplate.MATERIAL_COLORS);

                PieData data = new PieData(dataSet);

                data.setValueTextSize(10f);
                data.setValueTextColor(ContextCompat.getColor(getContext(), R.color.colorPrimaryDark));

                pieChart.getDescription().setEnabled(true);
                pieChart.getDescription().setText(getResources().getString(R.string.txt_hours_of)+" "+actual_month+".");
                pieChart.getDescription().setTextSize(12f);
                pieChart.getDescription().setTextColor(ContextCompat.getColor(getContext(), R.color.colorPrimaryDark));
                pieChart.setExtraOffsets(5, 10, 5, 5);
                pieChart.setDragDecelerationFrictionCoef(0.99f);
                pieChart.setDrawHoleEnabled(true);
                pieChart.setHoleColor(Color.WHITE);
                pieChart.setTransparentCircleRadius(61f);
                pieChart.animateY(2000, Easing.EaseInOutCubic);
                pieChart.setEntryLabelColor(ContextCompat.getColor(getContext(),R.color.colorPrimaryDark));
                pieChart.setData(data);
                pieChart.invalidate();
            }
        }

        @Override
        public void onFailure(Call<List<Servicio>> call, Throwable t) {

        }
    });
}

}

服务片段CLASS

public class ServicesFragment extends Fragment {

private ServicesViewModel servicesViewModel;

public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {
    servicesViewModel = ViewModelProviders.of(this).get(ServicesViewModel.class);
    View root = inflater.inflate(R.layout.fragment_myservices, container, false);
    final TextView textView = root.findViewById(R.id.text_gallery);
    servicesViewModel.getText().observe(this, new Observer<String>() {
        @Override
        public void onChanged(@Nullable String s) {
            textView.setText(s);
        }
    });
    return root;
}

}

主要ACTIVITY

public class MainActivityView extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

private AppBarConfiguration mAppBarConfiguration;
private NavigationView navigationView;
private ActionBarDrawerToggle toggle;
private TextView userNameNav;
private TextView userEmailNav;
private DrawerLayout drawer;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_view);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    /*FloatingActionButton fab = 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();
        }
    });*/

    drawer = findViewById(R.id.drawer_layout);

    navigationView = findViewById(R.id.nav_view);

    // Passing each menu ID as a set of Ids because each
    // menu should be considered as top level destinations.
    mAppBarConfiguration = new AppBarConfiguration.Builder(
            R.id.nav_home, R.id.nav_myservices, R.id.nav_startservice)
            .setDrawerLayout(drawer)
            .build();
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
    NavigationUI.setupWithNavController(navigationView, navController);

    View headerView = navigationView.getHeaderView(0);

    navigationView.setNavigationItemSelectedListener(this);

    userNameNav = headerView.findViewById(R.id.userNameNav);
    userEmailNav = headerView.findViewById(R.id.userEmailNav);

    userNameNav.setText(UserCache.empleado.getNombre()+" "+UserCache.empleado.getApellidos());
    userEmailNav.setText(UserCache.empleado.getEmail());

    navigationView.bringToFront();
}

@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_activity_view, menu);
    return true;
}


@Override
public boolean onSupportNavigateUp() {
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    return NavigationUI.navigateUp(navController, mAppBarConfiguration)
            || super.onSupportNavigateUp();
}

@Override
public void onBackPressed() {

    if(drawer.isDrawerOpen(GravityCompat.START)){
        drawer.closeDrawer(GravityCompat.START);
    }else{
        AlertDialog.Builder alerta = new AlertDialog.Builder(this);

        alerta.setTitle(getResources().getString(R.string.txt_dialog_exit_app));

        alerta.setPositiveButton(getResources().getString(R.string.txt_yes_option), new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                finish();
            }
        });

        alerta.setNegativeButton(getResources().getString(R.string.txt_no_option), new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {

            }
        });

        alerta.show();
    }
}

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

    switch (menuItem.getItemId()){
        case R.id.nav_home:
            getSupportFragmentManager().popBackStack(null,FragmentManager.POP_BACK_STACK_INCLUSIVE);
            getSupportFragmentManager().beginTransaction().replace(R.id.nav_host_fragment,new HomeFragment()).commit();
        case R.id.nav_myservices:
            getSupportFragmentManager().popBackStack(null,FragmentManager.POP_BACK_STACK_INCLUSIVE);
            getSupportFragmentManager().beginTransaction().replace(R.id.nav_host_fragment, new ServicesFragment()).commit();
            //NavHostFragment.findNavController(new ServicesFragment());
            break;
        case R.id.nav_startservice:
            getSupportFragmentManager().popBackStack(null,FragmentManager.POP_BACK_STACK_INCLUSIVE);
            getSupportFragmentManager().beginTransaction().replace(R.id.nav_host_fragment, new StartServiceFragment()).commit();
             break;
    }

    drawer.closeDrawer(GravityCompat.START);

    return true;
}

}

onNavigationItemSelected 是我进行导航的地方。

我尝试了所有方法,将 ConstraintLayout 更改为 Relative,将 xml 中的片段插入 framelayout...

此外,我正在使用 MVVM

如果需要更多信息,我可以 post 这里。

PD:对不起,如果我 post 有什么不对,这是我第一次来这里。

解决方案: 我完全忘记打破第一个案例 onNavigationItemSelected.