android 如何在Bundle中传递自定义对象?

wnvonmuf  于 2022-12-28  发布在  Android
关注(0)|答案(6)|浏览(229)

我正在尝试将我自己的自定义对象传递到bundle中:

Bundle b = new Bundle();
                STMessage message = (STMessage)a.getAdapter().getItem(position);
                b.putObject("message",message);

我得到错误:

The method putObject(String, Object) is undefined for the type Bundle
xoshrz7s

xoshrz7s1#

一种方法是让自定义对象实现Parcelable接口并使用Bundle.putParcelable/Bundle.getParcelable

lhcgjxsq

lhcgjxsq2#

模型类

package com.sam.bundleobjectpass;

import java.io.Serializable;

/**
 * Created by Samir on 31.8.2016.
 */
public class Model implements Serializable {
    private String name;
    private String surName;
    private int age;

    public Model(String name, String surName, int age) {
        this.name = name;
        this.surName = surName;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    
    public String getSurName() {
        return surName;
    }

    public int getAge() {
        return age;
    }

}

主要活动

public class MainActivity extends AppCompatActivity {

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

        Model model = new Model("Sam", "Sami",32);
        
        Intent i = new Intent(MainActivity.this, ReceiverActivity.class);
        i.putExtra("Editing", model); // sending our object. In Kotlin is the same
        startActivity(i);

    }
}

接收器活动

public class ReceiverActivity extends Activity {

    TextView txt_name;
    TextView txt_surname;
    TextView txt_age;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);

        txt_name = (TextView)findViewById(R.id.txt_name);
        txt_surname = (TextView)findViewById(R.id.txt_surname);
        txt_age = (TextView)findViewById(R.id.txt_age);
        // receiving our object
        Model model = (Model) getIntent().getSerializableExtra("Editing");

        txt_name.setText(model.getName());
        txt_surname.setText(model.getSurName());
        txt_age.setText(""+model.getAge());

    }
}

//Kotlin

val model: ProgramModel? = intent.getSerializableExtra("Editing") as ProgramModel?
        model?.let { // means if not null or empty
            txt_act_daily_topic.text = it.title
        }
vfh0ocws

vfh0ocws3#

由于使用Parsable是为高性能IPC传输而设计的,正如在一些评论中提到的那样,我尝试使用不同的方法。
我的方法使用谷歌的GSON库。
示例

public class Person{
    private String name;
    private int age;
    // Getter and Setters omitted
}

你可以在实用类中有一个返回Gson示例的方法,这是为了干净的代码和组织。我将使用GsonBuilder,以防有人注册自定义适配器。

public class Utils {
    private static Gson gson;
    
    public static Gson getGsonParser() {
        if(null == gson) {
            GsonBuilder builder = new GsonBuilder();
            gson = builder.create();
        }
        return gson;
    }
}

关键时刻!
推杆

Bundle args = new Bundle();
String personJsonString = Utils.getGsonParser().toJson(person);
args.putString(PERSON_KEY, personJsonString);

获取

Bundle args = getArguments();
String personJsonString = args.getString(PERSON_KEY);
Person person= Utils.getGsonParser().fromJson(personJsonString, Person.class);

目前我还不知道这种方法的性能限制,但它工作得很好

6jygbczu

6jygbczu4#

使自定义对象可打包或可序列化,然后使用putParcelable或putSerializable。
根据对象的复杂性,其中一个可能更容易。

qaxu7uf2

qaxu7uf25#

正如Ryan所说。另外,如果您只想在软终止时传递一个对象,请考虑使用onRetainConfigurationInstance和getLastNonConfigurationInstance来传递可序列化对象。整个对象树必须是可序列化的。如果您通过Intent传递对象,请考虑稍后在架构稳定后将对象代码重构为可解析代码。最后,在将对象存储到Bundle中时,考虑使用类的完全限定名,如下所示:

inPWState= (PasswordState) getIntent().getSerializableExtra("jalcomputing.confusetext.PasswordState");

希望能有所帮助JAL

w1jd8yoj

w1jd8yoj6#

如果将对象类设置为可序列化的,则会产生效果

class your_data_class implements Serializable

相关问题