Как передать объект в новую активность?(как вводить) - PullRequest
0 голосов
/ 11 октября 2011

Я хочу передать объект (не данные!), Который реализует некоторый интерфейс (например, IConnect), в новое действие.Activity будет вызывать некоторые методы из этого объекта для получения данных.

Как это сделать?(Serializable и Parcelable предназначены для объектов / данных / структур, я полагаю, а не для объектов / интерфейсов, которые что-то «ДЕЛАЮТ»).

Должен ли я передавать имя класса в Intent extras?а потом Activity создаст нужный объект?Как внедрить объект (несколько разных классов, реализующих IConnect) в новый Activity?

Ответы [ 5 ]

4 голосов
/ 11 октября 2011

MyParcelable.java

public class MyParcelable implements Parcelable { 

    private String mVal; 

    public MyParcelable(String val) { 
        mVal = val; 
    } 

    public static final Parcelable.Creator<MyParcelable> CREATOR = 
        new Parcelable.Creator<MyParcelable>() { 
        public MyParcelable createFromParcel(Parcel in) { 
            String s = in.readString(); 
            return new MyParcelable(s); 
        } 

        public MyParcelable[] newArray(int size) { 
            return new MyParcelable[size]; 
        } 
    }; 

    public String getValue() { 
        return mVal; 
    } 

    public void writeToParcel(Parcel p) { 
        p.writeString(mVal); 
    } 

    public String toString() { 
        return "MyParcelable[val=" + mVal + "]"; 
    } 

} 

SendParcelable.java

public class SendParcelable extends Activity { 
    @Override 
    public void onCreate(Bundle icicle) { 
        super.onCreate(icicle); 
        Intent intent = new Intent(this, ReceiveParcelable.class); 
        Parcelable p = new MyParcelable("test"); 
        intent.putExtra("myparcelable", p); 
        Log.i("ParcelDemo", "Sending Parcelable"); 
        startActivity(intent); 
    } 
} 

ReceiveParcelable.java

public class ReceiveParcelable extends Activity { 
    @Override 
    public void onCreate(Bundle icicle) { 
      super.onCreate(icicle); 
      Intent intent = getIntent(); 
       Parcelable p = intent.getParcelableExtra("myparcelable"); 
        Log.i("ParcelDemo", "Got Parcelable " + p); 
        if (p != null && p instanceof MyParcelable && 
            ((MyParcelable) p).getValue().equals("test")) { 
            Log.i("ParcelDemo", "Success!"); 
        } else { 
            Log.i("ParcelDemo", "Failure!"); 
        } 
    } 
} 

Надеюсь, что этопомогает!

1 голос
/ 11 октября 2011

Если вы просто пытаетесь найти способ передавать объекты между действиями, вы можете переопределить класс Application.

Способ использования класса приложения.

Расширьте класс приложения и добавьте ваш объект в качестве его атрибута. В любом случае, если вы позвоните по указанному ниже коду, он вернет одиночный код.

MyApplication appContext = (MyApplication) getApplication();

Чтобы сделать это, вам нужно добавить это в тег приложения файла манифеста

 android:name=".MyApplication"

Этот метод используется для передачи значений и объектов по приложению.

1 голос
/ 11 октября 2011

В документации Android есть запись - Как передать данные между операциями / службами в рамках одного приложения? Если вы говорите о непостоянных объектах, ваши варианты будут:

  • Синглтон класс
  • Открытое статическое поле / метод
  • Хэш-карта слабых ссылок на объекты

Кстати, я не очень понимаю разницу, которую вы проводите между объектами и данными. Объект содержит поля и набор методов для работы с ними. Однако не имеет значения, есть ли у этого объекта какие-то методы или нет, они не составляют часть его состояния. Если вы передаете объект, вам нужно только передать его состояние, чтобы вы могли сохранить состояние, используя сериализацию (через интерфейс Serializable или Parcelable), а затем восстановить его.

0 голосов
/ 11 октября 2011

На данный момент я сделал для пункта назначения Активность:

    String className = getIntent().getStringExtra("com.myproject.ModelClass");
    IModel model = (IModel)Class.forName(className).newInstance();

И у меня есть конкретная реализация в Activity.

0 голосов
/ 11 октября 2011

Parcelable это вариант.Он запишет данные из вашего объекта и создаст новый объект из данных.Это похоже на сохранение и загрузку данных.

Посмотрите на http://developer.android.com/reference/android/os/Parcelable.html, чтобы увидеть, как вы должны это реализовать.

...