当前位置: 首页 > 知识库问答 >
问题:

如何在导航抽屉中的两个片段之间进行数据通信

路扬
2023-03-14

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

我尝试了很多解决方案(捆绑和意向),但我不能解决我的问题。

有谁能帮我一个忙吗。

这是我的第一个片段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);
    }
}

/***一个简单的{@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(position){: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);
          }

    }

}

谢谢你。

共有1个答案

左劲
2023-03-14

单击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  

然后,在片段内部使用getArgument()方法,如下所示:

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

然而,也许你可以找到一些有用的提示进入这个主题:与其他片段交流。

更新:

嗯,我试着从你的代码中举个例子,但是,它是哼…硬的;)。

>

  • 您没有接收参数,因为在selectem方法中,您没有用menu片段发送任何参数(但您的开关是如何做的,您的方法是正确的)。当您单击设置中的按钮ValidatePrices(它不是发送的)时,您尝试单独发送参数,但在其他中发送参数。只是创建了,一个值存储在里面,什么都没有…它与fragmenttransaction无关。

    菜单中,您尝试使用以下命令接收:

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

    但我认为有以下条件会更好:

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

    您应该:

    First(in MainActivity)=从MainActivity获取单击的旋转器的值到setting片段,创建一个包并将该值设置到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  
    

    Second(在菜单中)=接收此参数,如下所示:

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

  •  类似资料:
    • 我试图通过点击按钮将数据从导航抽屉的片段A发送到片段B。我尝试了捆绑和意图,但两者都不起作用。 在片段A中,我有editText和按钮,当我单击时,数据被传递到另一个片段。 在片段B中有一个textView,editText数据将在其中显示,但我在导航抽屉中找不到在片段之间通信的方法

    • 我有一个带有导航抽屉的应用程序,它为每个菜单项使用片段。 每次单击一个项目时,我都会替换当前片段。 问题是,在用户单击后显示新片段需要很长时间,并且它会被卡住。加载时间最长的片段是一个片段,其中还包含子片段的选项卡(一个片段包含一个RecyclerView)<有什么方法可以加快碎片的装载速度吗?(如果可能的话,可能会提前初始化它们?) 这是我的代码: HalachaFragment。cs(包含选项

    • 我试过了。我不成功。我正在写我的步骤。如果有人能帮我。 > 使用Android Studio创建新项目并选择“导航抽屉活动” 我将FrameLayout放在主活动中,如下所示 我使用v4创建了新类,如下所示。应用程序。碎片 我制作了碎片管理器,如下所示, 调用**public boolean onNavigationItemSelected(MenuItem项)** 我学了一点,但没能成功。这不是

    • 我不是Android方面的专家,但对片段非常感兴趣。非常感谢您的帮助! 我在我的应用程序中实现了一个导航抽屉。有一个基本抽屉活动和一些片段,用户可以从抽屉菜单中切换。如果我想转移到另一个片段,没有问题,但当我使用意图开始一个新的活动时,它是有效的。如果你看一下我下面的代码,你会发现我使用了两个独立的菜单:一个用于操作栏图标(购物车和搜索),意图在其中完美工作,另一个用于导航抽屉在片段之间跳转。有没

    • 我希望能够使用导航抽屉,并根据导航中的选择在不同片段之间进行更改。 我正在使用Android Studio,基本上我所做的是这样的: 使用内置模板“导航抽屉活动”创建了一个新项目 创建了一个空白片段 然后我更改了onNavigationDrawerItemSelected方法中的一些代码。 我的程序崩溃了,给了我很多我不理解的错误。我做错了什么?

    • 问题内容: 我是Android编程的新手,但是到目前为止一直表现不错。我已经读过很多关于这个问题的答案,但似乎无法使我的工作正常。基本上,我拥有的是带有导航抽屉的MainActivity。我有两个用相应的片段布局xmls正确初始化的片段。目前,我可以在启动应用程序时以及在单击抽屉中的每个项目时显示我的第一个片段;标题会发生变化;但是,片段保持不变。有什么建议?我认为相关的代码在下面(未显示的是Na