How to communicate data between two fragments in a

2020-04-11 05:12发布

问题:

I have a navigation drawer which contains different fragments (each item display a fragment) and i'd like to pass data from a fragment to another.(I have just one activity that contain a navigation drawer in which a have a list of fragments).

I have tried many solutions (Bundle and intent) but I couldn't solve my problem.

Can any one help me pleaaase.

This is my first Fragment A : package com.tutecentral.navigationdrawer;

import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;

public class setting extends Fragment implements OnItemSelectedListener, View.OnClickListener{

Button button_validate;
EditText editText;
Spinner spinner;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    View view;
    view=inflater.inflate(R.layout.setting, container, false);

    spinner=(Spinner) view.findViewById(R.id.spinnerSetting);
    ArrayAdapter adapter=ArrayAdapter.createFromResource(getActivity(), R.array.listMenu, android.R.layout.simple_spinner_item);
    spinner.setAdapter(adapter);
    spinner.setOnItemSelectedListener(this);

    editText=(EditText) view.findViewById(R.id.price);

    button_validate=(Button) view.findViewById(R.id.buttonValidatePrices);
    button_validate.setOnClickListener(this);

    return view;
}
@Override
public void onItemSelected(AdapterView<?> adapter, View view, int position,long arg3) {
    // TODO Auto-generated method stub
    TextView myText=(TextView) view;
    switch (position) {
    case 0:
        editText.setText("0");
        break;
    case 1:
        editText.setText("1");
        break;
    case 2:
        editText.setText("2");
        break;
    case 3:
        editText.setText("3");
        break;
    case 4:
        editText.setText("4");
        break;
    case 5:
        editText.setText("5");
        break;
    case 6:
        editText.setText("6");
        break;
    case 7:
        editText.setText("7");
        break;
    case 8:
        editText.setText("8");
        break;
    case 9:
        editText.setText("9");
        break;
    default:
        editText.setTag(getResources().getString(R.string.Default_prices));
    }
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
    // TODO Auto-generated method stub

}
@Override
public void onClick(View view) {
    // TODO Auto-generated method stub
    if(view.getId()==R.id.buttonValidatePrices) {
        //SharedPreferences preferences=this.getActivity().getSharedPreferences("MyData", Context.MODE_PRIVATE);
        //SharedPreferences.Editor editor=preferences.edit();
        //editor.remove("price_"+spinner.getSelectedItem().toString());
        //editor.putString("price_"+spinner.getSelectedItem().toString(), editText.getText().toString());
        //editor.commit();

        Bundle bundle=new Bundle();
        bundle.putString("price_"+spinner.getSelectedItem().toString(), editText.getText().toString());
        Menu menu=new Menu();
        menu.setArguments(bundle);
    }
}

}

This is the FragmentB where I should get the data (see getarguments): package com.tutecentral.navigationdrawer;

/** * A simple {@link android.support.v4.app.Fragment} subclass. * */ public class Menu extends Fragment implements OnClickListener, TabListener{

public Menu(){
    // TODO Auto-generated constructor stub
}

public static final String Default="20";

public static ActionBar actionBar;
Button order, add, remove;
Gallery gallery;
ImageView imageView;
TextView descriptionTextView;
TextView textViewPrice;
TextView totalPrice;
Bundle args = new Bundle();
int total=0, price=0;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view=inflater.inflate(R.layout.fragment_menu, container, false);       

    actionBar=getActivity().getActionBar();
    actionBar.setNavigationMode(actionBar.NAVIGATION_MODE_TABS);



    order=(Button) view.findViewById(R.id.commander);
    order.setOnClickListener(this);
    add=(Button) view.findViewById(R.id.addMenu);
    add.setOnClickListener(this);
    remove=(Button) view.findViewById(R.id.removeMenu);
    remove.setOnClickListener(this);

    gallery=(Gallery)view.findViewById(R.id.gallery);
    imageView=(ImageView)view.findViewById(R.id.imageView);
    gallery.setAdapter(new ImageAdapter(getActivity(), 0));

    descriptionTextView=(TextView)view.findViewById(R.id.descriptionText);
    textViewPrice=(TextView) view.findViewById(R.id.priceMenu);
    textViewPrice.setOnClickListener(this);

    totalPrice=(TextView) view.findViewById(R.id.TotalFieldMenu);

    price=Integer.parseInt(textViewPrice.getText().toString());

    gallery.setOnItemClickListener(new OnItemClickListener() {          

        @Override
        public void onItemClick(AdapterView<?> adapter, View arg1, int position,long arg3) {
            // TODO Auto-generated method stub
            String price1;
            SharedPreferences preferences=getActivity().getSharedPreferences("MyData", Context.MODE_PRIVATE);
            switch (actionBar.getSelectedNavigationIndex()) {
            case 0:
                imageView.setImageResource(ImageAdapter.ThumbsIds[position]);
                break;
            case 1:
                imageView.setImageResource(ImageAdapter.ThumbsIds2[position]);
                break;
            case 2:
                imageView.setImageResource(ImageAdapter.ThumbsIds3[position]);
                break;

            default:
                imageView.setImageResource(ImageAdapter.ThumbsIds[position]);

                break;
            }
            ChangeData(position);
            switch (ImageAdapter.ThumbsIds[position]) {
            case R.drawable.pizza:
                //price1=preferences.getString("price_"+"pizza", Default);
                Log.i("bundlebundlebundle", getArguments().getString("price_"+"pizza",Default));
                price1=getArguments().getString("price_"+"pizza", Default);
                break;
            case R.drawable.fishsoup:
                price1=preferences.getString("price_"+"Fish soup", Default);
                break;
            case R.drawable.frenchfries:
                price1=preferences.getString("price_"+"French fries", Default);
                break;
            case R.drawable.chakhchoukha:
                price1=preferences.getString("price_"+"Chakhchoukha", Default);
                break;
            case R.drawable.couscous:
                price1=preferences.getString("price_"+"couscous", Default);
                break;
            case R.drawable.zlabia:
                price1=preferences.getString("price_"+"zlabia", Default);
                break;
            case R.drawable.juice:
                price1=preferences.getString("price_"+"juice", Default);
                break;
            case R.drawable.salade_fruit:
                price1=preferences.getString("price_"+"salade fruit", Default);
                break;
            case R.drawable.salade_fromage:
                price1=preferences.getString("price_"+"salade fromage", Default);
                break;
            case R.drawable.salade_verte:
                price1=preferences.getString("price_"+"salade verte", Default);
                break;
            default:
                price1=preferences.getString("price_"+"pizza", Default);
                break;


            }
            if(price1.equals(String.valueOf(Default))){
                textViewPrice.setText(String.valueOf(Default));
            }
            else{
                textViewPrice.setText(price1);
            }
            price=Integer.parseInt(price1);
        }

    });

    ActionBar.Tab tab1=actionBar.newTab();
    tab1.setText(getResources().getString(R.string.Starter));
    tab1.setTabListener(this);

    ActionBar.Tab tab2=actionBar.newTab();
    tab2.setText(getResources().getString(R.string.Maindisk));
    tab2.setTabListener(this);

    ActionBar.Tab tab3=actionBar.newTab();
    tab3.setText(getResources().getString(R.string.Desert));
    tab3.setTabListener(this);

    actionBar.addTab(tab1);
    actionBar.addTab(tab2);
    actionBar.addTab(tab3);

    return view;
}

public ActionBar getActionBar() {
    return actionBar;
}

public void setActionBar(ActionBar actionBar) {
    this.actionBar = actionBar;
}

//This methode allow us to change the data according to the index of listView.
public void ChangeData(int index){
    String [] description=getResources().getStringArray(R.array.Description);
    descriptionTextView.setText(description[index]);
} 

/*public void orderMenu(View view){

}*/


@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.commander:
        //args.putString("price", textViewPrice.getText().toString());  
        //FragmentManager manager=getFragmentManager();
        //MyDialog dialog=new MyDialog();
        //dialog.setArguments(args);
        //dialog.show(manager, "MyDialog");
        Bundle args=new Bundle();
        args.putString("priceTotal", totalPrice.getText().toString());


        //haredPreferences preferences=this.getActivity().getSharedPreferences("Order_Price", Context.MODE_PRIVATE);
        //haredPreferences.Editor editor=preferences.edit();
        //ditor.putString("price1"+textViewPrice.toString(), String.valueOf(R.string.Default_prices));

        //ditor.commit();

        //imageView.setImageResource(ImageAdapter.ThumbsIds[0]);
        //ChangeData(0);
        break;
        case R.id.removeMenu :

            break;
        case R.id.addMenu :

            total=Integer.parseInt(totalPrice.getText().toString())+price;
            totalPrice.setText(String.valueOf(total));
            Toast.makeText(getActivity(), "dish added", Toast.LENGTH_SHORT).show();
            break;
    }
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onViewCreated(view, savedInstanceState);
    Log.i("bundlebundlebundle", getArguments().getString("price_"+"pizza",Default));
}

@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
    // TODO Auto-generated method stub

}

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    // TODO Auto-generated method stub
    gallery.setAdapter(new ImageAdapter(getActivity(), tab.getPosition()));
    switch (tab.getPosition()) {
    case 0:
        imageView.setImageResource(ImageAdapter.ThumbsIds[0]);
        break;
    case 1:
        imageView.setImageResource(ImageAdapter.ThumbsIds2[0]);
        break;
    case 2:
        imageView.setImageResource(ImageAdapter.ThumbsIds3[0]);
        break;

    default:
        imageView.setImageResource(ImageAdapter.ThumbsIds[0]);
        break;
    }
}

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    // TODO Auto-generated method stub

}

}

and this is the main activity where I use the adapter to handle my Navigation drawer (see switch(switch (possition) {: package com.tutecentral.navigationdrawer;

import java.util.ArrayList;
import java.util.List;

import com.tutecentral.navigationdrawer.R.menu;

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.res.Configuration;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

public class MainActivity extends Activity {

  private DrawerLayout mDrawerLayout;
  private ListView mDrawerList;
  private ActionBarDrawerToggle mDrawerToggle;

  private CharSequence mDrawerTitle;
  private CharSequence mTitle;
  CustomDrawerAdapter adapter;

  List<DrawerItem> dataList;

  @SuppressLint("ResourceAsColor")
@Override
  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Initializing
        dataList = new ArrayList<DrawerItem>();
        mTitle = mDrawerTitle = getTitle();
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.left_drawer);

        mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);

     // Add Drawer Item to dataList
        dataList.add(new DrawerItem(true)); // adding a spinner to the list

        dataList.add(new DrawerItem("Main Options"));// adding a header to the list
        dataList.add(new DrawerItem("Search", R.drawable.ic_action_search));
        dataList.add(new DrawerItem("Menu", R.drawable.menu));
        dataList.add(new DrawerItem("Envoie Facture", R.drawable.bill));
        dataList.add(new DrawerItem("Affectations", R.drawable.table));

        dataList.add(new DrawerItem("Other Options")); // adding a header to the list
        dataList.add(new DrawerItem("About", R.drawable.ic_action_about));
        dataList.add(new DrawerItem("Settings", R.drawable.setting));
        dataList.add(new DrawerItem("Help", R.drawable.ic_action_help));

        dataList.add(new DrawerItem("Social")); // adding a header to the list
        dataList.add(new DrawerItem("Message", R.drawable.ic_action_email));
        dataList.add(new DrawerItem("Likes", R.drawable.ic_action_good));
        dataList.add(new DrawerItem("Twitter", R.drawable.twitter));

        adapter = new CustomDrawerAdapter(this, R.layout.custom_drawer_item,dataList);

        mDrawerList.setAdapter(adapter);
        mDrawerList.setBackgroundColor(R.color.background_NavAda);

        mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open,R.string.drawer_close) {
              public void onDrawerClosed(View view) {
                    getActionBar().setTitle(mTitle);
                    invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
              }

              public void onDrawerOpened(View drawerView) {
                    getActionBar().setTitle(mDrawerTitle);
                    invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
              }
        };

        mDrawerLayout.setDrawerListener(mDrawerToggle);

        if (savedInstanceState == null) {

            if (dataList.get(0).isSpinner() & dataList.get(1).getTitle() != null) {
                  SelectItem(2);
            } else if (dataList.get(0).getTitle() != null) 
            { SelectItem(1);

            } else {
                  SelectItem(0);
            }
      }

  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
  }

  public void SelectItem(int possition) {

      Fragment fragment = null;
      Bundle args = new Bundle();
      switch (possition) {

      case 2:
            fragment = new FragmentThree();
            args.putString(FragmentThree.ITEM_NAME, dataList.get(possition).getItemName());
            args.putInt(FragmentThree.IMAGE_RESOURCE_ID, dataList.get(possition).getImgResID());
            break;
      case 3:
            fragment = new com.tutecentral.navigationdrawer.Menu();
            break;
      case 4:
            fragment = new bill_send();
            //args.putString(FragmentTwo.ITEM_NAME, dataList.get(possition).getItemName());
            //args.putInt(FragmentTwo.IMAGE_RESOURCE_ID, dataList.get(possition).getImgResID());
            break;
      case 5:
            fragment = new tables();
            //args.putString(FragmentThree.ITEM_NAME, dataList.get(possition).getItemName());
            //args.putInt(FragmentThree.IMAGE_RESOURCE_ID, dataList.get(possition).getImgResID());
            break;
      case 7:
            fragment = new about();
            //args.putString(FragmentTwo.ITEM_NAME, dataList.get(possition).getItemName());
            //args.putInt(FragmentTwo.IMAGE_RESOURCE_ID, dataList.get(possition).getImgResID());
            break;
      case 8:
            fragment = new setting();
            //args.putString(FragmentThree.ITEM_NAME, dataList.get(possition).getItemName());
            //args.putInt(FragmentThree.IMAGE_RESOURCE_ID, dataList.get(possition).getImgResID());
            break;
      case 9:
            fragment = new FragmentOne();
            args.putString(FragmentOne.ITEM_NAME, dataList.get(possition).getItemName());
            args.putInt(FragmentOne.IMAGE_RESOURCE_ID, dataList.get(possition).getImgResID());
            break;
      case 10:
            fragment = new FragmentTwo();
            args.putString(FragmentTwo.ITEM_NAME, dataList.get(possition).getItemName());
            args.putInt(FragmentTwo.IMAGE_RESOURCE_ID, dataList.get(possition).getImgResID());
            break;
      case 11:
            fragment = new FragmentThree();
            args.putString(FragmentThree.ITEM_NAME, dataList.get(possition).getItemName());
            args.putInt(FragmentThree.IMAGE_RESOURCE_ID, dataList.get(possition).getImgResID());
            break;
      case 12:
            fragment = new FragmentOne();
            args.putString(FragmentOne.ITEM_NAME, dataList.get(possition).getItemName());
            args.putInt(FragmentOne.IMAGE_RESOURCE_ID, dataList.get(possition).getImgResID());
            break;
      case 13:
            fragment = new FragmentThree();
            args.putString(FragmentThree.ITEM_NAME, dataList.get(possition).getItemName());
            args.putInt(FragmentThree.IMAGE_RESOURCE_ID, dataList.get(possition).getImgResID());
            break;
      default:
            break;
      }

      if(com.tutecentral.navigationdrawer.Menu.actionBar!=null){
          if (com.tutecentral.navigationdrawer.Menu.actionBar.isShowing()){
              com.tutecentral.navigationdrawer.Menu.actionBar.removeAllTabs();
          }

      }

        fragment.setArguments(args);
        FragmentManager frgManager = getFragmentManager();
        frgManager.beginTransaction().replace(R.id.content_frame, fragment).commit();

        mDrawerList.setItemChecked(possition, true);
        setTitle(dataList.get(possition).getItemName());
        mDrawerLayout.closeDrawer(mDrawerList);

  }

  @Override
  public void setTitle(CharSequence title) {
        mTitle = title;
        getActionBar().setTitle(mTitle);
  }

  @Override
  protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
  }

  @Override
  public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        // Pass any configuration change to the drawer toggles
        mDrawerToggle.onConfigurationChanged(newConfig);
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
        // The action bar home/up action should open or close the drawer.
        // ActionBarDrawerToggle will take care of this.
        if (mDrawerToggle.onOptionsItemSelected(item)) {
              return true;
        }

        return false;
  }

  private class DrawerItemClickListener implements
  ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
          if (dataList.get(position).getTitle() == null) {
                SelectItem(position);
          }

    }

}

}

Thank you.

回答1:

When you click inside your NavigationDrawer, you can use setArguments() method to declare your datas via a Bundle as follows:

// int id = 1;
MyFragment newFragment = new MyFragment();
Bundle args = new Bundle();
args.putInt("ARG_DATA_ID", id);
newFragment.setArguments(args);
// replace and commit with fragmenttransaction  

Then, inside your Fragment, use getArgument() method like the following:

Bundle arg = getArguments();
int id_pass = arg.getInt("ARG_DATA_ID");
// id_pass = 1;  

However, maybe you can find some useful tips into this topic: Communicating with Other Fragments.


UPDATE:

Well, I tried to make an example from your code but, it's hum.. hard ;).

  1. You don't receive an argument because in SelectItem method, you don't send any argument with Menu fragment (but your switch is how to do, you're on the right way). You try separatly to send an argument but in other Bundle when you click on buttonValidatePrices in setting which it is not send or anything. Just created, a value stored into it, and nothing.. it's not related to the FragmentTransaction.

  2. Inside Menu, you try to receive with this:

    Log.i("bundlebundlebundle", getArguments().getString("price_"+"pizza",Default));  
    

    But I think it will be better with:

    Log.i("bundlebundlebundle", getArguments().getString("price_pizza"));  
    

You should:

First (in MainActivity) = get the value of the clicked spinner from MainActivity to your setting Fragment, create a Bundle and set this value to the fragment inside SelectItem method as follows:

switch(...) {
    case 2: 
        frag = new Menu();
        // get the value of the spinner selected from here! Something like this:
          String text = ((Spinner) findViewById(R.id.spinnerSetting)). getSelectedItem().toString();
        // String named "spinner_position", this is how you can get it after
        args.putString("spinner_position", text);
        break;
    ...
}
frag.setArguments(args);
// replace the fragment  

Second (in Menu) = receive this argument as follows:

// receive using the name "spinner_position", that's it. Nothing else.
String text_spinner = getArguments().getString("spinner_position");


回答2:

You could use a http://developer.android.com/reference/android/content/BroadcastReceiver.html

Or you could set the listener of each fragment as your activity, and send data from a fragment to an activity and call methods directly on the other fragment from the activity.