问题描述
我有一个抽屉式导航栏,其中包含不同的片段(每个项目显示的片段),我想从一个片段到另一个传递数据。(我有一个包含导航抽屉,其中有一个列表只是一个活动的片段)。
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.
任何一个可以帮助我pleaaase。
Can any one help me pleaaase.
这是我的第一个片段A:
包com.tutecentral.navigationdrawer;
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);
}
}
}
这是FragmentB,我应该得到的数据(见getarguments):
包com.tutecentral.navigationdrawer;
This is the FragmentB where I should get the data (see getarguments): package com.tutecentral.navigationdrawer;
/ **
*一个简单的{@link android.support.v4.app.Fragment}子类。
*
* /
公共类菜单扩展片段实现OnClickListener,TabListener {
/** * 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
}
}
这是我使用适配器来处理我的抽屉式导航的主要活动(见开关(开关(possition){:
包com.tutecentral.navigationdrawer;
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);
}
}
}
}
感谢您。
推荐答案
当您点击 NavigationDrawer
,您可以用 setArguments内()
方法通过声明你DATAS一个捆绑
如下:
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
然后,您的片段里,使用 getArgument()
方法如下所示:
Bundle arg = getArguments();
int id_pass = arg.getInt("ARG_DATA_ID");
// id_pass = 1;
不过,也许你可以找到一些有用的提示到这个话题:的。
更新:
好吧,我试图从code做出了榜样,但是,它的嗡嗡声..硬)。
Well, I tried to make an example from your code but, it's hum.. hard ;).
-
您没有收到的参数,因为
的SelectItem
方法,你不菜单$ C发送的任何说法$ C>片段(但你的交换机是怎么做的,你在正确的方式)。您尝试separatly发送说法,但在其他
捆绑
当你在点击
这是不发送或任何东西。刚刚创建的,没有什么存储到它的价值,以及..它不涉及到buttonValidatePrices
设置FragmentTransaction
。
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"));
您应该:
第一的(以MainActivity) = 获取的值从 MainActivity $ C $
的点击微调的C>你的设置
片段,创建一个包和设置此值的片段里面的SelectItem
方法如下:
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");
这篇关于如何在导航抽屉通信的两个片段之间的数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!