繁体   English   中英

如何在导航抽屉中的两个片段之间传递数据

[英]How to communicate data between two fragments in a navigation drawer

我有一个导航抽屉,其中包含不同的片段(每个项目显示一个片段),我想将数据从一个片段传递到另一个片段。(我只有一个活动包含一个导航抽屉,其中有一个片段列表) 。

我尝试了很多解决方案(捆绑和意图),但我无法解决我的问题。

任何人都可以帮我恳求。

这是我的第一个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):package com.tutecentral.navigationdrawer;

/ ** *一个简单的{@link android.support.v4.app.Fragment}子类。 * * / public class Menu extends Fragment实现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

}

}

这是我使用适配器处理我的导航抽屉的主要活动(参见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()方法通过Bundle声明数据,如下所示:

// 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  

然后,在Fragment中,使用getArgument()方法:

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

但是,也许您可​​以在此主题中找到一些有用的提示: 与其他片段进行通信


更新:

好吧,我试图从你的代码中做一个例子但是,它很嗡嗡......很难;)。

  1. 你没有收到一个参数,因为在SelectItem方法中,你不会发送任何带有Menu片段的参数(但你的开关是怎么做的,你是正确的方式)。 你可以buttonValidatePrices尝试发送一个参数,但在其他Bundle当你在setting点击buttonValidatePrices时它不发送或任何东西。 刚刚创建,存储在其中的值,没有任何东西......它与FragmentTransaction无关。

  2. Menu ,您尝试接收:

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

    但我认为它会更好:

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

你应该:

首先 (在MainActivity中) =从MainActivity 获取单击的微调器的值到你的setting Fragment,创建一个Bundle并将此值设置SelectItem方法内的片段,如下所示:

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  

第二个在菜单中 )=接收此参数如下:

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

您可以使用http://developer.android.com/reference/android/content/BroadcastReceiver.html

或者,您可以将每个片段的侦听器设置为您的活动,并将数据从片段发送到活动,并直接在活动的另一个片段上调用方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM