본문 바로가기
안드로이드 스튜디오

수강신청 어플 만들기 - Android Studio with JAVA(1)

by s2jinny 2022. 12. 11.

(1편)회원가입->로그인(중복체크)->공지사항->강의 목록->시간표 추가 및 중복체크->시간표 조회

(2편)시간표 삭제->강의 경쟁률, 학점 제한

(3편)강의 인기 순위 리스트->어플리케이션 정보->개인정보 암호화-> 어플 개발

 

오늘은 (1편) 회원가입부터 시간표 조회까지 공부한 내용을 정리해서 올리겠다!!

모든 코드를 여기에 적기보다 일부 코드만 골라서 기록할 예정이고, 최대한 간단하게 설명할 예정.

완벽한 코드는 깃허브에 ~

 

1. 로그인 LoginActivity.java

  loginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final String userID=idText.getText().toString();
                String userPassword=passwordText.getText().toString();

Response.Listener<String> responseListener=new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try{

                            JSONObject jsonResponse=new JSONObject(response);
                            boolean success=jsonResponse.getBoolean("success");
                            if(success){
                                AlertDialog.Builder builder=new AlertDialog.Builder(LoginActivity.this);
                                dialog=builder.setMessage("로그인에 성공했습니다.")
                                        .setPositiveButton("확인",null)
                                        .create();
                                dialog.show();
                                Intent intent=new Intent(LoginActivity.this,MainActivity.class);

                                //user id에대한 정보를 보내줌,
                                intent.putExtra("userID",userID);

                                LoginActivity.this.startActivity(intent);
                                finish();
                            }
                            else{
                                AlertDialog.Builder builder=new AlertDialog.Builder(LoginActivity.this);
                                dialog=builder.setMessage("로그인에 실패했습니다. 다시 시도해주세요")
                                        .setNegativeButton("다시시도",null)
                                        .create();
                                dialog.show();

                            }

                        }catch (Exception e){
                            e.printStackTrace();

                        }
                    }
                };

                LoginRequest loginRequest=new LoginRequest(userID,userPassword,responseListener);
                RequestQueue queue= Volley.newRequestQueue(LoginActivity.this);
                queue.add(loginRequest);
            }
        });

로그인 버튼 눌렀을 때 userID,userPassword에 담아주고 결과를 받아오기 위해서 JSONObject로 php파일과 연동해준다.

로그인에 성공하면 MainActivity로 넘어간다. (공지사항부분으로) 

Volley 라이브러리 이용한다. 이때 volley란  HTTP 라이브러리이고 앱에서 서버와 http 통신을 할 때 HttpURLConnection을 사용하면 직접 요청과 응답을 받는 것이 가능하다. 

 

2.회원가입

 final Button validateButton =(Button)findViewById(R.id.validateButton);
        validateButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Toast.makeText(RegisterActivity.this,"ok",Toast.LENGTH_SHORT).show();
                String userID=idText.getText().toString();
                if(validate){
                    return; //ok
                }
                if(userID.equals("")){
                    AlertDialog.Builder builder=new AlertDialog.Builder(RegisterActivity.this);
                    dialog=builder.setMessage("아이디는 빈 칸일 수 없습니다.")
                            .setPositiveButton("확인",null)
                            .create();
                    dialog.show();
                    return;
                }
                //중복체크
                Response.Listener<String> responseListener = new Response.Listener<String>(){

                    @Override
                    public void onResponse(String response) {
                        try{
                            Toast.makeText(RegisterActivity.this, response, Toast.LENGTH_LONG).show();

                            JSONObject jsonResponse = new JSONObject(response);
                            boolean success = jsonResponse.getBoolean("success");
                            if(success){//사용할 수 있는 아이디라면
                                AlertDialog.Builder builder = new AlertDialog.Builder(RegisterActivity.this);
                                dialog = builder.setMessage("사용가능한 아이디입니다.")
                                        .setPositiveButton("확인", null)
                                        .create();
                                dialog.show();
                                idText.setEnabled(false);//아이디값을 바꿀 수 없도록 함
                                validate = true;//검증완료
                                idText.setBackgroundColor(getResources().getColor(R.color.colorGray));
                                validateButton.setBackgroundColor(getResources().getColor(R.color.colorGray));
                            }else{//사용할 수 없는 아이디라면
                                AlertDialog.Builder builder = new AlertDialog.Builder(RegisterActivity.this);
                                dialog = builder.setMessage("이미 존재하는 아이디 입니다.")
                                        .setNegativeButton("확인", null)
                                        .create();
                                dialog.show();
                            }

                        }
                        catch(Exception e){
                            e.printStackTrace();
                        }
                    }
                };//Response.Listener 완료

                //Volley 라이브러리를 이용해서 실제 서버와 통신을 구현하는 부분
                ValidateRequest validateRequest = new ValidateRequest(userID, responseListener);
                RequestQueue queue = Volley.newRequestQueue(RegisterActivity.this);
                queue.add(validateRequest);
            }
        });

        Button registerButton=(Button) findViewById(R.id.registerButton);
        registerButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String userID=idText.getText().toString();
                String userPassword=passwordText.getText().toString();

                String userMajor=spinner.getSelectedItem().toString();
                String userEmail=emailText.getText().toString();

                if(!validate){
                    AlertDialog.Builder builder=new AlertDialog.Builder(RegisterActivity.this);
                    dialog=builder.setMessage("먼저 중복 체크를 해 주세요")
                            .setPositiveButton("확인",null)
                            .create();
                    dialog.show();
                    return;
                }
                if(userID.equals("")||userPassword.equals("")||userMajor.equals("")||userEmail.equals("")){
                    AlertDialog.Builder builder=new AlertDialog.Builder(RegisterActivity.this);
                    dialog=builder.setMessage("빈칸없이 입력해주세요")
                            .setPositiveButton("확인",null)
                            .create();
                    dialog.show();
                    return;

                }


                Response.Listener<String>responseListener=new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try{
                            JSONObject jsonResponse=new JSONObject(response);
                            boolean success=jsonResponse.getBoolean("success");
                            if(success){
                                AlertDialog.Builder builder=new AlertDialog.Builder(RegisterActivity.this);
                                dialog=builder.setMessage("회원등록에 성공하였습니다")
                                        .setPositiveButton("확인",null)
                                        .create();
                                dialog.show();
                                finish();
                            }
                            else{
                                AlertDialog.Builder builder=new AlertDialog.Builder(RegisterActivity.this);
                                dialog=builder.setMessage("회원등록에 실패했습니다.")
                                        .setNegativeButton("확인",null)
                                        .create();
                                dialog.show();

                            }
                        }

 

회원가입 버튼 누르면 빈칸 입력 안되게 다이아로그로 띄어주고 중복체크 해준다. 자세한건 주석확인 ㄱ ㄱ

(너무길어서 생략한 부분: 초기화, 스피너,catch(), registerRequest 선언부분 등 깃허브에 자세한 코드 있음.)

 

3.notice 공지사항 (notice.java&noticeListAdapter&MainActivity.java)

3-1. notice안에는 String notice, String name, String date; 선언-> getter&setter ,constuctor 해줌

3-2. MainActivity는 강의 목록 클릭시, 시간표 클릭시, 강의 분석 클릭시 fragment해주는 부분과 색상 변경부분이다.

  courseButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                notice.setVisibility(View.GONE); //공지사항 notice가 보이지 않도록하는 (화면 바꾸는)
                courseButton.setBackgroundColor(getResources().getColor(com.google.android.material.R.color.design_default_color_primary_dark));
                statisticsButton.setBackgroundColor(getResources().getColor(com.google.android.material.R.color.design_default_color_primary));
                scheduleButton.setBackgroundColor(getResources().getColor(com.google.android.material.R.color.design_default_color_primary));
                FragmentManager fragmentManager = getSupportFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.replace(R.id.fragment, new CourseFragment());
                fragmentTransaction.commit();

            }
        });

        statisticsButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                notice.setVisibility(View.GONE); //공지사항 notice가 보이지 않도록하는 (화면 바꾸는)
                courseButton.setBackgroundColor(getResources().getColor(com.google.android.material.R.color.design_default_color_primary));
                statisticsButton.setBackgroundColor(getResources().getColor(com.google.android.material.R.color.design_default_color_primary_dark));
                scheduleButton.setBackgroundColor(getResources().getColor(com.google.android.material.R.color.design_default_color_primary));
                FragmentManager fragmentManager = getSupportFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.replace(R.id.fragment, new StatisticsFragment());
                fragmentTransaction.commit();

            }
        });

        scheduleButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                notice.setVisibility(View.GONE); //공지사항 notice가 보이지 않도록하는 (화면 바꾸는)
                courseButton.setBackgroundColor(getResources().getColor(com.google.android.material.R.color.design_default_color_primary));
                statisticsButton.setBackgroundColor(getResources().getColor(com.google.android.material.R.color.design_default_color_primary));
                scheduleButton.setBackgroundColor(getResources().getColor(com.google.android.material.R.color.design_default_color_primary_dark));
                FragmentManager fragmentManager = getSupportFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.replace(R.id.fragment, new ScheduleFragment());
                fragmentTransaction.commit();

            }
        });

 3-3. noticeListAdapter 

BaseAdapter 상속해줌. (자세한 코드는 깃허브참조) 

 

4.Course 강의 목록 보여주기 

마찬가지로 Course, CourseFragment,CourseListAdapter.java

강의 목록 보여줌 -> 추가 버튼 생성해서 강의를 추가할 수 있게하며 또한 강의 시간 중복을 방지하였음.

addButton.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View view) {

        boolean validate =false; //현재 강의를 추가할수잇는지없는지
        validate=schedule.validate(courseList.get(i).getCourseTime());
        //현재 추가하려는 강의에 시간표를 넣음으로서 타당성을 검증함.

        //String userID = MainActivity.userID; //회원아이디 가져옴
        if(!alreadyln(courseIDList,courseList.get(i).getCourseID())){
            //내가 신청했던 강의 아이디속에서 현재 신청하려는 강의 아이디가 포함되어있다면?
            AlertDialog.Builder builder=new AlertDialog.Builder(parent.getActivity());
            AlertDialog dialog=builder.setMessage("이미 추가한 강의입니다.")
                    .setPositiveButton("다시시도",null)
                    .create();
            dialog.show();
        }
        else if(validate==false){
            AlertDialog.Builder builder=new AlertDialog.Builder(parent.getActivity());
            AlertDialog dialog=builder.setMessage("시간표가 중복됩니다.")
                    .setNegativeButton("다시시도",null)
                    .create();
            dialog.show();
        }
        else{
            Response.Listener<String> responseListener = new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        JSONObject jsonResponse = new JSONObject(response);
                        boolean success = jsonResponse.getBoolean("success");
                        if (success) {
                            AlertDialog.Builder builder = new AlertDialog.Builder(parent.getActivity());
                            AlertDialog dialog = builder.setMessage("강의가 추가되었습니다.")
                                    .setPositiveButton("확인", null)
                                    .create();
                            dialog.show();
                            //강의 직접 추가하기 해당 강의 번호 등록.
                            courseIDList.add(courseList.get(i).getCourseID());
                            schedule.addSchedule(courseList.get(i).getCourseTime());

                        }
                        else {
                            AlertDialog.Builder builder = new AlertDialog.Builder(parent.getActivity());
                            AlertDialog dialog = builder.setMessage("강의추가에 실패했습니다.")
                                    .setNegativeButton("확인", null)
                                    .create();
                            dialog.show();

                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            };
            AddRequest addRequest= new AddRequest(userID, courseList.get(i).getCourseID()+"", responseListener);
            RequestQueue queue = Volley.newRequestQueue(parent.getActivity());
            queue.add(addRequest);
        }

 

5. 시간표 조회

시간표 생성하는 방법은 전에 올렸던 블로그 자료에 있습니다. (AutoResizeTextView) ->https://s2jinny.tistory.com/15

 

TextView 크기 자동 조절 AutoResizeTextView오픈소스 라이브러리

TextView 크기 자동 조절 AutoResizeTextView오픈소스 라이브러리 https://github.com/indrimuska/Kulinaria/blob/master/src/com/indrimuska/kulinaria/AutoResizeTextView.java GitHub - indrimuska/Kulinaria: Kulinaria Android App - Your meal planner t

s2jinny.tistory.com

 

 

고쳐야 할 점: 타이틀 바 없애고 전체화면 만들기 , ui색상 변경, 크기 맞추기 

 

2편,3편(시간표 삭제->강의 경쟁률, 학점 제한->강의 인기 순위 리스트->스플래시화면) 계속....

 

php파일 필요하신 분이나 궁금한 사항 댓글 달아주세요 ^_^