【问题标题】:Pass list of data (object) between activites in Andriod在Android中的活动之间传递数据(对象)列表
【发布时间】:2021-02-11 12:40:12
【问题描述】:

我有一个类Dice 实现Parcelable,如下所示

import android.os.Parcel;
import android.os.Parcelable;


public class Dice implements Parcelable {

    int mDiceNumber;
    boolean mDiceClicked = false;


    public Dice(int mDiceNumber, boolean diceClicked) {
        this.mDiceNumber = mDiceNumber;
        mDiceClicked = diceClicked;
    }

    protected Dice(Parcel in) {
        mDiceNumber = in.readInt();
        mDiceClicked = in.readByte() != 0;
    }

    public static final Creator<Dice> CREATOR = new Creator<Dice>() {
        @Override
        public Dice createFromParcel(Parcel in) {
            return new Dice(in);
        }

        @Override
        public Dice[] newArray(int size) {
            return new Dice[size];
        }
    };

    public boolean isDiceClicked() {
        return mDiceClicked;
    }

    public void setDiceClicked(boolean diceClicked) {
        mDiceClicked = diceClicked;
    }

    public int getDiceNumber() {
        return mDiceNumber;
    }

    public void setDiceNumber(int diceNumber) {
        mDiceNumber = diceNumber;
    }


    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(mDiceNumber);
        dest.writeByte((byte) (mDiceClicked ? 1 : 0));
    }
}

我还有两个活动,我的 MainActivitySecondActivity。在 MaiActivity 我有一个我的类 Dice 数组

private Dice[] mDice = new Dice[]{
            new Dice(1, false),
            new Dice(2, false),
            new Dice(3, false),
            new Dice(4, false),
            new Dice(5, false),
            new Dice(6, false)
    };

我希望能够将我的整个骰子数组传递给我的 SecondActivity

这是我到目前为止所做的:

MainActivity中:

 Intent intent = new Intent(MainActivity.this, SecondActivity.class);
 intent.putExtra("Dices", mDice);
 startActivity(intent);

SecondActivity中:

 Dice mDice[] = getIntent().getParcelableExtra("Dices");

 TextView textView = (TextView) findViewById(R.id.Text1);
 textView.setText(mDice.getDiceNumber());

但它崩溃了。我知道如何传递一个对象,它只是一个对象而不是整个数组。但是每当我尝试传递整个数组时,它都会崩溃。我也试过

Dice mDice[] = getIntent().getParcelableArrayExtra()("Dices");
//and also with defining my mDice[] as Parcelable like this
Parcelable mDice[] = getIntent().getParcelableArrayExtra()("Dices");

但没有运气。请帮帮我!

编辑:

我尝试将我的Dice mDice[] 更改为Parcelable mDice[],现在我可以打开我的第二个活动而不会导致应用程序崩溃。但是我无法检索我的值,因为我的 mDice[] 由于某种原因没有 mDice[0].getDiceNumber()mDice[0].isDiceClicked() 方法。

SecondActivity中:

 Parcelable mDice[] = getIntent().getParcelableExtra("Dices");

 TextView textView = (TextView) findViewById(R.id.Text1);
 textView.setText(mDice[0].getDiceNumber()); // here I get an error saying Cannot resolve method 'getDiceNumber' in 'Parcelable'

【问题讨论】:

  • But it crashes 堆栈跟踪是什么,请将您的日志添加到您的问题中
  • 另外,你的问题与android studio没有任何关系,除了你使用它来开发你的应用程序,所以没有必要使用标签
  • 你应该使用putParcelableArrayListExtra而不是putExtra
  • 所以我试过这样:Parcelable mDice[] = getIntent().getParcelableArrayExtra("Dices"); 并且它启动了其他活动而不会崩溃。现在的问题是我无法让我的 Dice 类中的属性出现在我的 secondactivity 中。当我尝试mDice[0]. 时,没有getdicenumber()isdiceclicked()
  • @a_local_nobody

标签: java android android-activity parcelable


【解决方案1】:

下面是问题所在的行;

textView.setText(mDice.getDiceNumber())

一定是下面这样的;

textView.setText(mDice[0].getDiceNumber())

编辑:

要回答您更新的问题,

您正在尝试从 Parcelable[] 数组中获取必填字段。您必须将其实际转换为 Dice Object。

例子:

Parcelable[] dices = 
getIntent().getExtras().getParcelableArray("Dices");
Dices[] newDices = new Dice[dices.length];
for (int i = 0 ; i < dices.length; i++) {
   newDices[i] = (Dice)dices[i];
   newDices[i].getDiceNumber() // This will give you the result
}

【讨论】:

  • 请使用您的代码格式。
  • @ʍѳђઽ૯ท 嗨,这不起作用,因为我使用 Parcelable mDice[] = getIntent().getParcelableArrayExtra()("Dices");,所以在尝试编写 mDice[0].getDiceNumber() 时出现错误提示“无法解析 'Parcelable' 中的方法 'getDiceNumber'”
  • @Mohammed,请让你的变量privateprivate int mDiceNumber; private boolean mDiceClicked = false;
  • @Sohail 我做了,但没有帮助。请检查我编辑的问题。
  • @Mohammed,请查看我更新的答案。让我知道,如果它适合你
【解决方案2】:

我建议你使用 Gson()。

在您的 FirstActivity 中:

 String strDice = new Gson().toJson(listOfStickerObject);

intent.putExtra("Dices", mDice);

>>Get the value From Second Activity:
Gson gson = new Gson();
String strDice = getIntent().getStringExtra("Dices");
Type listType = new TypeToken<List<Dice>>(){}.getType();
List<Dice> dice= gson.fromJson(jsonOutput, listType);

【讨论】:

    猜你喜欢
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多