是否可以将一个对象从一个片段发送到另一个片段?
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 并享受随处发送事件,而不必担心在配置更改时分离/附加接口/侦听器。
【讨论】:
以上是关于是否可以将一个对象从一个片段发送到另一个片段?的主要内容,如果未能解决你的问题,请参考以下文章