Android Fragment中点击按钮获取Spinner 2当前选中值问题求助
问题分析与解决方案
嘿,我一眼就看出问题所在了——你获取Spinner2选中值的时机完全错了!
你现在是在onCreateView方法里直接初始化了from_unit1变量:
final String from_unit1 = spinner2.getSelectedItem().toString();
这行代码只会在Fragment创建视图的那一刻执行一次,拿到的是Spinner2的初始默认值,之后不管你怎么切换Spinner2的选项,这个变量都不会自动更新。所以点击按钮的时候,Toast自然只会显示最初的那个值。
解决办法
把获取Spinner2选中值的代码移到按钮的点击事件里面,这样每次点击按钮时,都会实时获取当前Spinner2选中的内容。
另外,我还注意到你代码里有几个小问题:
- 重复调用了
adapter1.setDropDownViewResource()多次,其实只需要调用一次就够了 - 变量命名可以更清晰(比如
adapter1、adapter2可以改成对应功能的名字,比如lengthAdapter、weightAdapter,方便后续维护)
修改后的完整代码
import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.Spinner; import android.widget.Toast; public class Convertor extends Fragment { public Convertor() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment final View view = inflater.inflate(R.layout.convertor_1, container, false); String[] values_conversion = {"Convert1", "Convert2"}; final Spinner spinner1 = view.findViewById(R.id.spinner1); final Spinner spinner2 = view.findViewById(R.id.spinner2); final Spinner spinner3 = view.findViewById(R.id.spinner3); // 初始化各个适配器,修正重复设置dropDown的问题 final ArrayAdapter adapter1 = ArrayAdapter.createFromResource(getActivity(), R.array.array1_array, android.R.layout.simple_spinner_item); adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); final ArrayAdapter adapter2 = ArrayAdapter.createFromResource(getActivity(), R.array.array2_array, android.R.layout.simple_spinner_item); adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); final ArrayAdapter adapter3 = ArrayAdapter.createFromResource(getActivity(), R.array.array3_array, android.R.layout.simple_spinner_item); adapter3.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); final ArrayAdapter adapter4 = ArrayAdapter.createFromResource(getActivity(), R.array.array4_array, android.R.layout.simple_spinner_item); adapter4.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner2.setAdapter(adapter1); spinner3.setAdapter(adapter3); ArrayAdapter<String> adapter = new ArrayAdapter<>(this.getActivity(), android.R.layout.simple_spinner_item, values_conversion); adapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line); spinner1.setAdapter(adapter); spinner1.setSelection(0); spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView<?> arg0, final View view, int position, long id) { switch (position) { case 0: spinner2.setAdapter(adapter1); spinner3.setAdapter(adapter3); break; case 1: spinner2.setAdapter(adapter2); spinner3.setAdapter(adapter4); break; } } @Override public void onNothingSelected(AdapterView<?> parent) { } }); final Button convert_btn = view.findViewById(R.id.convert_btn); convert_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 在这里实时获取Spinner2的当前选中值 String currentSelectedValue = spinner2.getSelectedItem().toString(); Toast toast = Toast.makeText(getContext(), currentSelectedValue, Toast.LENGTH_SHORT); toast.show(); } }); return view; } }
额外提示
如果之后需要把选中的字符串转换成对应数值,你可以:
- 在适配器里绑定数值和字符串(比如使用
ArrayAdapter<CustomObject>,自定义对象包含字符串和数值) - 或者根据选中的字符串,在点击事件里通过
switch或HashMap映射到对应的数值
内容的提问来源于stack exchange,提问作者SimonF
相关产品推荐
相关产品推荐

