이번에는 Activity 활용편 2(EditText활용, 입력 이벤트 리스너)에 대해 알아보겠습니다.
시작하기에 앞서 이 글은 공부하면서 작성하는 것이기 때문에 잘못된 내용이 있을 수도 있습니다.
잘못된 내용은 댓글로 알려주시면 감사하겠습니다.
저번 글에서는 단순히 입력한 것으로 끝났다면 이번에는 목표값과 입력값이 달랐을 때 로그인이 되지 않도록 하는
기능을 구현해보겠습니다.
먼저 저번 글에서 없애야 할 코드가 2가지 있습니다.
MainActivity.xml에서 onCreate안의
RelativeLayout_login.setClickable(true);
와
activity_login.xml에서 버튼으로 구현한 Relativelayout 안의
android:clickable="true"
입니다.
이제 코드를 변경해보겠습니다. 오늘은 MainActivity.xml안에서만 수정하면 되기에 다른 탭은 볼 필요 없습니다.
당연하게도, 모든 정보를 입력해야 하기에 처음에는 버튼 비활성화 상태로 두어야 합니다.
앞서
RelativeLayout_login.setEnabled(true)
을 없애버렸기 때문에 onCreate 안에
RelativeLayout_login.setEnabled(false)
를 입력해줍니다.
그리고 사용자의 입력값을 저장할 전역변수를 선언해줍니다.
String inputEmail = "";
String inputPassword = "";
아래는 목표값입니다.
String emailOK = "123@gmail.com";
String passwordOK = "1234";
이제 입력값을 정확히 입력했는지 비교하는 코드를 짤 건데 여기서는 .addTextChargedListener를 사용할 것입니다.
기본적으로 .addTextChargedLister를 입력하면 코드는
TextInputEditText_email.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) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
구조로 생성이 됩니다.
여기서 건드릴 것은 onTextChanged 부분입니다. 하지만 문제가 하나가 있는데, 이메일 또는 비밀번호를 받을 때
위에서 전역변수로 정의한 inputEmail과 Charsequence로 정의된 s의 자료형이 달라 입력이 안되는 것입니다.
이를 해결하는 방법은 2가지 있는데, 하나는 inputEmail을 Charsequence로 정의하는 것,
다른 하나는 toString으로 강제 형변환하는 방법입니다.
이것을 코드로 나타내면
inputEmail = s.toString();
이고 이것 이후에 버튼을 활성화하는
RelativeLayout_login.setEnable(true);
코드까지 입력하면 됩니다.
하지만 이런 식으로 하면, null 애러를 피하기 어렵습니다.
null 애러라는 것은 아무것도 입력하지 않았는데 로그인이 되는 것 같은 보안적인 애러입니다.
이를 해결하기 위해서 위 두 코드를
if(s != null) {
inputEmail = s.toString();
RelativeLayout_login.setEnable(true);
}
처럼 if문 안으로 넣습니다.
그러나 여기에도 보완점이 존재하는데, 이메일과 비밀번호 모두 쳐야 활성화가 되도록 설정해야 한다는 점입니다.
이를 해결하기 위해 새로운 함수를 onCreate 내에 선언하고 true자리에 함수를 입력해줍니다.
코드는 아래와 같습니다.
public boolean validation() {
return inputEmail.equals(emailOK) && inputPassword.equals(passwordOK);
}
이를 전체 정의하면 코드는
package com.electrolion19.learningandroid;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.Toast;
import com.google.android.material.textfield.TextInputEditText;
public class MainActivity extends AppCompatActivity {
//뒤로가기 2번 클릭 시 종료
private long lastTimeBackPressed; //뒤로가기 버튼이 클릭된 시간
@Override
public void onBackPressed()
{
//2초 이내에 뒤로가기 버튼을 재 클릭 시 앱 종료
if (System.currentTimeMillis() - lastTimeBackPressed < 2000)
{
finish();
return;
}
//'뒤로' 버튼 한번 클릭 시 메시지
Toast.makeText(this, "'뒤로' 버튼을 한번 더 누르시면 앱이 종료됩니다.", Toast.LENGTH_SHORT).show();
//lastTimeBackPressed에 '뒤로'버튼이 눌린 시간을 기록
lastTimeBackPressed = System.currentTimeMillis();
}
TextInputEditText TextInputEditText_email, TextInputEditText_password;
RelativeLayout RelativeLayout_login;
String emailOK = "123@gmail.com";
String passwordOK = "1234";
String inputEmail = "";
String inputPassword = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//1. 값을 가져온다 - 검사 (123@gmail.com / 1234)
//2. 클릭을 감지한다
//3. 1번의 값을 다음 액티비티로 넘긴다
TextInputEditText_email = findViewById(R.id.TextInputEditText_email);
TextInputEditText_password = findViewById(R.id.TextInputEditText_password);
RelativeLayout_login = findViewById(R.id.RelativeLayout_login);
RelativeLayout_login.setClickable(false);
TextInputEditText_email.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) {
//Log.d("SENTI",s + "," + count);
if (s != null) {
inputEmail = s.toString();
RelativeLayout_login.setEnabled(validation());
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
TextInputEditText_password.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) {
//Log.d("SENTI",s + "," + count);
if(s != null) {
inputPassword = s.toString();
RelativeLayout_login.setEnabled(validation());
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
// RelativeLayout_login.setClickable(true);
RelativeLayout_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String email = TextInputEditText_email.getText().toString();
String password = TextInputEditText_password.getText().toString();
Intent intent = new Intent(MainActivity.this, LoginResultActivity.class);
intent.putExtra("email", email);
intent.putExtra("password", password);
startActivity(intent);
}
});
}
public boolean validation() {
return inputEmail.equals(emailOK) && inputPassword.equals(passwordOK);
}
}
입니다.
다음 시간에는 RecylerView 구현하는 법을 알아보겠습니다.
▼ 이전글
2022.01.03 - [앱 개발/안드로이드] - 06_Activity 활용-1
▼ 다음글
'앱 개발 > 안드로이드' 카테고리의 다른 글
06_Activity 활용-1 (0) | 2022.01.03 |
---|---|
05_앱 레이아웃 따라하기 실전-3 (0) | 2022.01.03 |
04_앱 레이아웃 따라하기 실전-2 (0) | 2022.01.01 |
03_앱 레이아웃 따라하기 실전-1 (0) | 2021.12.29 |
02_화면그리기, 레이아웃 (0) | 2021.12.29 |