java - 片段之间的导航出现问题

标签 java android-studio android-fragments mvvm navigation

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

总而言之,我尝试使用导航 View 在 Android Studio 中的片段之间导航。我想从主页片段转到服务片段。

第一个主页片段始终加载,但是当我单击“服务”项时,片段服务会加载,但来自主页的数据也始终保留在片段上。

这是我的代码:

主片段类

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

        }
    });
}

}

服务片段类

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

如果需要更多信息,我可以在这里发布。

PD:抱歉,如果我发帖有错,这是我第一次来这里。

最佳答案

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

关于java - 片段之间的导航出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59383938/

相关文章:

android - 删除特定版本的 Android Studio VCS 和/或 Bitbucket

android - 支持 Fragment 弹出动画不工作

java - 如何在 Android 中从 DialogFragment 获取数据到 MainActivity?

java - 如何为 Firebase 数据库异常添加内置类的无参数构造函数?

java - 使用 xs :any and mixed content 维护 JAXB 中的空白

java - Tomcat 和 Matlab 编译器运行时内存不足错误

android - 如何在 android studio 中运行多个 avd?

java 保存更改

android - 无法在 intellij idea 的设计选项卡中看到 View

java - 如何在底部导航 fragment (或抽屉导航)之间传递数据?