如何使用一个适配器从多个微调器中检索单个选择?

时间:2019-04-20 11:39:45

标签: java android android-spinner

我正在构建一个小型单位转换应用程序,该应用程序利用两个微调器来选择从值和到值的a。这两个微调器在strings.xml中使用相同的适配器和相同的字符串数组。如何允许同时选择选定的微调框,同时将选定的值存储到两个单独的变量中?

我尝试使用if语句和一个switch,但是它们是条件语句和control语句,似乎并不能解决问题。可以单独选择微调框,这就是我想要的。但是,我无法弄清楚如何将包含值的变量传递给方法。

我也尝试过在两个变量上调用getSelectedItem()方法,但是这种方法似乎无法区分微调器。除此之外,它几乎可以按照我的预期工作,变量保留了选定的微调器值。
我还必须使用此setSelection()设置微调器位置,因为微调器在开始时为null并导致应用崩溃。

带微调器的适配器: spinnerFrom和spinnerTo变量是全局变量。

spinnerFrom = (Spinner) findViewById(R.id.spinnerDropdown);
spinnerTo = (Spinner) findViewById(R.id.spinnerDropdown2);

        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
                R.array.velocity_array, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_item);

        spinnerFrom.setAdapter(adapter);
        spinnerTo.setAdapter(adapter);
        spinnerFrom.setOnItemSelectedListener(this);
        spinnerTo.setOnItemSelectedListener(this);

如果陈述(第一次尝试)

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
{
        if(parent.getId() == R.id.spinnerDropdown)
        {
            spinner1 = Integer.parseInt(parent.getItemAtPosition(position).toString());
        }
        else if(parent.getId() == R.id.spinnerDropdown2)
        {
            spinner2 = Integer.parseInt(parent.getItemAtPosition(position).toString());
        }
}

getSelectedItem()(第二次尝试)

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
{
        spinnerFrom.setSelection(position);
        spinnerTo.setSelection(position);

        String values = "Spinner 1: " + spinnerFrom.getSelectedItem().toString() +
                "\nSpinner 2: " + spinnerTo.getSelectedItem().toString();

        resultDisplay.setText(values);
}

更新:当前代码

 @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

        if(parent.getId() == R.id.spinnerDropdown)
        {
            spinner1 =(xmlArray[position]);
        }
        else if(parent.getId() == R.id.spinnerDropdown2)
        {
            spinner2 =(xmlArray[position]);
        }

        convertUnits(spinner1, spinner2); <-- Line 82

 public void convertUnits(String spinner1, String spinner2)
    {
        if(spinner1.contains("Double") && spinner2.contains("Triple")) <-- Line 95
        {
           //conversion method
        }
        ...

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.contains(java.lang.CharSequence)' on a null object reference
        at com.example.courseproject.Velocity.convertUnits(Velocity.java:95)
        at com.example.courseproject.Velocity.onItemSelected(Velocity.java:82)

编辑:微调器可以工作,但这是我使用条件if语句的最初问题。 spinner2变量为null,我的应用程序崩溃。我需要两个变量。 我已经尝试过.equals和.contains,都没有解决nullpointer。

Edit2:我无法复制/粘贴调试器显示的内容,但是在第95行,spinner2显示为“ null”。看起来好像spinner2的值从不会在代码中的任何位置的开始null处改变,而spinner1却从未改变。

1 个答案:

答案 0 :(得分:0)

遵循以下代码以获得更好的视图来解决您的问题:

    public class MainActivity extends AppCompatActivity implements 
                  AdapterView.OnItemSelectedListener {
              Spinner spinnerFrom,spinnerTo;
              String[] menuArray;


            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                TextView textView=findViewById(R.id.text);

                spinnerFrom = (Spinner) findViewById(R.id.spinnerDropdown);
                spinnerTo = (Spinner) findViewById(R.id.spinnerDropdown2);

                menuArray = getResources().getStringArray(R.array.velocity_array);


                ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
                        R.array.velocity_array, android.R.layout.simple_spinner_item);
                adapter.setDropDownViewResource(android.R.layout.simple_spinner_item);

                spinnerFrom.setAdapter(adapter);
                spinnerTo.setAdapter(adapter);
                spinnerFrom.setOnItemSelectedListener(this);
                spinnerTo.setOnItemSelectedListener(this);
            }

            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
            {
                if(parent.getId() == R.id.spinnerDropdown)
                {
                  int  spinner1 = Integer.parseInt(menuArray[position]);
                }
                else if(parent.getId() == R.id.spinnerDropdown2)
                {
                  int  spinner2 = Integer.parseInt(menuArray[position]);
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        }

<string-array name="velocity_array">
        <item>1</item>
        <item>2</item>
        <item>3</item>
        <item>4</item>
    </string-array>