iLuuPii
iLuuPii

Reputation: 77

Troubles navigation between fragment

I have been investigating for like 4 hours about this problem, but I didnt get any help.

On summary, I am trying to navigate between fragments in Android Studio, using Navigation View. I want to go from Home Fragment to Services Fragment.

The first Home Fragment always load, but when I click on Services item, the fragment Services load, but the data from Home always keeps on the fragment too.

This is my code:

HOME FRAGMENT 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) {

        }
    });
}

}

SERVICES FRAGMENT 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;
}

}

MAIN 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 is where I do the navigation.

I tried everything, changing the ConstraintLayout to Relative, insert the fragments from xml into framelayout...

Also, I am using MVVM.

If more information is needed i can post here then.

PD: Sorry if I posting something wrong, this is my first time here.

Upvotes: 0

Views: 37

Answers (1)

iLuuPii
iLuuPii

Reputation: 77

SOLUTION: I forgot completly to break the first case onNavigationItemSelected.

Upvotes: 1

Related Questions