是否可以将一个对象从一个片段发送到另一个片段?

Posted

技术标签:

【中文标题】是否可以将一个对象从一个片段发送到另一个片段?【英文标题】:Is it possible to send an object from a fragment to another fragment? 【发布时间】:2016-05-05 01:58:48 【问题描述】:

我想从一个片段发送到另一个片段的对象是“post”。 DemandFragment 由一个列表视图组成,该列表视图由作为帖子对象的项目组成。

我需要将列表视图中的选定项目(在本例中为 postArrayList.get(position))发送到 SelectedPostFragment。

我尝试过使用 bundle 但这不起作用...

有人知道如何解决这个问题吗?

需求片段:

public class DemandFragment extends Fragment 

ListView lv;
ArrayAdapter adapter;
ArrayList<Post> postArrayList;
private EditText editSearch;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    View rootView = inflater.inflate(R.layout.fragment_demand, container, false);

    if(rootView != null)
        lv = (ListView) rootView.findViewById(R.id.listDemand);

        editSearch = (EditText) rootView.findViewById(R.id.search_post);

        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() 
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
                // clicked on item show post
                Post selectedPost = postArrayList.get(position);
                Bundle bundle = new Bundle();
                bundle.putParcelable("data", (Parcelable) selectedPost);
                FragmentManager fm = getActivity().getFragmentManager();
                Fragment fragment = new rang.afterflight.fragments.SelectedPostFragment();
                fragment.setArguments(bundle);
                fm.beginTransaction().replace(R.id.content_main, fragment).commit();
            
        );
    
    searchPost();
    return rootView;


public void searchPost()
    editSearch.addTextChangedListener(new TextWatcher() 
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) 

        

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) 
            adapter.getFilter().filter(s);
        

        @Override
        public void afterTextChanged(Editable s) 

        
    );



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

    setHasOptionsMenu(true);

    ParseQuery<ParseObject> query = ParseQuery.getQuery("Post");

    postArrayList = new ArrayList<Post>();

    query.findInBackground(new FindCallback<ParseObject>() 
        public void done(List<ParseObject> postList, ParseException e) 
            if (e == null) 
                for (ParseObject object : postList) 
                    Post newPost = new Post();

                    newPost.setAirportParse((String) object.get("airport"));
                    newPost.setDateParse((String) object.get("date"));
                    newPost.setTimeParse((String) object.get("time"));
                    newPost.setPersonsParse((String) object.get("persons"));
                    newPost.setAddressParse((String) object.get("address"));
                    newPost.setFlightnrParse((String) object.get("address"));
                    newPost.setUsername((String) object.get("username"));
                    newPost.setImageFile((ParseFile) object.get("profilepic"));

                    postArrayList.add(newPost);
                
                adapter = new ListViewAdapter(getActivity(), R.layout.item_cardview, postArrayList);
                lv.setAdapter(adapter);
            
        
    );

SelectedPostFragment:

public class SelectedPostFragment extends Fragment 
TextView airportPost, datePost, timePost, personsPost, addressPost,
        flightnrPost, postedbyPost, contactPost;


ImageView iv;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    View rootView = inflater.inflate(R.layout.fragment_selectedpost, container, false);

    airportPost = (TextView) rootView.findViewById(R.id.airport_post);
    datePost = (TextView) rootView.findViewById(R.id.date_post);
    timePost = (TextView) rootView.findViewById(R.id.time_post);
    personsPost = (TextView) rootView.findViewById(R.id.persons_post);
    addressPost = (TextView) rootView.findViewById(R.id.address_post);
    flightnrPost = (TextView) rootView.findViewById(R.id.flightnr_post);
    postedbyPost = (TextView) rootView.findViewById(R.id.postedby_post);
    contactPost = (TextView) rootView.findViewById(R.id.contact_post);

    Post selectedPost = getArguments().getParcelable("object");
    String s = (String) selectedPost.get("airport");
    Log.d("AIRPORT NAME", s);

    return rootView;

帖子:

@ParseClassName("Post")
public class Post extends ParseObject implements Serializable 

    public Post()
        super();
    

    public String getId()
        return getString("objectId");
    

    public void setId(String id)
        put("objectId", id);
    

    //////////

    public String getUsername()
        return getString("username");
    

    public void setUsername(String username)
        put("username", username);
    



    public String getAirportParse()
        return getString("airport");
    

    public void setAirportParse(String airport)
        put("airport", airport);
    

    //////////


    public String getDateParse()
        return getString("date");
    

    public void setDateParse(String date)
        put("date", date);
    


    //////////


    public String getTimeParse()
        return getString("time");
    

    public void setTimeParse(String time)
        put("time", time);
    


    //////////


    public String getPersonsParse()
        return getString("persons");
    

    public void setPersonsParse(String persons)
        put("persons", persons);
    


    //////////


    public String getAddressParse()
        return getString("address");
    

    public void setAddressParse(String address)
        put("address", address);
    

    public String getFlightnrParse()
        return getString("flightnr");
    

    public void setFlightnrParse(String flightnr)
        put("flightnr", flightnr);
    


    public Bitmap getImageFile()
        Bitmap bmp = null;
        ParseFile image = getParseFile("profilepic");
        if(image != null)
            try 
                byte[] data = image.getData();
                bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
             catch (ParseException e) 
                e.printStackTrace();
                
        
        return bmp;
    

    public void setImageFile(ParseFile file) 
        if (file != null) 
            put("profilepic", file);
        
    

【问题讨论】:

“不工作”是什么意思?是否有任何异常被抛出?什么没有发生,你觉得应该发生,特别是?您可以发布您的Post 课程吗? 我发布了我的 Post 类.... Passing objects in to Fragments的可能重复 【参考方案1】:

我相信您的 Post 类也需要实现 Parcelable 以及在带有 putParcelable() 的片段之间的捆绑中传递它。

查看:Parcelable。

这也是一个很棒的example。

基本实现:

public class Post extends ParseObject implements Serializable, Parcelable 
    ...

    public int describeContents() 
        return 0;
    

    public void writeToParcel(Parcel out, int flags) 
        out.writeString(getId());
        out.writeSring(getUsername());
        ...
    

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

            public Post[] newArray(int size) 
                return new Post[size];
            
    ;

    private Post(Parcel in) 
        // Items must be read in the order they were written.
        setId(in.readString());
        setUsername(in.readString());
        ...
    

试穿一下,希望对你有帮助。

【讨论】:

嗯,我已经使用此代码成功地将捆绑包传递给片段。基本上,您的对象被分解为原始类型并保存到Parcel 中,它充当您需要传递给下一个活动/片段/等的数据的容器。之后,您可以从同一个包裹中读取并重建您传入的对象。可包裹对象需要我在上面发布的方法和CREATOR 类。另外,请停止发布“它不起作用”。这可能意味着一百万种不同的东西。发布您认为可能是问题的详细信息和错误/代码。 有一个 android Studio 插件可以为你做这件事。在 Android Studio 中打开插件并搜索 Parcelable。 感谢@AndrewSenner 它有效....但我没有使用 out.putString 而是 out.writeString ,也不是 (in.getString()) 而是 (in.readString) 谢谢你 TheSunny ! 你是对的,我编辑了我的答案。如果您觉得这对您有所帮助,请标记为正确。谢谢! :-)【参考方案2】:

将活动用作传输机制。

为要实现的活动创建一个接口,活动在实例化时将其传递给片段。每当您要传输数据时,请调用接口的回调。与它需要与之交互的片段进行协调,然后将您的数据发布到另一个将链接到片段的回调中。

如果所有这些都太复杂,那么只需使用 Otto 并享受随处发送事件,而不必担心在配置更改时分离/附加接口/侦听器。

【讨论】:

以上是关于是否可以将一个对象从一个片段发送到另一个片段?的主要内容,如果未能解决你的问题,请参考以下文章

如何将列表视图中的数据从一个片段发送到另一个片段

如何将数据从一个片段传输到另一个片段android

如何将数据从一个 Fragment 发送到另一个 Fragment?

完全下载文件时,将下载的文件从一个片段传递到另一个片段

将数据从片段发送到活动,无需任何事件处理或侦听器

将数据从嵌套片段发送到父片段