How to pass custom object in Bundle?

后端 未结 5 2002
太阳男子
太阳男子 2020-12-13 12:59

I am trying to pass my own custom object into a bundle:

Bundle b = new Bundle();
                STMessage message = (STMessage)a.getAdapter().getItem(positi         


        
相关标签:
5条回答
  • 2020-12-13 13:29

    Model Class

    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;
        }
    
    
    }
    

    MainActivity

    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);
    
        }
    }
    

    ReceiverActivity

    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
            }
    
    0 讨论(0)
  • 2020-12-13 13:29

    Make your custom object Parcelable or Serializable then use putParcelable or putSerializable.

    Depending on the complexity of your object one or other may be easier.

    0 讨论(0)
  • 2020-12-13 13:47

    One way is to have your custom object implement the Parcelable interface and use Bundle.putParcelable/Bundle.getParcelable

    0 讨论(0)
  • 2020-12-13 13:47

    As Ryan stated. Also if you only want to pass one object on a soft kill consider using onRetainConfigurationInstance and getLastNonConfigurationInstance to pass the serializable object. The entire object tree must be serializable. If you are passing the object via an intent, consider refactoring the object code to a Parceable code later, once the architecture has stabilized. Finally, consider using the fully qualified name of the class when storing the object into the Bundle as in:

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

    Hope that helps. JAL

    0 讨论(0)
  • 2020-12-13 13:48

    Since using Parsable is designed for high performance IPC transport as mentioned in some of the comments, I tried using a different approach.

    My approach uses GSON library by google.

    Example

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

    You can have a method in utility class that returns Gson instance, this is for the sake of clean code and organisation. I will use GsonBuilder incase someone what to register custom adapter.

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

    Moment of truth!

    PUT

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

    GET

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

    Currently I don't know the performance limitation of this approach. But it works just fine

    0 讨论(0)
提交回复
热议问题