问题
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 ;).
You don't receive an argument because in
SelectItem
method, you don't send any argument withMenu
fragment (but your switch is how to do, you're on the right way). You try separatly to send an argument but in otherBundle
when you click onbuttonValidatePrices
insetting
which it is not send or anything. Just created, a value stored into it, and nothing.. it's not related to theFragmentTransaction
.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.
来源:https://stackoverflow.com/questions/22999688/how-to-communicate-data-between-two-fragments-in-a-navigation-drawer