Условный оператор в приложении для Android работает не так, как ожидалось

#java #android

#java #Android

Вопрос:

В настоящее время я пытаюсь добавить условие, основанное на том, что пользователь выбрал в раскрывающемся списке. Если выбран первый элемент, то данные, введенные в TextView, будут умножены на 34, в противном случае второй элемент будет умножен на 18. Пока я могу проверить, что первый выбор работает так, как должен, но он не распознает второй выбор. Кто-нибудь может объяснить мне, как правильно решить это условие? вот как выглядит мой код.

 public class CatalinaFerryTickets extends AppCompatActivity{
    String[] ferryRoutes = new String[]{"To Catalina Island", "To Long Beach"};
    private Button renderBtn;
    EditText handleData;
    TextView displayData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
//      RENDER SPINNER TO DEVICE

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_catalina_ferry_tickets);
        final Spinner spin=findViewById(R.id.mySpinner);
        final ArrayAdapter<String> myAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, ferryRoutes);
        spin.setAdapter(myAdapter);

        renderBtn=findViewById(R.id.button);
        displayData=findViewById(R.id.textView);
        displayData.setMovementMethod(new ScrollingMovementMethod());

        renderBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                handleData=findViewById(R.id.editInput);
                int ticketAmount = Integer.parseInt(handleData.getText().toString());
                int total;

//              FAULTY CONDITIONAL STATEMENT

                if (ferryRoutes[0] == "To Catalina Island"){
                    total = ticketAmount * 34;
                    displayData.setText(Integer.toString(total));
                }
                else{
                    total = ticketAmount * 18;
                    displayData.setText(Integer.toString(total));
                }

            }
        });

    }

}
  

Ответ №1:

Вы не проверяете, что выбрано, вы проверяете, какое значение находится в статическом массиве. Поэтому он всегда будет занимать одну ветвь. Если вы хотите что-то сделать на основе выбора счетчика, вам нужно фактически запросить у счетчика то, что выбрано.

Ответ №2:

Проблема здесь в том, что ferryRoutes массив никогда не связан с раскрывающимся компонентом.
Из-за этого условие

 if (ferryRoutes[0] == "To Catalina Island")
  

всегда будет, true и else блок никогда не будет выполнен.

Кроме того, никогда не сравнивайте String (ы), используя оператор равенства ссылок ( == ). Используйте equals

 if ("To Catalina Island".equals(ferryRoutes[0]))
  

Возможно, вам повезет, если String (ы) будут интернированы, и это заставит оператор равенства работать. Но не делайте этого, как правило.