与简单条件混淆

时间:2018-07-18 14:52:01

标签: java android firebase-realtime-database

我不知道为什么将我与简单的if / else条件混淆?在我的应用程序(电话验证部分)中,默认情况下,我将sendVerification按钮设置为disable,当我输入文字时,它应该启用。但这没有启用吗?我的病怎么了?即使我尝试其他部分,同样的问题!

XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".PhoneAuthActivity">

    <include
        android:id="@+id/PhoneToolbar"
        layout="@layout/app_bar">
    </include>

    <LinearLayout
        android:id="@+id/DialLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/PhoneToolbar"
        android:orientation="horizontal"
        android:weightSum="10">

        <ImageView
            android:id="@+id/dial"
            android:layout_width="50dp"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:src="@drawable/dial"
            android:layout_weight="1"/>

        <EditText
            android:id="@+id/PhoneNumber"
            android:layout_width="270dp"
            android:layout_height="wrap_content"
            android:hint="Phone Number"
            android:layout_weight="8"
            android:ems="10"
            android:inputType="phone"/>

        <ProgressBar
            android:id="@+id/PhoneProgress"
            style="?android:attr/progressBarStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/LockLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/DialLayout"
        android:orientation="horizontal"
        android:weightSum="10">

        <ImageView
            android:id="@+id/lock"
            android:layout_width="50dp"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:src="@drawable/lock"
            android:layout_weight="1"/>

        <EditText
            android:id="@+id/code"
            android:layout_width="270dp"
            android:layout_height="wrap_content"
            android:hint="Verification Code"
            android:layout_weight="8"/>

        <ProgressBar
            android:id="@+id/CodeProgress"
            style="?android:attr/progressBarStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

    </LinearLayout>

    <TextView
        android:id="@+id/VerificationText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="91dp"
        android:text="A verification code will be sent to your phone number" />

    <Button
        android:id="@+id/sendVerification"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="23dp"
        android:backgroundTint="#FF0000"
        android:text="Send Verification" />

</RelativeLayout>

这是活动

package com.jimmytrivedi.lapitchat;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ProgressBar;

import com.google.firebase.FirebaseException;
import com.google.firebase.auth.PhoneAuthCredential;
import com.google.firebase.auth.PhoneAuthProvider;

import java.util.concurrent.TimeUnit;

public class PhoneAuthActivity extends AppCompatActivity {

    private LinearLayout DialLayout, LockLayout;
    private EditText PhoneNumber, code;
    private ProgressBar PhoneProgress, CodeProgress;
    private Button sendVerification;
    private Toolbar PhoneToolbar;
    private PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallbacks;
    private String number;

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

        DialLayout = findViewById(R.id.DialLayout);
        LockLayout = findViewById(R.id.LockLayout);
        PhoneNumber = findViewById(R.id.PhoneNumber);
        code = findViewById(R.id.code);
        PhoneProgress = findViewById(R.id.PhoneProgress);
        CodeProgress = findViewById(R.id.CodeProgress);
        sendVerification = findViewById(R.id.sendVerification);
        PhoneToolbar = findViewById(R.id.PhoneToolbar);

        PhoneProgress.setVisibility(View.INVISIBLE);
        CodeProgress.setVisibility(View.INVISIBLE);
        sendVerification.setEnabled(false);

        setSupportActionBar(PhoneToolbar);
        getSupportActionBar().setTitle("Welcome to Phone Verification");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        number = PhoneNumber.getText().toString();
        if (!number.isEmpty()) {
            sendVerification.setEnabled(true);
        }

        sendVerification.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                PhoneNumber.setEnabled(false);
                PhoneProgress.setVisibility(View.VISIBLE);


                PhoneAuthProvider.getInstance().verifyPhoneNumber(
                        number,
                        60,
                        TimeUnit.SECONDS,
                        PhoneAuthActivity.this,
                        mCallbacks
                );
            }
        });


        mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {

            }

            @Override
            public void onVerificationFailed(FirebaseException e) {

            }
        };
    }
}

3 个答案:

答案 0 :(得分:1)

number = PhoneNumber.getText().toString();
if (!number.isEmpty()) {
    sendVerification.setEnabled(true);
}

在您有机会开始键入之前,所有这些操作都在onCreate中执行。一旦开始键入,此代码将不会再次执行。创建活动时,它只会执行一次。

解决方案:在电话号码editText上设置TextWatcher,并在TextWatcher#afterTextChanged方法中启用/禁用sendVerification。有关如何操作的说明,请参见here

答案 1 :(得分:0)

您需要一个TextWatcher来做您想做的事情,因此将TextWatcher添加到您的EditText / TextView中,如下所示:

PhoneNumber.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    if (s.length()>0) {
                        sendVerification.setEnabled(true);
                    }

                }

                @Override
                public void afterTextChanged(Editable s) {

                }
            });

您的代码无法正常工作的原因是因为在您开始键入后onCreate()方法没有被调用,这意味着启用视图的条件仅被检查了一次,因此不会再次检查任何更改。

答案 2 :(得分:0)

在您的代码中

number = PhoneNumber.getText().toString();
    if (!number.isEmpty()) {
        sendVerification.setEnabled(true);
    }

在onCreate上仅执行一次。您必须添加一个文本更改监听器,并相应地启用/禁用按钮 喜欢,

PhoneNumber.addTextChangedListener(new TextWatcher() {
 @Override
  public void afterTextChanged(Editable s) {}

 @Override
  public void beforeTextChanged(CharSequence s, int start,
   int count, int after) {
 }

 @Override
  public void onTextChanged(CharSequence s, int start,
  int before, int count) {
  if(s.length() > 0)
  {
    sendVerification.setEnabled(true);
  }

} });