Я пытаюсь создать простой андроид, который должен симулировать изучение словарного запаса с помощью карточек. чтобы добраться до финального приложения, я собираюсь шаг за шагом добавлять функциональность и сложность, изучая новые вещи и добавляя новые.
Я собираюсь рассказать вам, где я застрял, но сначала, вот что должно делать мое приложение, пока (я все еще далеко, далеко от того места, где я бы хотел, чтобы вы пошли, но вы не понимаете, не надо об этом думать.):
На этом этапе приложение должно сделать следующее:
1) в MainActivity:
a) Создайте массив из 3 экземпляров реализации
Интерфейс Parcelable (класс VocCard реализует Parcelable), VocCard []
voc1, в этом случае. Поскольку класс VocCard реализует Parcelable,
Получена посылка для строительства 3 экземпляров.
- б) Создайте ArrayList типа VocCard с именем vocCardList и добавьте
все 3 элемента voc1 to vocCardList.
- в) Создать экземпляр кнопки запуска, которая создает намерение для
запуск 2-го действия под названием PracticeActivity при нажатии.
- d) Добавьте ArrayList vocCardList с Parcelable к
намерение.
2) в практике деятельности
- a) Получить намерение, созданное MainActivity.
- b) Извлечь ArrayList vocCardList из намерения
- в) Получить любой элемент vocCardsList и назначить переменную типа
VocCard к нему.
- d) Получить значение назначенного экземпляра Voccard, вызвав его
методы.
- e) Показать это значение, установив TextView в String значения
значение.
- f) Создать кнопку nextButton, которая создает намерение начать
2-е упражнение снова ActivityActivity, как некая рекурсия.
- g) Добавить ArrayList vocCardList с разрешением на намерение.
- h) повторите 2) a) -g), пока приложение не закроется с помощью значка закрытия.
В данный момент я застрял на 2) c) , поскольку приложение работает только для индекса 0. Только VocCard card0 = vocCardList1.get (0); works, vocCardList1.get (1) или vocCardList1.get (2); нет, несмотря на то, что 1 и 2 находятся в границах ArrayList.
Как ни странно, сообщение об исключении Runtime для использования индекса 1 и индекса 2 не совпадает:
с vocCardList1.get (1): java.lang.ClassCastException: java.lang.String cannot be cast to com.undiclosed.smartcards.VocCard
с vocCardList1.get (2): java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.undisclosed.smartcards.VocCard.returnVocForeign()' on a null object reference
Вопрос:
Почему я не могу получить доступ к элементам ArrayList так, как я ожидал? Когда я искал в Интернете, я, вероятно, искал не те вещи.
MainActivity.java:
package com.undisclosed123.smartcards;
import android.content.Intent;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private List<VocCard> vocCardList;
private String[] voc_f = {"bread","apple","water"};
private String[] voc_n = {"pain","pomme","eau"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Create VocCards and add to List
vocCardList = new ArrayList<VocCard>();
VocCard[] voc1 = new VocCard[3];
Parcel in = Parcel.obtain();
for(int i = 0; i < 3; i++){
voc1[i] = new VocCard(in);
voc1[i].setVocForeign(voc_f[i]);
voc1[i].setVocNative(voc_n[i]);
vocCardList.add(voc1[i]);
}
// Create Intent and assign the parcelable List for sending to second activity on btn click
Button startBtn = (Button) findViewById(R.id.button);
startBtn.setOnClickListener(new View.OnClickListener() {
@Override
@SuppressWarnings("unchecked")
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, PracticeActivity.class);
intent.putParcelableArrayListExtra("voc1",(ArrayList)vocCardList);
getApplicationContext().startActivity(intent);
}
});
}
}
и ниже, PracticeActivity.java:
(Извините за большие разделы, которые закомментированы, я подумал, что это может помочь сообщить о моих дальнейших намерениях для этого класса)
package com.undisclosed123.smartcards;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.ArrayList;
public class PracticeActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_practice);
// Get the Intent that started this activity and extract the string
Intent intent = getIntent();
final ArrayList<VocCard> vocCardList1 = intent.getParcelableArrayListExtra("voc1"); //
//Get the Data from the VocCards
//VocCard card4count = vocCardList1.get(2);
// card4count.increaseCount();
//int count = card4count.getCount();
/* if(count >= vocCardList1.size()){
// TODO
//Create new intent for EndPracticeActivity
//makeshift statement
count--;
}*/
VocCard card0 = vocCardList1.get(2);
// VocCard card1 = vocCardList1.get(1);
String test1 = card0.returnVocForeign();
// card0.increaseCount();
// String test1 = "test1";
//Make a TextView display the transfered String
TextView textView = findViewById(R.id.textView);
textView.setText(test1);
//Create another intent that recalls same activity recursively
Button nextBtn = (Button) findViewById(R.id.button2);
nextBtn.setOnClickListener(new View.OnClickListener() {
@Override
@SuppressWarnings("unchecked")
public void onClick(View v) {
Intent intent = new Intent(PracticeActivity.this, PracticeActivity.class);
intent.putParcelableArrayListExtra("voc1",(ArrayList)vocCardList1);
getApplicationContext().startActivity(intent);
}
}); /**/
}
}
И наконец, VocCard.java:
package com.undisclosed123.smartcards;
import android.os.Parcel;
import android.os.Parcelable;
public class VocCard implements Parcelable {
private String voc_foreign;
private String voc_native;
private boolean learned;
private int error_level;
private static int counter;
public String returnVocForeign(){
return voc_foreign;
}
public void setVocForeign(String voc_f){
voc_foreign = voc_f;
}
public String returnVocNative(){
return voc_native;
}
public void setVocNative(String voc_n){
voc_native = voc_n;
}
public boolean checkLearned(){
return learned;
}
public int getErrorLevel(){
return error_level;
}
public void makeLearned(){
learned = true;
}
public void increaseErrorLevel(){
error_level++;
}
public int getCount(){
return counter;
}
public void increaseCount(){
counter++;
}
public VocCard(Parcel in) {
voc_foreign = in.readString();
voc_native = in.readString();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(voc_foreign);
dest.writeString(voc_native);
dest.writeInt((Boolean) learned ? 1 : 0);
dest.writeInt(error_level);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<VocCard> CREATOR = new Creator<VocCard>() {
@Override
public VocCard createFromParcel(Parcel in) {
return new VocCard(in);
}
@Override
public VocCard[] newArray(int size) {
return new VocCard[size];
}
};
}