繁体   English   中英

将多个微调器的总值从一个片段传递到另一个片段的文本视图

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

所以我需要从多个微调器中获取值以将其求和并将其传递给另一个片段。 总值的传递会在点击“下一步”按钮时传递。 目前,我有一个 TextView 设置为接收总值,但我不知道如何将总值从一个片段传递到另一个片段。

我试过这个但是

这是我尝试执行的代码,用于总结从 4 个微调器检索到的值并将该值传递给另一个片段并将其设置到我的 TextView (score_result)。

*我修改了我的片段 1 和 2 但仍然有 java.lang.NullPointerException 的问题:尝试在空对象引用上调用虚拟方法 'android.view.View android.widget.Spinner.findViewById(int)'

主要活动:

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();
    }
}

片段 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) {
    }
}

片段 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;
    }
}

可以有几种方法。

  • 使用常数。 当然,这不是一个理想的解决方案。
  • 使用接口。 将总和设置为 Activity 中的变量,然后使用第二个片段内的接口获取值。
  • 在两个片段中使用相同的 viewModel。 AbcViewModel abcViewModel = new ViewModelProvider(requireActivity()).get(AbcViewModel.class)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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