簡體   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