본문 바로가기

ANDROID

magicbox앱 코드로 이벤트 배우기

이전까지는 앱의 겉면, 레이아웃을 만드는 방법을 배워보았다. 오늘은 실제로 앱의 작동부분을 어떻게 짜야하는지를 작성해보고자 한다. 

 

일단 magicbox의 구성은 간단하다. 1)로그인 2)회원가입 3)메인화면-촬영/편집 4)촬영화면 5)편집화면

대부분의 경우 버튼을 통해 데이터를 전해주고, 화면과 화면사이를 오간다!

(아직 촬영과 편집은 구현하지 않은 상태이다)

 

이런 작동방식에 관한 코드는 app>java>자바파일들로 작성해준다. 예시를 통해 더 자세히 살펴보자.

 

MainActivity.java

1. 각종 import & 변수선언

package com.example.capstoneblackbox;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.example.capstoneblackbox.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {
    ActivityMainBinding binding;
    public static Context mcontext;

    Button btnlogin;
    Button btnsignin;

    EditText txtId;
    EditText txtPw;

    TextView iderr;
    TextView pwerr;

    String id;
    String pw;

    int idErr; int pwErr;

    private String pwValidation = "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d].{8,15}.$";
    private String idValidtion = "^[a-zA-Z]{1}[a-zA-Z0-9_]{4,11}$";

여기서 제일 중요한건 ActivityMainBinding binding이다! 다른방법도 있긴한데, binding을 쓰는게 뭔가 더 간결하달까... 그래서 자주 사용한다. binding은 여기서 작성하는 코드가 어떤 앱화면과 관계가 있는지를 명시해주는것이다! 위를 예시로 들면: main_activity에서 만든 앱화면 속 작동방식은 지금 여기 MainActivity.java에 작성할거다~ 라고 하는거다.

 

나머지는 각종 변수들 선언, 그리고 아이디와 패스워드 양식제한을 위한 규칙들을 적어놓은것이다.

 

 

 

2.onCreate 함수 / 버튼 클릭시 이벤트 처리

    //oncreate
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        View view = binding.getRoot();
        setContentView(view);
        mcontext = this;

        btnlogin = binding.buttonLogin;
        txtId = binding.textId;
        txtPw = binding.textPassword;

        btnlogin.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                id = txtId.getText().toString();
                pw = txtPw.getText().toString();

                if(id.compareTo("") == 0 || pw.compareTo("") == 0){
                    Toast.makeText(mcontext, "빈칸을 채워주세요", Toast.LENGTH_SHORT).show();
                }
                else if(idErr == 1 || pwErr == 1) {
                    Toast.makeText(mcontext,"형식에 맞춰서 작성해주십시오",Toast.LENGTH_SHORT).show();
                }
                else {
                    //TODO: id와 pw를 db에서 찾아서 >> 없으면 goHomeActivity
                    goHomeActivity();
                    //TODO: >> 있으면 토스트 발생 & 안넘어감
                    //Toast.makeText(mcontext, "입력하신 아이디/패스워드가 이미 존재합니다", Toast.LENGTH_LONG).show();
                }
            }
        });

 

앱을 구성하는 단위를 activity라고 하는데 (대충 화면 하나 라고 생각해도 일단은 괜찮다) activity는 생성부터 없어지기까지 일명 활동 수명 주기라는것이 존재한다. 각 단계마다 함수가 있고, 특정단계에서 이걸 수행하고 싶다면 그 단계 함수안에 적어주면 된다! 위에 onCreate는 생성 시 수행할 것들을 적어놓은 것이다.

 

여기서 바로 버튼 클릭시 수행할 내용들을 적어주었다. 클릭을 감지하면, btnlogin.setOnClickListener밑의 코드들을 수행하는거다. 빈칸인채로 로그인하려는 경우나, 형식에 맞지 않는 경우, 그리고 정상적인 경우로 나누어서 코드를 작성하였다.

 

 

 

3. 사용자 입력 받는법 / 다른화면으로 넘어가는법

        iderr = binding.idError;
        pwerr = binding.pwError;

        txtId.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            }
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            }
            @Override
            public void afterTextChanged(Editable editable) {
                id = txtId.getText().toString();
                if(!id.matches(idValidtion) || id.length() == 0 ) {
                    iderr.setVisibility(View.VISIBLE);
                    idErr = 1;
                }
                else {
                    iderr.setVisibility(View.GONE);
                    idErr = 0;
                }
            }
        });
        
        //oncreate 바깥에 있는 함수들
    public void goHomeActivity() {
        Intent intent = new Intent(MainActivity.this, HomeActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    }

로그인을 하려면 사용자로부터 아이디와 비밀번호를 입력받아야할것이다. 사용자의 입력을 받아와서 그에 맞게 행동하도록하는 부분이 바로 위 부분이다. txtId.addTextChangedListener()는 입력란의 내용이 바뀔때마다 불리는 함수이다. 나는 단순하게 변경될때마다 id라는 변수에 문자열을 가져와주고, 만약 형식에 안맞으면 경고문을 밑에 띄우는 방식으로 코드를 짰다.

 

그리고 마지막 함수는 다른 화면으로 이동시켜주는 함수다. 이 함수가 불리면 activity_home이라는 화면을 위에 띄워주게된다!

 

오늘은 여기서 마무리 하도록 하자.