如何 return 从回收站视图生成片段
How to return result to a fragment from recycler view
我有一个 activity B 和片段 B,我使用 startActivityForResult
从 activity A 打开片段 B。在我的片段 B 中,我有一个回收器网格视图。在网格视图中,我有用于显示动画 gif 的网络视图网格。
我的片段B码
public static class GiphyFragment extends Fragment {
private RecyclerView mRecyclerView;
private GiphyTestAdapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
public GiphyFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_giphy_test, container, false);
mRecyclerView = (RecyclerView) rootView.findViewById(R.id.giphy_recycler_view);
mRecyclerView.setHasFixedSize(true);
// use a grid layout manager
mLayoutManager = new GridLayoutManager(getActivity(),2);
mRecyclerView.setLayoutManager(mLayoutManager);
// specify an adapter
ArrayList<Giphy> giphyDataSet = new ArrayList<Giphy>();
mAdapter = new GiphyTestAdapter(getActivity(),giphyDataSet);
mRecyclerView.setAdapter(mAdapter);
//run async task to fetch list of giphys
...
...
return rootView;
}
}
GiphyTestAdapter
public class GiphyTestAdapter extends RecyclerView.Adapter<GiphyTestAdapter.ViewHolder> {
private final String LOG_TAG = getClass().getSimpleName();
private ArrayList<Giphy> mDataset;
private Context mContext;
public class ViewHolder extends RecyclerView.ViewHolder{
public WebView giphyView;
public TextView textView;
public ViewHolder(View v) {
super(v);
giphyView = (WebView) v.findViewById(R.id.giphy_view);
textView = (TextView) v.findViewById(R.id.giphy_url);
this.giphyView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url){
Toast toast = Toast.makeText(mContext, textView.getText(), Toast.LENGTH_SHORT);
toast.show();
//Here I want to return result to fragment so that it can give it to activity A
return true;
}
});
}
}
public void add(int position, Giphy giphyObj) {
mDataset.add(giphyObj);
notifyItemInserted(position);
}
public GiphyTestAdapter(Context context, ArrayList<Giphy> myDataset) {
mContext = context;
mDataset = myDataset;
}
// Create new views (invoked by the layout manager)
@Override
public GiphyTestAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_giphy_item_list, parent, false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
final Giphy giphy = mDataset.get(position);
holder.giphyView.loadUrl(giphy.getUrl());
holder.textView.setText(giphy.getUrl());
}
@Override
public int getItemCount() {
return mDataset.size();
}
}
目标 我想 return 结果 activity A.
通常我会在片段 B 中创建一个意图,使用 put extra 添加所需的结果并调用 finish。
在上面的代码中,我有数据要在 shouldOverrideUrlLoading
方法中 returned。如何给它片段 B 以便它可以创建意图和 return ?
尝试使用 getActivity().setResult(int responseCode, Intent data)
并在 Activity A 中覆盖 Activity.onActivityResult(int requestCode, int responseCode, Intent data)
您的片段 B 需要有一个 Activity B 实现的接口。一旦你在片段中有了数据,只需调用将数据传递给 Activity 的接口,然后可以设置意图并调用完成,这样 Activity A 就会得到结果。
与 onFragmentInteraction() 接口没有区别:)
我认为@Degreat Yartey 的回答有效。
但还有另外两种方法值得一试:
1.register一个BoadcastReceiver是FragmentA,在ActivityB中发送广播;
2.use 一个接口来做这件事。
我有一个 activity B 和片段 B,我使用 startActivityForResult
从 activity A 打开片段 B。在我的片段 B 中,我有一个回收器网格视图。在网格视图中,我有用于显示动画 gif 的网络视图网格。
我的片段B码
public static class GiphyFragment extends Fragment {
private RecyclerView mRecyclerView;
private GiphyTestAdapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
public GiphyFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_giphy_test, container, false);
mRecyclerView = (RecyclerView) rootView.findViewById(R.id.giphy_recycler_view);
mRecyclerView.setHasFixedSize(true);
// use a grid layout manager
mLayoutManager = new GridLayoutManager(getActivity(),2);
mRecyclerView.setLayoutManager(mLayoutManager);
// specify an adapter
ArrayList<Giphy> giphyDataSet = new ArrayList<Giphy>();
mAdapter = new GiphyTestAdapter(getActivity(),giphyDataSet);
mRecyclerView.setAdapter(mAdapter);
//run async task to fetch list of giphys
...
...
return rootView;
}
}
GiphyTestAdapter
public class GiphyTestAdapter extends RecyclerView.Adapter<GiphyTestAdapter.ViewHolder> {
private final String LOG_TAG = getClass().getSimpleName();
private ArrayList<Giphy> mDataset;
private Context mContext;
public class ViewHolder extends RecyclerView.ViewHolder{
public WebView giphyView;
public TextView textView;
public ViewHolder(View v) {
super(v);
giphyView = (WebView) v.findViewById(R.id.giphy_view);
textView = (TextView) v.findViewById(R.id.giphy_url);
this.giphyView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url){
Toast toast = Toast.makeText(mContext, textView.getText(), Toast.LENGTH_SHORT);
toast.show();
//Here I want to return result to fragment so that it can give it to activity A
return true;
}
});
}
}
public void add(int position, Giphy giphyObj) {
mDataset.add(giphyObj);
notifyItemInserted(position);
}
public GiphyTestAdapter(Context context, ArrayList<Giphy> myDataset) {
mContext = context;
mDataset = myDataset;
}
// Create new views (invoked by the layout manager)
@Override
public GiphyTestAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_giphy_item_list, parent, false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
final Giphy giphy = mDataset.get(position);
holder.giphyView.loadUrl(giphy.getUrl());
holder.textView.setText(giphy.getUrl());
}
@Override
public int getItemCount() {
return mDataset.size();
}
}
目标 我想 return 结果 activity A.
通常我会在片段 B 中创建一个意图,使用 put extra 添加所需的结果并调用 finish。
在上面的代码中,我有数据要在 shouldOverrideUrlLoading
方法中 returned。如何给它片段 B 以便它可以创建意图和 return ?
尝试使用 getActivity().setResult(int responseCode, Intent data)
并在 Activity A 中覆盖 Activity.onActivityResult(int requestCode, int responseCode, Intent data)
您的片段 B 需要有一个 Activity B 实现的接口。一旦你在片段中有了数据,只需调用将数据传递给 Activity 的接口,然后可以设置意图并调用完成,这样 Activity A 就会得到结果。
与 onFragmentInteraction() 接口没有区别:)
我认为@Degreat Yartey 的回答有效。
但还有另外两种方法值得一试:
1.register一个BoadcastReceiver是FragmentA,在ActivityB中发送广播;
2.use 一个接口来做这件事。