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 楼答案
这可能已经晚了,但我认为这会对其他人有所帮助。因此,在进入下一步之前,请确保您可以在下一步按钮单击时验证/插入或执行任何您想对输入执行的操作,这就是在Kotlin中执行此操作的方式
现在validateStep将是一个函数,根据需要返回
True
或false
。下面是一个validateStep()
函数的简单示例。在这里,你可以做任何事情,如插入或验证等如果对任何人有帮助,一定要告诉我。快乐编码:)