Reputation: 11
I have a hard time understanding how to pass value from one fragment to another fragment. I've created a toggle button in recycler item which when checked should pass the content of the card to another fragment(Favourites) implementing recyclerVIew.
this is my recyclerView adapter
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
private ClipboardManager myClipboard;
private ClipData myClip;
private Context context;
public List<CardItemModel> cardItems;
public RecyclerAdapter(List<CardItemModel> cardItems){
this.cardItems = cardItems;
}
public static class ViewHolder extends RecyclerView.ViewHolder{
ImageView copyButton;
ImageView shareButton;
ToggleButton favButton;
TextView title;
TextView content;
public ViewHolder(View itemView) {
super(itemView);
this.title = (TextView)itemView.findViewById(R.id.card_title);
this.content = (TextView)itemView.findViewById(R.id.card_content);
this.copyButton= (ImageView) itemView.findViewById(R.id.copyButton);
this.shareButton=(ImageView) itemView.findViewById(R.id.shareButton);
this.favButton=(ToggleButton) itemView.findViewById(R.id.favButton);
favButton.setChecked(false);
favButton.setBackgroundDrawable(ContextCompat.getDrawable(favButton.getContext(), R.mipmap.ic_launcher));
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item,parent,false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
holder.title.setText(cardItems.get(position).title);
holder.content.setText(cardItems.get(position).content);
holder.copyButton.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
myClipboard = (ClipboardManager) v.getContext().getSystemService(Context.CLIPBOARD_SERVICE);
myClip = ClipData.newPlainText("label", holder.content.getText().toString());
myClipboard.setPrimaryClip(myClip);
Toast.makeText(v.getContext(), "Copied to clipboard" , Toast.LENGTH_SHORT ).show();
}
});
holder.shareButton.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("text/plain");
share.putExtra(Intent.EXTRA_TEXT, holder.content.getText().toString());
v.getContext().startActivity(Intent.createChooser(share, "Share Text"));
}
});
holder.favButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton favButton, boolean isChecked){
if (isChecked)
favButton.setBackgroundDrawable(ContextCompat.getDrawable(favButton.getContext(),R.mipmap.ic_launcher));
else
favButton.setBackgroundDrawable(ContextCompat.getDrawable(favButton.getContext(), R.mipmap.ic_cart));
}
});
}
@Override
public int getItemCount() {
return cardItems.size();
}
}
and this is my 'Favourite' fragment where I want to passs the value.
public class FavouriteFragment extends Fragment {
private List<CardItemModel> cardItems = new ArrayList<>(20);
private MainActivity mainActivity;
private Toolbar toolbar;
private RecyclerView recyclerView;
private RecyclerAdapter recyclerAdapter;
public FavouriteFragment() {
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mainActivity = (MainActivity)activity;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_favourite, container, false);
toolbar = (Toolbar)view.findViewById(R.id.fab_toolbar);
setupToolbar();
recyclerView = (RecyclerView)view.findViewById(R.id.fab_recycler_view);
setupRecyclerView();
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mainActivity.setupNavigationDrawer(toolbar);
}
private void setupToolbar(){
toolbar.setTitle(getString(R.string.fav_fragment_title));
mainActivity.setSupportActionBar(toolbar);
}
private void setupRecyclerView(){
recyclerView.setLayoutManager(new LinearLayoutManager(mainActivity));
recyclerView.setHasFixedSize(true);
initializeCardItemList();
recyclerAdapter = new RecyclerAdapter(cardItems);
recyclerView.setAdapter(recyclerAdapter);
}
private void initializeCardItemList(){
CardItemModel cardItemModel;
String[] cardTitles = getResources().getStringArray(R.array.fav_cards);
String[] cardContents = getResources().getStringArray(R.array.fav_cards_content);
final int length = cardTitles.length;
for(int i=0;i<length;i++){
cardItemModel = new CardItemModel(cardTitles[i],cardContents[i]);
cardItems.add(cardItemModel);
}
}
}
Upvotes: 1
Views: 2073
Reputation: 85
You can use interface for that. Let us see an example where you want to pass value from FragmentA to FragmentB
class FragmentA extends Fragment{
//Your fragment a functionalities goes here
//now define an interface inside this FragmentA
//you get reference from main activity
MainActivity activity;
@Override
void onCreate(){
activity = getActivity();
}
//after your functionalities you can call passValue function of main activity from the variable 'activity' like
activity.passValue(your integer value from fragmentA to main activity)
interface OnValuePassedListener{
void passValue(int value)//if you want to pass integer value
}
}
//this is the activity where FragmentA is located
public class MainActivity extends Activity implements FragmentA.OnValuePassedListener{
//Inside this activity, you write code to open the fragment. When you do that pass this activity's reference to the FragmentA
@Override
void passValue(int value){
//you get the value from FragmentA inside this function
}
}
You know how to pass value from activity to fragment. From passValue() function inside activity, you can call another fragment and pass the value to the fragment.
In this way, you can pass value from FragmentA to another fragment using Activity as middleman. You can learn more about this from here https://www.youtube.com/watch?v=VyyGP_d0Ia8&index=118&list=PLonJJ3BVjZW6hYgvtkaWvwAVvOFB7fkLa
Upvotes: 1
Reputation: 1645
Add your values in the Bundle
Fragment fragment = new Table_Selection_QRCODE();
Bundle bun = new Bundle();
bun.putString("table","20");
fragment.setArguments(bun);
getFragmentManager().beginTransaction().replace(R.id.frag, fragment).commit();
In other fragment Receive the Values Like this(OnCreate)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle b=getArguments();
if(b!=null){
rslt=b.getString("table","");
}
}
Upvotes: 0
Reputation: 129
Communication between fragments can be done by EventBus. steps : 1. Create event class 2. Register event where you want to change data of fragment. 3. Post Event from fragment (onClick on toggle button).
https://github.com/greenrobot/EventBus
http://greenrobot.org/eventbus/
Step 1 :
import java.io.Serializable;
public class ToggleButtonClickEvent implements Serializable {
private CardItemModel cardItemModel;
public ToggleButtonClickEvent (CardItemModel ardItemModel){
this.cardItemModel= cardItemModel;
}
public CardItemModel getCardItemModel() {
return cardItemModel;
}
}
Step 2 : Register and unregister event in fragment where you want to change data
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
Step 3 :
post event when toggle button clicked
EventBus.getDefault().post(new ToggleButtonClickEvent(cardItemModel));
Upvotes: 0