有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用material stepper库在单击时将所有输入的数据片段保存到数据库中

我正在使用这个库-https://github.com/stepstone-tech/安卓-material-stepper来构建一个逐步注册系统,在这个系统中,用户将一个接一个地填写每个字段,然后最终使用php脚本通过JSON将用户数据保存到数据库中

我有两个问题

1填充数据后,我不知道如何将输入的数据保存到数据库中

2如何在单击“下一步”按钮时验证每个单独输入的数据。(虽然,现在第一点更重要,但如果有人能帮我解决这两个问题,那就太好了!)

我只用了一个活动就做到了这一点,效果很好

片段之一。其中6个(它们都很相似)

public class EmailRegisterFragment extends Fragment implements Step {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_email_register, container, false);

    //initialize your UI

    return v;
}

@Override
public VerificationError verifyStep() {
    //return null if the user can go to the next step, create a new VerificationError instance otherwise
    return null;
}

@Override
public void onSelected() {
    //update UI when selected
}

@Override
public void onError(@NonNull VerificationError error) {
    //handle error inside of the fragment, e.g. show error on EditText
}
}

其中一个fragementLayout(它们都很相似)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"
xmlns:tools="http://schemas.安卓.com/tools"
安卓:layout_width="match_parent"
安卓:layout_height="match_parent"
xmlns:app="http://schemas.安卓.com/apk/res-auto"
tools:context=".UsernameRegisterFragment"
安卓:orientation="vertical">

<!-- TODO: Update blank fragment layout -->

<ImageView
    安卓:layout_width="30dp"
    安卓:layout_height="wrap_content"
    安卓:src="@drawable/back_left_light"
    安卓:layout_marginLeft="10dp"
    安卓:clickable="true"
    安卓:focusable="true"
    安卓:onClick="goToWelcomePage"
    安卓:layout_marginTop="20dp"/>

<TextView
    安卓:layout_width="match_parent"
    安卓:layout_height="wrap_content"
    安卓:text="Your Email Address"
    安卓:textSize="20sp"
    安卓:textStyle="bold"
    安卓:layout_marginTop="10dp"
    安卓:padding="20dp"
    />


<com.google.安卓.material.textfield.TextInputLayout
    安卓:layout_width="match_parent"
    安卓:layout_height="wrap_content"
    安卓:theme="@style/EditTextTheme"
    >
    <EditText
        安卓:layout_width="match_parent"
        安卓:inputType="textEmailAddress"
        安卓:layout_height="wrap_content"
        安卓:layout_marginLeft="30dp"
        安卓:layout_marginRight="30dp"
        安卓:hint="Input Your Email"
        安卓:textColor="@安卓:color/black"
        安卓:id="@+id/email"
        app:backgroundTint="@color/edit_text"
        安卓:theme="@style/EditTextTheme"
        安卓:textCursorDrawable="@null"
        />
</com.google.安卓.material.textfield.TextInputLayout>

<TextView
    安卓:layout_width="match_parent"
    安卓:layout_height="wrap_content"
    安卓:layout_marginLeft="30dp"
    安卓:layout_marginRight="30dp"
    安卓:layout_marginTop="20dp"
    安卓:onClick="goToRegisterWithPhone"
    安卓:clickable="true"
    安卓:text="You dont have an email? Click here"/>
    </LinearLayout>

活动布局(显示下一步返回完成按钮和进度条)

<?xml version="1.0" encoding="utf-8"?>
<com.stepstone.stepper.StepperLayout xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"
xmlns:app="http://schemas.安卓.com/apk/res-auto"
安卓:id="@+id/stepperLayout"
安卓:layout_width="match_parent"
安卓:layout_height="match_parent"
app:ms_stepperType="progress_bar"
app:ms_nextButtonColor="@color/white"
app:ms_completeButtonColor="@color/white"
app:ms_backButtonColor="@color/white"
/>

活动Java文件

public class IntroActivity extends AppCompatActivity implements StepperLayout.StepperListener{

private StepperLayout mStepperLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {


    //remove action and status bar

    if (getSupportActionBar() != null)
        getSupportActionBar().hide();

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_intro);


    mStepperLayout = (StepperLayout) findViewById(R.id.stepperLayout);
    mStepperLayout.setAdapter(new MyStepperAdapter(getSupportFragmentManager(), this));
    mStepperLayout.setListener(this);


}

@Override
public void onCompleted(View completeButton) {
    Toast.makeText(this, "onCompleted!", Toast.LENGTH_SHORT).show();
}

@Override
public void onError(VerificationError verificationError) {
    Toast.makeText(this, "onError! -> " + verificationError.getErrorMessage(), Toast.LENGTH_SHORT).show();
}

@Override
public void onStepSelected(int newStepPosition) {

}

@Override
public void onReturn() {
    finish();
}

public void goToWelcomePage(View view){
    Intent intent = new Intent(this, WelcomeActivity.class);
    startActivity(intent);
}
public void goToRegisterWithPhone(View view){
    Intent intent = new Intent(this, IntroActivity.class);
    startActivity(intent);
}
}

就像我说的,我只使用了一个使用截击库的活动。看看吧

注册表活动。java

public class RegisterActivity extends AppCompatActivity {

private EditText username, email, password;
private Button btn_register_final;
private ProgressBar loading;
private TextView login_text;

private static String URL_REGISTER = "http://78d24f21.ngrok.io/misnap/register.php";
SessionManager sessionManager;

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

    sessionManager = new SessionManager(this);

    username = findViewById(R.id.etUsername);
    email = findViewById(R.id.etEmail);
    password = findViewById(R.id.etPassword);
    btn_register_final = findViewById(R.id.btnRegisterFinal);
    loading = findViewById(R.id.loading);
    login_text = findViewById(R.id.btnLoginText);


    btn_register_final.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //do something here after clicking register
            Register();
        }
    });


    login_text.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
            v.getContext().startActivity(intent);
        }
    });


}

public void Register(){
    loading.setVisibility(View.VISIBLE);
    btn_register_final.setVisibility(View.GONE);

    final String username = this.username.getText().toString().trim();
    final String email = this.email.getText().toString().trim();
    final String password = this.password.getText().toString().trim();

    StringRequest stringRequest = new StringRequest(Request.Method.POST, URL_REGISTER,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        JSONObject jsonObject = new JSONObject(response);
                        String success = jsonObject.getString("success");
                        if(success.equals("1")){
                            sessionManager.createSession(username, email);

                            Intent intent = new Intent(RegisterActivity.this, HomeActivity.class);
                            intent.putExtra("username", username);
                            intent.putExtra("email", email);
                            startActivity(intent);

                            loading.setVisibility(View.GONE);
                            btn_register_final.setVisibility(View.VISIBLE);
                        }

                    } catch (JSONException e){
                        e.printStackTrace();
                        Toast.makeText(RegisterActivity.this, "Unable to register" + e.toString(), 
Toast.LENGTH_SHORT).show();
                        loading.setVisibility(View.GONE);
                        btn_register_final.setVisibility(View.VISIBLE);
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(RegisterActivity.this, "Unable to register" + error.toString(), 
Toast.LENGTH_SHORT).show();
                    loading.setVisibility(View.GONE);
                    btn_register_final.setVisibility(View.VISIBLE);
                }
            })
    {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<>();
            params.put("username", username);
            params.put("email", email);
            params.put("password", password);
            return params;
        }
    };
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(stringRequest);
}
}

寄存器。php

<?php
require_once("connect.php");
if ($_SERVER['REQUEST_METHOD']=='POST'){
$username = $_POST['username'];
$email = $_POST['email'];
$password = $_POST['password'];

$password = password_hash($password, PASSWORD_DEFAULT);

$sql = "INSERT INTO users (username, email, password)
 VALUES ('$username', '$email', '$password')";

 if(mysqli_query($conn, $sql)){
    $result["success"] = "1";
    $result["message"] = "success";

    echo json_encode($result);
    mysqli_close($conn);
 }

 else{
    $result["success"] = "0";
    $result["message"] = "An error occured";

    echo json_encode($result);
    mysqli_close($conn);

 }
}
?>

如何对片段使用相同的逻辑


共 (1) 个答案

  1. # 1 楼答案

    这可能已经晚了,但我认为这会对其他人有所帮助。因此,在进入下一步之前,请确保您可以在下一步按钮单击时验证/插入或执行任何您想对输入执行的操作,这就是在Kotlin中执行此操作的方式

     // To be somewhere inside your Step
    
    override fun verifyStep(): VerificationError? {
            if (validateStep()){
                return null
            }
            else
                VerificationError("Any error message")
        } 
    

    现在validateStep将是一个函数,根据需要返回Truefalse。下面是一个validateStep()函数的简单示例。在这里,你可以做任何事情,如插入或验证等

    private fun validateStep(): Boolean {
    
            var isValid = true
    
            val name = binding.etCustomerName.text.toString()
            val email = binding.etCustomerEmail.text.toString()
          
    
            if (name.isEmpty()) {
                isValid = false
            } 
    
            if (email.isEmpty()) {
                isValid = false
              
            } else if (!Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
                isValid = false
            }
    
    
            return isValid
        }
    

    如果对任何人有帮助,一定要告诉我。快乐编码:)