Отправка данных во фрагмент вместо действия с объектом Parcelable

Я хочу отправить данные во фрагмент с созданным мной классом Parcelable.

Я знаю, что именно так вы поступаете при использовании Activity (ObjectA является классом, который расширяет Parcelable):

ObjectA obj = new ObjectA();   
// Set values etc.   
Intent i = new Intent(this, MyActivity.class); 
i.putExtra("com.package.ObjectA", obj);   
startActivity(i); 

Но поскольку вы не можете использовать намерения с фрагментами, я понятия не имею, как это сделать.

Могу ли я вообще использовать класс Parcelable? Если нет, то что мне использовать? И можно, как?

Изменить/обновить:

Я обновил ваши рекомендации, но все равно не все понял.

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

package com.tsjd.HotMeals;

import java.util.ArrayList;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

import com.example.tabtest.R;

public class RecipeListViewFragment extends Fragment {

    ArrayList<String> titles;
    ArrayList<String> descriptions;
    ArrayList<String> images;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        RecipeListViewParcer object = getArguments().getParcelable("extraObject");
        titles = object.getTitles();
        descriptions = object.getDescriptions();
        images = object.getImages();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_recipelistview, container,
                false);

        final ListView listview = (ListView) v.findViewById(R.id.listview);


        RecipeListViewAdapter adapter = new RecipeListViewAdapter(
                getActivity(), titles);
        listview.setAdapter(adapter);

        return v;
    }

    public void onListItemClick(ListView l, View v, int position, long id) {
        // do something with the data
    }
}

Я хочу использовать этот ListView для разных целей, поэтому я хочу иметь возможность отправлять ему три списка ArrayList. Для этого я сделал класс, реализующий Parcelable, вот он:

package com.tsjd.HotMeals;

import java.util.ArrayList;

import android.os.Parcel;
import android.os.Parcelable;

public class RecipeListViewParcer implements Parcelable{

    private ArrayList<String> titles;
    private ArrayList<String> descriptions;
    private ArrayList<String> images;

     @SuppressWarnings("unchecked")
    private RecipeListViewParcer(Parcel in) {
            titles = (ArrayList<String>) in.readSerializable();
            descriptions = (ArrayList<String>) in.readSerializable();
            images = (ArrayList<String>) in.readSerializable();
        }

    public int describeContents() {
        return 0;
    }

    public ArrayList<String> getTitles()
    {
        return titles;
    }

    public void setTitles(ArrayList<String> titles){
        this.titles = titles;
    }

    public ArrayList<String> getDescriptions()
    {
        return descriptions;
    }

    public void setDescriptions(ArrayList<String> descriptions){
        this.descriptions = descriptions;
    }

    public ArrayList<String> getImages()
    {
        return images;
    }

    public void setImages(ArrayList<String> images){
        this.images = images;
    }

    public void writeToParcel(Parcel out, int flags) {
        out.writeSerializable(titles);
        out.writeSerializable(descriptions);
        out.writeSerializable(images);
    }

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

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



}

Наконец, это фрагмент, который использует список для отображения любимых рецептов, здесь я хочу отправить три списка ArrayList, это единственный код, который в настоящее время имеет ошибки. Я не знаю, как объявить Parcel, который мне нужен для конструктора моего класса Parcelable, как мне это сделать? (Я еще ничего не добавлял в свои ArrayLists, но надеюсь, что идея ясна).

package com.tsjd.HotMeals;

import java.util.ArrayList;

import android.os.Bundle;
import android.os.Parcel;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;

public class MyRecipesFragment extends Fragment {


    ArrayList<String> titles = new ArrayList<String>();
    ArrayList<String> descriptions = new ArrayList<String>();
    ArrayList<String> images = new ArrayList<String>();



    Parcel in = new Parcel();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        Fragment fragment = new RecipeListViewFragment();

        RecipeListViewParcer obj = new RecipeListViewParcer(in);

        obj.setDescriptions(descriptions);
        obj.setTitles(titles);
        obj.setImages(images);

        Bundle bundle = new Bundle();
        bundle.putParcelable("extraObject", obj);
        fragment.setArguments(bundle);

        fragmentTransaction.commit();
    }

}

person user3714447    schedule 06.06.2014    source источник
comment
используйте пакет и установите его на фрагмент   -  person Rod_Algonquin    schedule 06.06.2014
comment
Попробуйте отладить, что вы получаете в методе конструктора RecipeListViewParcer(Parcel in)?   -  person busylee    schedule 06.06.2014


Ответы (1)


Вы должны использовать FragmentManager:

Отправьте 3 ArrayList в действии:

       FragmentManager fragmentManager = getFragmentManager();
       FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
       Fragment fragment = new ViewControllerFragment();

       ObjectA obj = new ObjectA();
       Bundle bundle = new Bundle();
       bundle.putStringArrayList("Titles", obj.getTitles());
       bundle.putStringArrayList("Descriptions", obj.getDescriptions());
       bundle.putStringArrayList("Images", obj.getImages());
       fragment.setArguments(bundle);

       fragmentTransaction.commit();

Получить объект во фрагменте:

Bundle bundle = getArguments();                    
 titles = bundle.getStringArrayList("Titles");            
descriptions= bundle.getStringArrayList("Descriptions");            
images= bundle.getStringArrayList("Images");

Или просто попробуйте другие сообщения: Отправить данные из активности во фрагмент в Android

person TheOnlyJakobob    schedule 06.06.2014
comment
Не могли бы вы посмотреть на мое обновление / редактирование? Это дает гораздо больше информации о ситуации, и у меня есть несколько мелких проблем, которые еще предстоит решить. - person user3714447; 06.06.2014
comment
Забудьте об идее с Parcelables и попробуйте получить 3 ArrayList в Activity и поместить их в бандл: bundle.putStringArrayList(extraTitles, object.getTitles()); bundle.putStringArrayList(XXX, object.getXXX); - person TheOnlyJakobob; 06.06.2014