如何从微调器中检索数据并进行处理?
Posted
技术标签:
【中文标题】如何从微调器中检索数据并进行处理?【英文标题】:How can I retrieve data from spinner and process it? 【发布时间】:2019-02-17 17:22:06 【问题描述】:这是我的代码出错的部分(我省略了所有变量声明以使其简短):我需要创建两个微调器并从中检索值,例如 value1 和 value2。然后我需要用 value1 和 value2 计算一些东西,输出应该显示在屏幕上。每当我从微调器中选择一个(新)项目时,我都需要更新此输出。但是,我的代码根本没有将微调器中的值传递给我的 java 代码。谁能帮我吗?非常感谢!
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sdpsalary_comp);
//create a spinner called Spinner1
Spinner1= (Spinner) findViewById(R.id.spinner1);
ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(this,
R.array.cities, android.R.layout.simple_spinner_item);
//cities is defined as string-array in XML
adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
Spinner1.setAdapter(adapter1);
value1 = Spinner1.getSelectedItem().toString();
//create another spinner called Spinner2
Spinner2 = (Spinner) findViewById(R.id.spinner2);
ArrayAdapter<CharSequence> adapter2 = ArrayAdapter.createFromResource(this,
R.array.cities, android.R.layout.simple_spinner_item);
adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
Spinner2.setAdapter(adapter2);
value2 = Spinner2.getSelectedItem().toString();
// I need to update the output field whenever I changed the content from the spinners
public void onItemSelected(AdapterView<?> parent, View view,
int pos, long id)
String output;
switch(parent.getId())
case R.id.spinner1:
value1 = Spinner1.getSelectedItem().toString();
Output = ((TextView)findViewById(R.id.out));
output=Target(base, value1, value2, cost);
//variables base, cost and method Target() are defined somewhere else
Output.setText(output);
break;
case R.id.spinner2:
value2 = Spinner2.getSelectedItem().toString();
Output = ((TextView)findViewById(R.id.out));
output=Target(base, value1, value2, cost); //base and cost are defined somewhere else
Output.setText(output);
break;
public void onNothingSelected(AdapterView<?> parent)
这是我的 XML 的一部分:
<Spinner
android:id="@+id/spinner1"
android:layout_
android:layout_
android:layout_marginTop="32dp"
android:spinnerMode="dropdown"
app:layout_constraintBottom_toTopOf="@+id/NewCity"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.272"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/CurrentCity"
app:layout_constraintVertical_bias="0.293" />
<Spinner
android:id="@+id/spinner2"
android:layout_
android:layout_
android:layout_marginBottom="16dp"
android:layout_marginEnd="16dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:spinnerMode="dropdown"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.196"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/NewCity"
app:layout_constraintVertical_bias="0.191" />
<TextView
android:id="@+id/out"
android:layout_
android:layout_
android:layout_marginStart="44dp"
android:layout_marginTop="36dp"
app:layout_constraintStart_toEndOf="@+id/TargetSalary"
app:layout_constraintTop_toBottomOf="@+id/newCity" />
这是我添加 spinner.setOnItemSelectedListener(this); 后的 logcat;
09-10 00:25:37.938 7797-7797/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: edu.gatech.seclass.sdpsalarycomp, PID: 7797
java.lang.RuntimeException: Unable to start activity ComponentInfoedu.gatech.seclass.sdpsalarycomp/edu.gatech.seclass.sdpsalarycomp.SDPSalaryCompActivity: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.Arrays$ArrayList.get(Arrays.java:66)
at android.widget.ArrayAdapter.getItem(ArrayAdapter.java:344)
at android.widget.AdapterView.getItemAtPosition(AdapterView.java:783)
at edu.gatech.seclass.sdpsalarycomp.SDPSalaryCompActivity.onCreate(SDPSalaryCompActivity.java:60)
at android.app.Activity.performCreate(Activity.java:6237)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
【问题讨论】:
值是否已填充到微调器中? 您是否将您的Spinner
初始化为onItemSelected
? Spinner1.setOnItemSelectedListener(this);
@SushantSomani 是的,我可以从 AVD 中单击并更改微调器中的值,但该值不会传递到我的 java 代码中。
@Tepits 你的意思是我应该在 value1 = Spinner1.getSelectedItem().toString() 之前或之后添加那行代码吗?没有我的应用程序崩溃。
@JieyuYou - 在onCreate
上的findViewById()
之后对其进行初始化。
【参考方案1】:
像这样更改onItemSelected
中所选值的获取方式:
// Change this
value1 = Spinner1.getSelectedItem().toString();
// to this
value1 = String.valueOf(parent.getItemAtPosition(pos));
还有你的Output
TextView的初始化,你可以在onCreate
上设置。
Output = ((TextView)findViewById(R.id.out)); // move this on your onCreate
【讨论】:
仍有 IndexOutofBoundsException 问题 在您的onCreate
方法中删除您的 value1 = Spinner1.getSelectedItem().toString();
。因为您没有在 onCreate
上设置任何选定项目。
你是对的,我的应用程序不断崩溃的原因是变量“base”的初始(默认)值。添加 if() 语句后,我的应用程序可以正常启动。谢谢!【参考方案2】:
请在onCreate()
方法中添加以下行,
spinner1.setOnItemSelectedListener(this);
spinner2.setOnItemSelectedListener(this);
没有这些,spinner 无法监听点击事件。
【讨论】:
我试过了,但它崩溃了.. IndexOutOfBOundsException 我刚刚添加了它 检查 R.array.cities 是否真的有项目【参考方案3】:这是在 Android 中使用 Spinner 的示例
String[] spinnerData=new String["A","B","C"];
ArrayAdapter<String> itemsArray=new ArrayAdapter<String>(getContext(),android.R.layout.simple_spinner_dropdown_item,spinnerData);
Spinner spinner1=(Spinner)view.findViewById(R.id.spinner1);
spinner1.setAdapter(itemsArray);
spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l)
String selectedItem=String.valueOf(adapterView.getItemAtPosition(i));
@Override
public void onNothingSelected(AdapterView<?> adapterView)
);
Spinner spinner2=(Spinner)view.findViewById(R.id.spinner2);
spinner2.setAdapter(itemsArray);
spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l)
String selectedItem=String.valueOf(adapterView.getItemAtPosition(i));
@Override
public void onNothingSelected(AdapterView<?> adapterView)
);
【讨论】:
谢谢,但你能指出我的错误吗?这对我有很大帮助。 @JieyuYou 现在您已经在 selectedItem 变量中选择了值。你能分享一下你想通过哪个java代码吗? 不,value1 和 value2 保持不变(即来自微调器的第一个值) 我已经编辑了我的答案,我为他们两个设置了 2 个不同的 setOnItemSelectedListener。 @JieyuYou @JieyuYou 的实现比这个方便多了。只需为两个微调器创建一个函数onItemSelected
,然后它将基于它们的 id。以上是关于如何从微调器中检索数据并进行处理?的主要内容,如果未能解决你的问题,请参考以下文章