如何从微调器中检索数据并进行处理?

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 初始化为onItemSelectedSpinner1.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));

还有你的OutputTextView的初始化,你可以在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。

以上是关于如何从微调器中检索数据并进行处理?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Guice 的注入器中检索带注释的实例?

如何从 Forge Viewer 中检索文件名?

从分类器中检索训练特征名称列表

在组件中检索到响应后,加载微调器未隐藏

我可以使用两个微调器从我命名为 dist.js 的 javascript 文件中检索数据吗

使用 Powershell 从任务管理器中检索信息