Как я могу получить данные из счетчика и обработать их? - PullRequest
0 голосов
/ 13 сентября 2018

Это часть моего кода, которая пошла не так (я пропустил объявление всех переменных, чтобы сделать его кратким): мне нужно создать два счетчика и извлечь из них значения, скажем, value1 и value2.Затем мне нужно вычислить что-то со значением1 и значением2, и вывод должен отображаться на экране.Мне нужно, чтобы этот вывод обновлялся всякий раз, когда я выбирал (новый) элемент из счетчика.Тем не менее, мой код не передает значение из счетчика в мой код 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_width="252dp"
    android:layout_height="46dp"
    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_width="250dp"
    android:layout_height="41dp"
    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_width="wrap_content"
    android:layout_height="17dp"
    android:layout_marginStart="44dp"
    android:layout_marginTop="36dp"
    app:layout_constraintStart_toEndOf="@+id/TargetSalary"
    app:layout_constraintTop_toBottomOf="@+id/newCity" />

Это logcat после того, как я добавил spinner.setOnItemSelectedListener (this);

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 ComponentInfo{edu.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) 

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Пожалуйста, добавьте ниже строки в методе onCreate(),

spinner1.setOnItemSelectedListener(this);
spinner2.setOnItemSelectedListener(this);

без них, счетчик не может прослушивать событие щелчка.

0 голосов
/ 13 сентября 2018

Измените получение выбранного значения внутри 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
0 голосов
/ 13 сентября 2018

Вот пример использования Spinner в Android

         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) {
            }
        });
...