【问题标题】:Passing class ArrayList between intents在意图之间传递类 ArrayList
【发布时间】:2013-09-02 11:22:57
【问题描述】:

我创建了一个名为“Player”的类。

public class Player{
    public String name;
    public int score;
}

每次我单击一个按钮时,都会生成一个新的 TextView 以及一个新的 Player 类。这是代码:

private TextView createNewTextView (String text){
    final LayoutParams lparams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    final TextView newTextView = new TextView(this);

    newTextView.setLayoutParams(lparams);
    newTextView.setText(text);

    Player newPlayer = new Player();
    newPlayer.name = text;
    newPlayer.score = 0;
    players.add(newPlayer);
    zacniIgro.putExtra("players", (ArrayList<Player>) players);
    return newTextView;
}

这是正确的做法吗?我认为有一个小缺陷,因为每次单击按钮时,都会在“newPlayer”标签下添加一个新播放器。我该如何解决这个问题?

我的主要问题是这个;如何在第二个活动中“解包”ArrayList,以便我可以使用 ArrayList 的每个元素进行操作?我试过 getStringArrayListExtra() 但它不起作用。我也试过 getExtras() 但这也不起作用,因为它检索一个包。或者这是正确的方法?但是我该怎么处理这个捆绑包呢?

【问题讨论】:

  • 尝试实现Parceable,或者另一种方法是使用google的gson api并将您的对象转换为字符串格式的JSONObjects,并在您的活动之间发送一个字符串格式的JSONArray,因此,在目标 Activity 中,您将使用 gson api 轻松解析 JSONArray

标签: java android eclipse class arraylist


【解决方案1】:

“标签”newPlayer 只是一个局部变量的名称,每次运行该方法时总是不同的东西,所以这里没有问题。

当你在这里调用putExtra() 时,players 被解释为Serializable,所以对应的调用是getSerializableExtra("players")。然后必须将结果转换为ArrayList&lt;Player&gt;

要完成这项工作,您还必须使 Player 类可序列化。这里只需要实现接口Serializable即可。

【讨论】:

    【解决方案2】:

    更好的方法是使用Parcelable

    简单示例:

    public class Device implements Parcelable {
    
    private String name;
    private String hash;
    
    /**
     * Default private constructor.
     */
    public Device() {
    
    }
    
    public Device(final Parcel parcel) {
        super();
    
        readFromParcel(parcel);
    }
    
    public static final Parcelable.Creator<Device> CREATOR = new Parcelable.Creator<Device>() {
    
        @Override
        public Device createFromParcel(final Parcel source) {
            return new Device(source);
        }
    
        @Override
        public Device[] newArray(final int size) {
            return new Device[size];
        }
    };
    
    @Override
    public int describeContents() {
        return hashCode();
    }
    
    @Override
    public void writeToParcel(final Parcel parcel, final int flags) {
        parcel.writeString(name);
        parcel.writeString(hash);
    }
    
    private void readFromParcel(final Parcel parcel) {
        this.name = parcel.readString();
        this.hash = parcel.readString();
    }
    

    将您的对象置于这样的意图中:

    intent.putParcelableArrayListExtra("Key", YourObject);
    

    进入另一个屏幕:

    Intent intent = getIntent();
    intent.getParcelableArrayExtra("key");
    

    【讨论】:

      猜你喜欢
      • 2011-08-09
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      相关资源
      最近更新 更多