如何将Activity1 / fragmentA中包含的数据传递给Activity1 / fragmentB然后将其传递给Activity2

时间:2019-04-10 13:23:44

标签: java android android-fragments android-activity android-bundle

我正在开发一个包含2个活动的应用程序。 在我的活动1中,我有一个包含片段的NavigationDrawer。 我有2个片段中的微调框。

我想将Fragment1的数据和Fragment2的数据传递到Fragment3(仍处于相同的活动中),然后编写一个Button,将在Fragment 3中收集的数据发送到Activity 2。

我可以将数据从活动1传递到活动2而无铅,但是我不知道如何从Fragment检索数据,然后将它们传递给活动2。

我是Fragments中的新手。...

我的片段之一的代码,包括SPINNERS:

public static TypeInterventionFragment newInstance() {return (new TypeInterventionFragment()); }


    @Override
    public View  onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view= inflater.inflate(R.layout.fragment_type_intervention, container, false);

        mSpinner1 = (Spinner) view.findViewById(R.id.spinner1);
        mSpinner2 = (Spinner) view.findViewById(R.id.spinner2);
        mSpinner3 = (Spinner) view.findViewById(R.id.spinner3);

        mSpinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                String selectedClass = parent.getItemAtPosition(position).toString();
                switch (selectedClass)
                {
                    case "Constatation du dégat des eaux":
                        // assigning div item list defined in XML to the div Spinner
                        mSpinner2.setAdapter(new ArrayAdapter<String>(getActivity(),
                                android.R.layout.simple_spinner_dropdown_item,
                                getResources().getStringArray(R.array.sousliste1)));

                        mSpinner3.setAdapter(new ArrayAdapter<String>(getActivity(),
                                android.R.layout.simple_spinner_dropdown_item,
                                getResources().getStringArray(R.array.resultat)));
                        break;

                    case "Relevé humidité":
                        mSpinner2.setAdapter(new ArrayAdapter<String>(getActivity(),
                                android.R.layout.simple_spinner_dropdown_item,
                                getResources().getStringArray(R.array.sousliste2)));
                        break;

                    case "Thermographie Infrarouge":
                        mSpinner2.setAdapter(new ArrayAdapter<String>(getActivity(),
                                android.R.layout.simple_spinner_dropdown_item,
                                getResources().getStringArray(R.array.sousliste3)));
                        break;

                    case "Mise en pression":
                        mSpinner2.setAdapter(new ArrayAdapter<String>(getActivity(),
                                android.R.layout.simple_spinner_dropdown_item,
                                getResources().getStringArray(R.array.sousliste4)));
                        break;

                    case ">Mise en évacuation équipement sanitaire":
                        mSpinner2.setAdapter(new ArrayAdapter<String>(getActivity(),
                                android.R.layout.simple_spinner_dropdown_item,
                                getResources().getStringArray(R.array.sousliste5)));
                        break;

                    case "Aspersion équipement sanitaire":
                        mSpinner2.setAdapter(new ArrayAdapter<String>(getActivity(),
                                android.R.layout.simple_spinner_dropdown_item,
                                getResources().getStringArray(R.array.sousliste6)));
                        break;

                    case "Inspection vidéo dans canalisation":
                        mSpinner2.setAdapter(new ArrayAdapter<String>(getActivity(),
                                android.R.layout.simple_spinner_dropdown_item,
                                getResources().getStringArray(R.array.sousliste7)));
                        break;

                }

            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }

        });

        return view;

    }

}

我希望从那些微调器中获得选中的项目给我,显示在包含Textview的片段中,然后通过按下按钮将这些数据传递给另一个活动。

如果您知道该怎么做,则可能会挽救我的命 我两个月以来一直在为此工作

非常感谢 还有我的法国朋友:Merci les amis si vous pouvez m'aider !!!

3 个答案:

答案 0 :(得分:0)

无论何时实例化活动的片段,都可以保留指向它们的链接。 假设您的ActivityA和片段创建块如下所示:

public class ActivityA extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FragmentTransaction fragmentTransactionA = getSupportFragmentManager().beginTransaction();
        fragmentTransactionA.replace(R.id.yourFragmentAContainerID, new FragmentA(), "fragmentA");
        fragmentTransactionA.commit();
        FragmentTransaction fragmentTransactionB = getSupportFragmentManager().beginTransaction();
        fragmentTransactionB.replace(R.id.yourFragmentBContainerID, new FragmentB(), "fragmentB");
        fragmentTransactionB.commit();
    }
}

您不仅可以使用new FragmentA()new FragmentB(),还可以在活动上创建属性并为它们分配新片段的值,从而有效地在ActivityA和片段之间创建链接。

public class ActivityA extends AppCompatActivity {

    private FragmentA fragmentA;
    private FragmentB fragmentB;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FragmentTransaction fragmentTransactionA = getSupportFragmentManager().beginTransaction();
        fragmentA = new FragmentA();
        fragmentTransactionA.replace(R.id.yourFragmentAContainerID, fragmentA, "fragmentA");
        fragmentTransactionA.commit();
        FragmentTransaction fragmentTransactionB = getSupportFragmentManager().beginTransaction();
        fragmentB = new FragmentB();
        fragmentTransactionB.replace(R.id.yourFragmentBContainerID, fragmentB, "fragmentB");
        fragmentTransactionB.commit();
    }
}

也就是说,现在您可以在活动时随时从片段中获取变量。假设您要获取片段A的“ propertyX”和片段B的“ propertyY”,现在只要在有Activity的情况下,只需在活动中调用fragmentA.getPropertyX()fragmentB.getPropertyY()即可,然后再更改为ActivityB方法已经公开,并且是公开的。这只是一个示例,因为我们没有针对您的问题的所有代码,所以我自由地创建了一个示例类。

如果您仍然需要帮助,请进来。

答案 1 :(得分:0)

建议在片段之间进行通信的方法是创建一个共享的ViewModel对象。

这是来自Developer.android.com的链接:

Communicate with other fragments | Android Developers

您应该寻找的是使用“活动”作为片段之间的桥梁。使用接口是常见的做法。

答案 2 :(得分:0)

非常感谢, 这是我的MainActivity的代码:

class TestController
{
  public function test () 
  {
    $pnl = App::make('RegisterController')->getData($init = ['startdate' => '2018-04-10','enddate' => '2019-04-10']);   
  } 
}

Class RegisterController
{
    public function getData($init = false)
    {
        $init = [
            'startdate' => Input::get('startdate', Carbon::now()->firstOfMonth()->toDateString()),
            'enddate' => Input::get('enddate', Carbon::now()->lastOfMonth()->toDateString())
        ];
        Debugbar::info($init); // <----date is null

        return $init;
    }
}

}