简体   繁体   中英

Passing the total value from multiple spinner from a fragment to textview of another fragment

So I need to get the value from multiple spinner to sum it up and pass it to another fragment. The passing of the total value will be passed when the "next" button is clicked. At the moment, i have one TextView set to receive the total value but i can't figure out how to pass the total value from one fragment to another.

I tried this but

This is my code that i tried to do to sum up the value retrieved from 4 spinners and pass the value to another fragment and set it to my TextView (score_result).

*I revised my Fragment 1 and 2 but still have the problem of java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.widget.Spinner.findViewById(int)' on a null object reference

MainActivity:

public class MainActivity extends AppCompatActivity{

    private AppBarConfiguration appBarConfiguration;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        com.example.perceivedstressscale.databinding.ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        setSupportActionBar(binding.toolbar);

        NavController navController = Navigation.findNavController(this,  R.id.nav_host_fragment_content_main);
        appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build();
        NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_status) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

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

Fragment 1:

public class FirstFragment extends Fragment implements AdapterView.OnItemSelectedListener{
    private FragmentFirstBinding binding;
    String selectedSpinnerItemValue;
    Spinner spinner1,spinner2,spinner3;

    //,spinner4,spinner5,spinner6,spinner7,spinner8,spinner9,spinner10;

    @Override
    public View onCreateView( @NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        binding = FragmentFirstBinding.inflate(inflater, container, false);
        return binding.getRoot();
    }

    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        
        binding.buttonFirst.setOnClickListener(view1 -> {
            Bundle bundle = new Bundle();
            selectedSpinnerItemValue=valueSum(spinner1,
                    spinner2,
                    spinner3);
            bundle.putString("selectedSpinnerItemKey", selectedSpinnerItemValue);

            Fragment fragment = FirstFragment.newInstance();
            fragment.setArguments(bundle);

            FragmentTransaction transaction = requireActivity().getSupportFragmentManager().beginTransaction();
            transaction.replace(R.id.score_result, fragment);

            NavHostFragment.findNavController(FirstFragment.this).navigate(R.id.action_FirstFragment_to_SecondFragment,bundle);
        });
    }

    private static Fragment newInstance() {
        return new FirstFragment();
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        binding = null;
    }

    public String valueSum(Spinner i1,Spinner i2,Spinner i3){
        int total, int1,int2,int3;

        ArrayAdapter adapter=new ArrayAdapter(getContext(), android.R.layout.simple_spinner_dropdown_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        i1.findViewById(R.id.spinner1);
        i1.setAdapter(adapter);
        i1.setOnItemSelectedListener(this);
        i1.getSelectedItem();
        i2.findViewById(R.id.spinner2);
        i2.setAdapter(adapter);
        i2.setOnItemSelectedListener(this);
        i2.getSelectedItem();
        i3.findViewById(R.id.spinner3);
        i3.setAdapter(adapter);
        i3.setOnItemSelectedListener(this);
        i3.getSelectedItem();

        int1=Integer.parseInt(String.valueOf(i1));
        int2=Integer.parseInt(String.valueOf(i2));
        int3=Integer.parseInt(String.valueOf(i3));
        total=int1+int2+int3;
        return String.valueOf(total);
    }

    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
        String item=adapterView.getItemAtPosition(i).toString();
        Toast.makeText(adapterView.getContext(), item,Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onNothingSelected(AdapterView<?> adapterView) {
    }
}

Fragment 2:

public class SecondFragment extends Fragment {

    private FragmentSecondBinding binding;

    @Override
    public View onCreateView(
            @NonNull LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState
    ) {

        binding = FragmentSecondBinding.inflate(inflater, container, false);

        //set to receive total value
        if (getArguments() != null)
        {
            String itemFromFirstFragment = getArguments().getString("selectedSpinnerItemKey");
            TextView result=requireView().requireViewById(R.id.score_result);
            result.setText(itemFromFirstFragment);
        }

        return binding.getRoot();
    }

    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        binding.buttonSecond.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                NavHostFragment.findNavController(SecondFragment.this)
                        .navigate(R.id.action_SecondFragment_to_FirstFragment);
            }
        });
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        binding = null;
    }
}

There can be several ways.

  • Using a constant. Surely, which is not an ideal solution.
  • Using interfaces. Setting the sum into a variable in the Activity, then using an interface inside the second fragment to get the value.
  • Using same viewModel inside both fragments. AbcViewModel abcViewModel = new ViewModelProvider(requireActivity()).get(AbcViewModel.class) .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM