javascript - 我在 fragment 中有一个复选框,我希望它在单击注册按钮时发布一些数据这个按钮在我的主要 Activity 中?

标签 javascript android android-studio android-fragments android-checkbox

我第一次在 fragment 中工作...在主要 Activity 中我有一个 spinnerListner 并且随着微调器中的项目更改,在 fragment 容器中... fragment 相应地更改,我刚刚在 fragment.xml 文件中创建了一些复选框.. .我只想在每次注册点击时为每个选中的复选框发布并存储一个不同的值“NameoftheCheckbox”,并为每个未选中的复选框(甚至来自容器中未显示的 fragment )发布另一个值“Null”。就像我试图在我的主要 Activity 中通过 RegisterUser 函数存储名称和引脚的方式一样......

我的主要 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();

    }
}


我的 fragment 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;
    }

}


另一个 fragment 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. 在注册表单中,您有多个包含复选框的 fragment 。
4.当你点击注册按钮(在MainActivity里面),你想发布一些取决于复选框是否被选中的数据。

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

我正在提供一个简短的信息,您可以如何做到这一点。

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

  • 将 gradle 添加到您的项目中
    compile 'com.squareup:otto:1.3.8'
  • 在您的项目中创建一个 Events 类,并创建一个事件以在单击 REGISTER 按钮时发布。例如,您的 Events 类将包含以下代码。
    public class Events { public static class RegisterEvent { public RegisterEvent() {} } }
  • 在您的项目中创建一个 GlobalBus 类,以便您可以在整个应用程序中访问相同的总线。将以下代码写入其中。
    public class GlobalBus { private static Bus sBus; public static Bus getBus(){ if (sBus == null) sBus = new Bus(); return sBus; } }
  • 单击 REGISTER 按钮时,使用 otto 事件总线库发布 RegisterEvent 事件。
    registerBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { GlobalBus.getBus().post(new Events.RegisterEvent()); } });
  • 在 fragment A 中,您编写代码来订阅 otto 事件总线,如下所示。
    GlobalBus.getBus().register(this);
  • 然后,在 Fragment A 中,编写一个订阅方法来订阅事件(即 RegisterEvent),以便每当从 MainActivity 发布此事件时,您都会收到通知并显示正确的消息(即是否选中复选框)。您可以编写订阅方法如下。
    @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. }
  • 在每个 fragment 中重复与步骤 4 和 5 相同的过程。

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

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

    关于javascript - 我在 fragment 中有一个复选框,我希望它在单击注册按钮时发布一些数据这个按钮在我的主要 Activity 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43042631/

    相关文章:

    android - Gradle 同步失败并显示 "UnhandledIsstesReporter"

    java - 如何通过改造从列表函数中调用 return 的 url

    javascript - 从 eBay 中的查找商品高级 API 返回商品属性

    javascript - 如何在javascript中获取真正的取消引用的对象实例

    渲染时 Android 数据绑定(bind)滞后

    java - MTN 移动货币整合

    javascript - 传递 jQuery 或不同全局的模块模式

    javascript - 将记录添加到动态表(使用 AngularJS)会重新加载整个页面

    java - 如何更改 void 方法以在 Java 中返回值

    java - 使用 getSupportActionBar 显示后退按钮