我在片段中有一个复选框,我希望它在单击注册按钮时 post 一些数据这个按钮在我的主 activity 中?

I have a checkbox inside a fragment and i want it to post some data on click of a register button this button is inside my main activity?

我第一次在片段中工作...在主 activity 我有一个 spinnerListner 并且随着项目在微调器中的变化,在片段容器中...片段相应地变化,我刚刚创建fragment.xml 文件中的一些复选框...我只想 post 并为每个选中的复选框存储一个不同的值 "NameoftheCheckbox" ,为每个未选中的复选框存储另一个值 "Null" (即使来自每次注册点击时未显示在容器中的片段)。就像我试图通过 RegisterUser 函数在我的主 activity...

中存储名称和 pin 一样

我的主Activity

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private EditText et_Name, et_Pin;
    private Button RegisterBTN;
    private ProgressDialog progressDialog;

    private CheckBox checka, checkb;

    private Spinner sDropdown;
    ArrayAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        et_Name = (EditText)findViewById(R.id.etName);
        et_Pin = (EditText)findViewById(R.id.etPin);

        checka = (CheckBox)findViewById(R.id.checkBox_a);


        RegisterBTN = (Button)findViewById(R.id.btn_Reg);

        progressDialog = new ProgressDialog(this);
        //progressDialog.setMessage();

        adapter = ArrayAdapter.createFromResource(this, R.array.spinner_options, android.R.layout.simple_spinner_item);

        spinnerListner();

        RegisterBTN.setOnClickListener(this);


    }

    public void spinnerListner(){
        sDropdown = (Spinner)findViewById(R.id.spinner2);
        sDropdown.setAdapter(adapter);
        sDropdown.setOnItemSelectedListener(
                new AdapterView.OnItemSelectedListener() {
                    @Override
                    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                        switch (position){
                            case 0:
                               getSupportFragmentManager().beginTransaction().replace(R.id.frag, Info_frag.newInstance()).addToBackStack(null).commit();
                                break;
                            case 1:
                               getSupportFragmentManager().beginTransaction().replace(R.id.frag, Plumber_frag.newInstance()).addToBackStack(null).commit();
                                break;
                            case 2:
                                getSupportFragmentManager().beginTransaction().replace(R.id.frag, Painter_frag.newInstance()).addToBackStack(null).commit();
                                break;
                            case 3:
                                getSupportFragmentManager().beginTransaction().replace(R.id.frag, Electrician_frag.newInstance()).addToBackStack(null).commit();
                                //Toast.makeText(MainActivity.this,"F3", Toast.LENGTH_SHORT).show();
                                break;
                        }

                        /**
                         * TextView spinnerDailogText = (TextView)view;
                        Toast.makeText(MainActivity.this, "You selected:"+ spinnerDailogText.getText(), Toast.LENGTH_SHORT).show();*/
                    }

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

                    }
                }
        );
    }


    private void registerUser(){
        final String name = et_Name.getText().toString().trim();
        final String pin = et_Pin.getText().toString().trim();

        progressDialog.setMessage("Registering please wait...");
        progressDialog.show();

        StringRequest stringRequest = new StringRequest(Request.Method.POST,
                Constants.REGISTER,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        progressDialog.dismiss();

                        try {
                            JSONObject jsonObject = new JSONObject(response);
                            Toast.makeText(getApplicationContext(), jsonObject.getString("message"), Toast.LENGTH_LONG).show();
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        progressDialog.hide();
                        Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();
                    }
                }){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<>();
                params.put("reg_name", name);
                params.put("reg_pin", pin);
                return params;
            }
        };

        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(stringRequest);
    }

    @Override
    public void onClick(View v) {

        if (v == RegisterBTN);
            registerUser();

    }
}

我的片段Activity

public class Electrician_frag extends Fragment {

    public static Electrician_frag newInstance() {
        Electrician_frag fragment = new Electrician_frag();
        return fragment;
    }

    public Electrician_frag(){

    }

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

}

另一个片段Activity

public class Painter_frag extends Fragment {

    public static Painter_frag newInstance(){
        Painter_frag fragment = new Painter_frag();
        return fragment;
    }

    public Painter_frag(){

    }

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

我的PainterFragment.xml

<RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/white">

        <CheckBox
            android:id="@+id/checkBox_x"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:layout_marginLeft="124dp"
            android:layout_marginStart="124dp"
            android:text="@string/a"
            android:textSize="20sp"
            android:textStyle="bold" />

        <CheckBox
            android:id="@+id/checkBox_y"
            style="@android:style/Widget.Holo.Light.CompoundButton.CheckBox"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_marginLeft="70dp"
            android:layout_marginStart="70dp"
            android:layout_toEndOf="@+id/checkBox_x"
            android:layout_toRightOf="@+id/checkBox_x"
            android:text="@string/b"
            android:textSize="20sp"
            android:textStyle="bold" />

    </RelativeLayout>
</FrameLayout>

据我了解你的问题。我们有以下场景。
1. 你有 MainActivity.
2. 在这个 MainActivity 中,你正在尝试实现一个注册表单。
3. 在注册表单中,您有多个包含复选框的片段。
4. 当您单击注册按钮(在 MainActivity 内)时,您想要 post 一些取决于复选框是否被选中的数据。

如果是这种情况,您可以使用 Otto 事件总线库或 Guava 事件总线库轻松实现目标。这种方式还可以帮助您保持应用程序代码的模块化。

我将简要介绍如何操作。

按照以下步骤获取解决方案。

  1. 将 gradle 添加到您的项目中

    compile 'com.squareup:otto:1.3.8'

  2. 在您的项目中创建一个事件 class,并在单击“注册”按钮时为 post 创建一个事件。例如,您的活动 class 将包含以下代码。

    public class Events { public static class RegisterEvent { public RegisterEvent() {} } }

  3. 在您的项目中创建一个 GlobalBus class 以便您可以在整个应用程序中访问相同的总线。将下面的代码写入其中。

    public class GlobalBus { private static Bus sBus; public static Bus getBus(){ if (sBus == null) sBus = new Bus(); return sBus; } }

  4. Post 单击 REGISTER 按钮时使用 otto eventbus 库的 RegisterEvent 事件。

    registerBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { GlobalBus.getBus().post(new Events.RegisterEvent()); } });

  5. 在片段 A 中,您编写代码来订阅 otto 事件总线,如下所示。

    GlobalBus.getBus().register(this);

  6. 然后,在 Fragment A 中,编写一个订阅方法来订阅事件(即 RegisterEvent),以便每当从 MainActivity post编辑此事件时,您都会收到通知并且显示正确的消息(即复选框是否被选中)。您可以像下面这样写订阅方法。

    @Subscribe public void showMessage(Events.RegisterEvent events) { /// Here, you need to check whether checkboxes are checked or not. Send message to the server depending on that. Repeat same process for every checkbox. }

  7. 在每个片段中重复与步骤 4 和 5 相同的过程。

注意:请记住,当点击注册按钮时,每个片段都会收到通知。然后,它会检查复选框(复选框是否被选中)并将请求发送到服务器。

注意:如果您想了解更多关于 otto 事件总线库的信息,可以查看 https://tutorialwing.com/otto-event-bus-tutorial-example/
另外,如果你想使用Guava eventbus,你可以检查https://tutorialwing.com/android-eventbus-library-example/
这两个库各有利弊。