Превращение Java в приложение для Android. Добавлены сбои elif и project при загрузке

#java #android #android-studio

#java #Android #android-studio

Вопрос:

В настоящее время я работаю над превращением старого кода Java в работающее приложение для Android. Я использовал JavaFX для создания программы изначально, но это не будет работать для Android.

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

Это код Android на Github.

Это исходный код JavaFX.

 package com.example.afinal;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class MainActivity extends AppCompatActivity {
     private ArrayList<MuscleItem> mMuscleList;
     private MuscleAdapter mAdapter;
     private ArrayList<RepItem> mRepList;
     private RepAdapter mRepAdapter;
     private final List<String> backList = new ArrayList<>();
     private final List<String> chestList = new ArrayList<>();
     private final List<String> legList = new ArrayList<>();

     Button btnWorkout;

    private String selectMuscles(String[] arr) {
          return (Arrays.toString(arr));
   }

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btnWorkout = findViewById(R.id.btnWorkout);
    btnWorkout.setOnClickListener(view -> {
        Intent intent_one = new Intent(MainActivity.this, SecondActivity.class);
        startActivity(intent_one);

    });

    initList();
    Spinner spinnerMuscles = findViewById(R.id.spinner_muscles);
    mAdapter = new MuscleAdapter(this, mMuscleList);
    spinnerMuscles.setAdapter(mAdapter);
    spinnerMuscles.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            MuscleItem clickedItem = (MuscleItem) parent.getItemAtPosition(position);
            String clickedMuscleName = clickedItem.getmuscleName();
            Toast.makeText(MainActivity.this, clickedMuscleName   " selected", Toast.LENGTH_SHORT).show();


            //This causes the program to crash.
            /*
            String cMuscle = (String) parent.getItemAtPosition(position);
            String muscleChoice = "";
            //selection trees to figure out which muscle group and which type
            //of workout
            if (cMuscle.equalsIgnoreCase("Chest Day")) {
                muscleChoice = selectMuscles(chestDay());
            } else if (cMuscle.equalsIgnoreCase("Leg Day")) {
                muscleChoice = selectMuscles(legDay());
            } else if (cMuscle.equalsIgnoreCase("Back Day")) {
                muscleChoice = selectMuscles(backDay());
            }
             */
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
        }
    });

    initList();
    Spinner spinnerRep = findViewById(R.id.spinner_repetition);
    mRepAdapter = new RepAdapter(this, mRepList);
    spinnerRep.setAdapter(mRepAdapter);
    spinnerRep.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            RepItem clickedItemRep = (RepItem) parent.getItemAtPosition(position);
            String clickedMuscleName = clickedItemRep.getrepName();
            Toast.makeText(MainActivity.this, clickedMuscleName   " selected", Toast.LENGTH_SHORT).show();

            //THis causes it to crash as well
            /*
            String cRep = (String) parent.getItemAtPosition(position);
            String repChoice = "";
            if (cRep.equalsIgnoreCase("Lose Weight")) {
                repChoice = "5 sets of 20 reps, with 1 minute of cardio between";
            } else if (cRep.equalsIgnoreCase("Gain muscle mass")) {
                repChoice = "4 sets of 10 reps, or 5 sets of 8 reps";
            } else if (cRep.equalsIgnoreCase("Gain strength")) {
                repChoice = "5 sets of 3 reps, increasing the weightn"
                          "until you can no longer lift the weight.";
            }
             */
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
        }
    });
}

private void initList() {
    mMuscleList = new ArrayList<>();
    mMuscleList.add(new MuscleItem("Back", R.drawable.back));
    mMuscleList.add(new MuscleItem("Chest", R.drawable.chest));
    mMuscleList.add(new MuscleItem("Legs", R.drawable.legs));


    mRepList = new ArrayList<>();
    mRepList.add(new RepItem("Gain muscle mass", R.drawable.mass));
    mRepList.add(new RepItem("Gain strength", R.drawable.strength));
    mRepList.add(new RepItem("Lose weight", R.drawable.weight));


}
    private String[] backDay() {
        if (backList.isEmpty()) {
            backList.add("Deadlift");
            backList.add("Pull Up");
            backList.add("Back Rows");
            backList.add("Bend-Over Barbell Rows");
            backList.add("Romanian Deadlift");
            backList.add("Front Squat");
            backList.add("Incline Dumbbell Row");
            backList.add("Chinup");
            backList.add("Trap-Bar Deadlift");
            backList.add("Alternating Dumbbell Row");
            backList.add("Inverted Row");
            backList.add("Swiss Ball Leg Curl");
            backList.add("Wide-Grip Pullup");
            backList.add("Landmine One-Arm Row");
            backList.add("Burpee");
            backList.add("Lying Lateral Raise");
            backList.add("Hang Clean");
        }
        return randomExercises(backList);
    }

    private String[] chestDay() {
        if (chestList.isEmpty()) {
            chestList.add("Bench Press");
            chestList.add("Incline Press");
            chestList.add("Dip");
            chestList.add("Flye");
            chestList.add("Reverse Flye");
            chestList.add("Supine Press");
            chestList.add("Chest Press Machine");
            chestList.add("Low-Incline Press");
            chestList.add("Speed Bench Press");
            chestList.add("Landmine Press");
            chestList.add("Floor Press");
            chestList.add("Prone Flye");
            chestList.add("Pullover");
            chestList.add("Plate Pressout");
            chestList.add("3-Way Flye");
            chestList.add("Pushup");
        }
        return randomExercises(chestList);
    }

    private String[] legDay() {
        if (legList.isEmpty()) {
            legList.add("Squat");
            legList.add("Leg Press");
            legList.add("Leg Extension");
            legList.add("Dumbbell Step Up");
            legList.add("Body Weight Calf Raises");
            legList.add("Walking Lunge");
            legList.add("Front Squat");
            legList.add("Bulgarian Split Squat");
            legList.add("Dumbbell Stepup");
            legList.add("Swiss Ball Leg Curl");
            legList.add("Single-Leg Romanian Deadlift");
            legList.add("Pause Squat");
            legList.add("Reverse Lunge");
            legList.add("Dumbbell Squat");
            legList.add("Kettlebell Swing");
            legList.add("Jump Squat");
            legList.add("Barbell Calf Raise");
        }
        return randomExercises(legList);
    }


    private String[] randomExercises(List<String> arr) {
        Collections.shuffle(arr);
        return arr.subList(0, 4).toArray(new String[3]);
    }
}
 

Вот ФАТАЛЬНАЯ ОШИБКА в журнале

2020-12-12 22:21:56.300 8022-8022/? E / AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основной процесс: com.example.afinal, PID: 8022 java.lang.ClassCastException: com.example.afinal.MuscleItem не может быть приведен к java.lang.Строка в com.example.afinal.MainActivity $ 1.onItemSelected(MainActivity.java:55) в android.widget.Выбран AdapterView.fireOnSelected(AdapterView.java: 957) в android.widget.Выбран AdapterView.dispatchOnItemSelected(AdapterView.java: 946) в android.widget.AdapterView.access$ 300 (AdapterView.java:55) в android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:910) на android.os.Handler.handleCallback(Handler.java:938) на android.os.Handler.DispatchMessage(Handler.java: 99) на android.os.Looper.loop(Looper.java: 223) на android.app.ActivityThread.main(ActivityThread.java:7656) в java.lang.reflect.Method.invoke(собственный метод) в com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

Комментарии:

1. Покажите нам трассировку стека. Это, вероятно, объяснит, почему он выходит из строя.

2. @StephenC Я новичок в Android. Я не знаком со stacktrace, поэтому я не уверен, как это сделать. Но я работаю над этим прямо сейчас. Я думаю, что нашел код ошибки в журнале. Я добавлю это в свой пост

3. Вы тоже новичок в Java? Это простое ClassCastException, как четко указано в stacktrace. И что с elif в названии вашего вопроса?

4. @Ridcully Да, я прошел курс по нему, и я пытаюсь освежить свои навыки после того, как не использовал его. Программа работает нормально, пока я не вставил код, который включал elif, поэтому я по какой-то причине обвинил elif, а не кастинг, у меня плохой туман в мозгу после заражения covid около месяца назад.

5. @Mpev — Используйте logcat для поиска трассировок стека; см. developer.android.com/games/optimize/crash

Ответ №1:

Каждый элемент в вашем адаптере является a MuscleItem , а не a String . Поэтому, когда вы пытаетесь привести результат getItemAtPosition() , генерируется исключение.

 //This causes the program to crash.
/*
String cMuscle = (String) parent.getItemAtPosition(position);
 

Похоже MuscleItem , у класса есть getmuscleName() метод; возможно, вы хотите использовать его вместо этого:

 MuscleItem clickedItem = (MuscleItem) parent.getItemAtPosition(position);
String cMuscle = clickedItem.getmuscleName();
 

Комментарии:

1. Это исправлено, спасибо! Между тем, чтобы не касаться Java в течение года, и туманом в мозгу от covid, было очень сложно разобраться во всем этом.