如何在相同 activity 的片段之间传递值?

how pass value between fragments of same activity?

我是 android 开发的新手 我面临的问题是我无法在相同 activity 的片段之间传递字符串值 现在让我简要解释一下我的要求我有两个片段 fragment b 和 fragment c 。每当用户 select 片段 c 中微调器的值我应该传递给片段 c 中的列表视图到目前为止我已经尝试过是:

这是我的片段新需求片段(片段 c):

package com.example.first.servicefirst;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;

public class NewRequirements extends Fragment {


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    try {
        View view = inflater.inflate(R.layout.fragment_dialog_claim, container,
                false);
        final Button btnupdate;
        btnupdate = (Button) view.findViewById(R.id.update);
        final Spinner sbu = (Spinner) view.findViewById(R.id.sbuu);
        ArrayAdapter<CharSequence> adaptersbu = ArrayAdapter.createFromResource(
                getActivity().getBaseContext(), R.array.newrequirements, R.layout.spinnerlayout);
        adaptersbu.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        sbu.setAdapter(adaptersbu);
        final Spinner bu = (Spinner) view.findViewById(R.id.bu);

        adapterbu.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        bu.setAdapter(adapterbu);
        final Spinner sbuu = (Spinner) view.findViewById(R.id.sbu);
        ArrayAdapter<CharSequence> adaptersbuu = ArrayAdapter.createFromResource( 
        getActivity().getBaseContext(), R.array.newrequirements, R.layout.spinnerlayout);
        adaptersbuu.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        sbuu.setAdapter(adaptersbuu);
        final Spinner sc = (Spinner) view.findViewById(R.id.sc);
        ArrayAdapter<CharSequence> adaptersc = ArrayAdapter.createFromResource(
        getActivity().getBaseContext(), R.array.newrequirements, R.layout.spinnerlayout);
        adaptersc.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        sc.setAdapter(adaptersc);
        final Spinner ssc = (Spinner) view.findViewById(R.id.ssc);
        ArrayAdapter<CharSequence> adapterssc = ArrayAdapter.createFromResource
                (getActivity().getBaseContext(), R.array.newrequirements, R.layout.spinnerlayout);
        adapterssc.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        ssc.setAdapter(adapterssc);
        setHasOptionsMenu(true);
        final String str = sbu.getSelectedItem().toString();

        btnupdate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    Bundle bundle = new Bundle();
                    FragmentManager fm=getFragmentManager();
                    Add add = new Add();

                    bundle.putString("yes", str);
                    Log.i("Bundle", bundle.toString());
                    Log.v("Add", str);
                    add.setArguments(bundle);
                    FragmentTransaction ft=fm.beginTransaction();
                    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                    ft.replace(R.id.content_frame, add,"hi");
                    ft.addToBackStack(null);
                    ft.commit();


                }catch (Exception e){
                throw e;}
            }
        });
        return view;
    }catch (Exception e){
    throw e;
    }
 }

 }

这是片段添加(片段 B)

  package com.example.first.servicefirst;

import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
 import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;

import java.util.ArrayList;


public  class Add extends Fragment implements View.OnClickListener
{
public static Add()
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.activity_btn_add, container, false);
    Spinner ldsource=(Spinner)rootView.findViewById(R.id.lead_source);
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
            getActivity().getBaseContext(), R.array.dropbox1, R.layout.spinnerlayout);


    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    ldsource.setAdapter(adapter);
 //   EditText editText=(EditText)rootView.findViewById(R.id.title);

    Spinner ldtype=(Spinner)rootView.findViewById(R.id.ldtype);
    ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(
            getActivity().getBaseContext(), R.array.dropbox2,R.layout.spinnerlayout);

    adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    ldtype.setAdapter(adapter1);
    Spinner ldstatus=(Spinner)rootView.findViewById(R.id.ldstatus);
    TextView txt=(TextView)rootView.findViewById(R.id.spinnerTarget);
    ArrayAdapter<CharSequence> adapter2 = ArrayAdapter.createFromResource(
            getActivity().getBaseContext(), R.array.dropbox3, R.layout.spinnerlayout);

    adapter2.setDropDownViewResource(android.R.layout.simple_selectable_list_item);
    ldstatus.setAdapter(adapter2);
  //  Bundle bundle=getArguments();
  //  String good=bundle.getString("sbu");
    ArrayList<LdNewsItem> listContact = GetlistContact();
    final   ListView lv = (ListView)rootView.findViewById(R.id.ldrequirements);
    lv.setAdapter(new customListAdapterldrequirements(getActivity(), listContact));
//    lv.setOnTouchListener(new View.OnTouchListener() {
  //      @Override
    //    public boolean onTouch(View v, MotionEvent event) {
    //        return false;
       // }

        // Setting on Touch Listener for handling the touch inside ScrollView


    //});
sbu = getArguments().getString("yes");
     return rootView;


}

在以下位置收到空指针异常:sbu = getArguments().getString("yes");真的 Donno 哪里犯了错误 如果有人帮助我会非常有帮助 在此先感谢!

如果你想在Fragment之间传递数据,你可以使用下面的方法。

1.You 可以使用 LocalBroadcastManager 使用这个你可以发送数据到 LBM 并且你可以在监听广播数据的目标片段上实现接收器。

  1. 您可以在源片段和目标片段之间实现回调侦听器。 使用回调监听器 源片段将在回调方法中传递数据,目标片段将监听 it.Find 描述 here

  2. 您可以使用 EventBus 第三方库在两个片段之间传递数据的简单方法。

最好的方法是使用 Interface 并在 Activity 中处理所有片段更改逻辑。我已经快速编写了一些代码来向您展示这是如何工作的。我没有包含任何构造函数或 Fragment 实例化和填充代码。您必须在 Activity 中保留对两个 Fragment 的引用,并在其中处理 FragmentTransaction

如果您不知道该怎么做,请告诉我,我会尝试将其添加到示例代码中。

MainActivity.java

public class MainActivity extends Activity implements FragmentOneListener {

    private FragmentOne fragmentOne;
    private FragmentTwo fragmentTwo;


    @Override
    public void sendDataBack(String data) {
        if  (fragmentTwo != null) {
            fragmentTwo.doSomethingWithData(data);
        }
    }
}

FragmentOne.java

public class FragmentOne extends Fragment {
    private FragmentOneListener fragmentOneListener;

    private void sendDataBack(String data) {
        if  (fragmentOneListener != null) {
            fragmentOneListener.sendDataBack(data);
        }
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        try {
          fragmentOneListener = (FragmentOneListener) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString()+ " must implement FragmentOneListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        fragmentOneListener = null;
    }

    public interface FragmentOneListener {
        void sendDataBack(String data);
    }
}

FragmentTwo.java

public class FragmentTwo extends Fragment {

    public void doSomethingWithData(String data) {

    }
}