2014-11-08 6 views
2

Я хочу передать объект реального времени от fragment до fragment.Как передать/передать объект из фрагмента в фрагмент?

I dont хочу данные для передачи.

Я не нашел способ сделать это.

Единственный способ, который я считаю намеренным, но я не уверен.

Я читал о Singleton pattern, interfaces and Bundle, Global varible.

Я хотел бы видеть пример, если можно использовать доли объекта/пасс от одного fragment к secend fragment. большое спасибо.

ответ

6

Передача реальных объектов между действиями или фрагментами может быть достигнута за счет реализации модельных компонентов Parcelable или Serializable интерфейса.

Parcelable: A Parcel похож на Bundle, но является более сложным и может поддерживать более сложную сериализацию классов. Приложения могут реализовать интерфейс Parcelable для определения классов приложений, которые могут быть переданы, особенно при использовании служб.

Вы можете увидеть, как реализовать интерфейс Parcelable в этой статье here.

public class Foo implements Parcelable { 
    ... 
} 

Serializable: сериализуемый интерфейс является стандартным Java сериализации. Вы можете узнать больше об этом here.

public class Foo implements Serializable { 

    private static final long serialVersionUID = 0L; 
    ... 
} 

Предположим, у вас есть класс Foo реализует Parcelable правильно, чтобы поместить его в Intent в деятельности:

Intent intent = new Intent(getBaseContext(), NextActivity.class); 
Foo foo = new Foo(); 
intent.putExtra("foo", foo); 
startActivity(intent); 

Чтобы получить его от намерения в другой деятельности:

Foo foo = (Foo) getIntent().getExtras().getParcelable("foo"); 

* * EDIT **

Как оригинальный вопрос, заданный для фрагментов, то это, как это работает:

Fragment fragment = new Fragment(); 
Foo foo = new Foo(); 

Bundle bundle = new Bundle(); 
bundle.putParcelable("Foo", foo); 
fragment.setArguments(bundle); 

Чтобы получить его из пучка в другом фрагменте:

Foo foo = (Foo) bundle.getParcelable("Foo"); 

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

+0

мне не нужно, чтобы извлечь/разобрать объект типа varible 'INT, строка, логическое etc..'' @Override public void writeToParcel (Parcel dest, int flags) { dest.writeString (varible1); dest.writeInt (varible2); dest.writeString (varible3); dest.writeString (varible4); } ', а затем собрать все значения из каждой переменной. Мне нужно передать/передать/поделиться объектом как единый объект со всеми методами вместе. – biraj800

+0

Android Dalvik (DVM) работает по-разному, чем JVM во многих аспектах, которые вы можете увидеть в этой статье [http://stackoverflow.com/questions/11374477/android-javac-vs-dalvik). Каждое приложение предоставило свой собственный экземпляр в DVM, что означает, что для множества активных приложений требуется несколько экземпляров DVM. Говоря это, совместное использование статической памяти с разными процессами не является хорошей идеей и не гарантирует время жизни состояния объекта в памяти. DVM также имеет автоматический сборщик мусора, подобный JVM-реализации Java. – Deminem

+0

Чтобы решить эту проблему, Java обеспечивает сериализацию для маршаллинга/unmarshalling, чтобы сохранить состояние объекта. Тем не менее, андроид предоставляет собственный интерфейс 'Parcelable', который более эффективен, чем' Serializable'. Я бы порекомендовал прочитать о marshalling/unmarshalling [здесь] (https://coderwall.com/p/vfbing/passing-objects-between-activities-in-android). Согласно рекомендациям Android, передача объектов между действиями/фрагментами может быть достигнута только с помощью Parcelable/Serializable. Все остальные методы имеют свои плюсы и минусы. – Deminem

1
  • Pass объект от одного фрагмента к другому фрагменту может быть достигнут с помощью этих простых шагов:
  • Прежде всего, вы должны сделать свой класс модели, как Parcelable:

    class Car implements Parcelable

  • Затем реализует функции переопределения класса Parcelable: например

    @Override 
    public int describeContents() { 
        return 0; 
    } 
    
    @Override 
    public void writeToParcel(Parcel parcel, int i) { 
    
    } 
    
  • С первого фрагмента:

    // Набор данных для передачи

    MyFragment fragment = new MyFragment(); //Your Fragment 
    Car car = new Car(); // Your Object 
    Bundle bundle = new Bundle(); 
    bundle.putParcelable("carInfo", car) // Key, value 
    fragment.setArguments(bundle); 
    

    данные // перейти на другой фрагмент

    getFragmentManager() 
         .beginTransaction() 
         .replace(R.id.container, fragment) 
         .commit();` 
    
  • На втором фрагменте

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
    
        Bundle bundle = this.getArguments(); 
        if (bundle != null) { 
         Car receivedCar = bundle.getParcelable("carInfo"); // Key 
        } 
    } 
    

    Надежда это поможет :)

0

Существует еще один способ, которым вы можете передать объект, просто сделав простую функцию setter. От вашего текущего фрагмента сделайте объект целевого фрагмента. Ваш целевой фрагмент должен иметь функцию сеттер, как

public void setObjectFunction(Object obj){this.mObj = obj} 

YourFragment yourFragment = new YourFragment(); 
Object passingObj = new Object(); 
yourFragment.setObjectFunction(passingObj); 

Тогда

getFragmentManager() 
    .beginTransaction() 
    .replace(R.id.container, yourFragment) 
    .commit();` 
Смежные вопросы