마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

년과 일을 받으면 달력이 생성되는 코드를 짜고 있는데 잘 안되네요

0 추천
package com.example.howtopickupthedatename;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class MainActivity extends AppCompatActivity {

    int startDay = 0;

    public String year = "";
    public String month = "";

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

        EditText inputYears = (EditText)findViewById(R.id.years);
        EditText inputMonths = (EditText)findViewById(R.id.months);
        TextView outputDate = (TextView)findViewById(R.id.dates);

        TextView day1 = (TextView)findViewById(R.id.day1);

        inputYears.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                boolean handled = false;
                if(actionId == EditorInfo.IME_ACTION_SEND){
                    year = inputYears.getText().toString();
                    handled = true;
                    v.setFocusable(false);
                    v.setFocusableInTouchMode(true);
                    v.setFocusable(true);
                }

                return handled;
            }
        });

        inputMonths.setOnEditorActionListener(new    TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                boolean handled = false;
                if(actionId == EditorInfo.IME_ACTION_SEND){
                    //year = inputYears.getText().toString();
                    month = inputMonths.getText().toString();

                    String date = year+"-"+month+"-"+1;
                    String day = " ";

                    try {
                        //day = getDateDay(date,"yyyy-MM-dd");
                        startDay = getDateDay2(date, "yyyy-mm-dd");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    if(startDay != 0){
                        day1.setText(" "+startDay);
                        //outputDate.setText(day);
                    }

                    handled = true;
                    hidekeyboard(inputMonths);
                    v.setFocusable(false);
                    v.setFocusableInTouchMode(true);
                    v.setFocusable(true);
                }
                return handled;
            }
        });

    }

    private void hidekeyboard(EditText et){
        InputMethodManager imm = (InputMethodManager)    getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(et.getWindowToken(),0);
    }

    public static int getDateDay2(String date, String dateType) throws Exception {

        String day = "";

        SimpleDateFormat dateFormat = new SimpleDateFormat(dateType);
        Date nDate = dateFormat.parse(date);

        Calendar cal = Calendar.getInstance();
        cal.setTime(nDate);

        int dayNum = cal.get(Calendar.DAY_OF_WEEK);

        return dayNum;
    }


    public static String getDateDay(String date, String dateType) throws Exception {

        String day = "";

        SimpleDateFormat dateFormat = new SimpleDateFormat(dateType);
        Date nDate = dateFormat.parse(date);

        Calendar cal = Calendar.getInstance();
        cal.setTime(nDate);

        int dayNum = cal.get(Calendar.DAY_OF_WEEK);

        switch (dayNum) {
            case 1:
                day = "일";
                break;
            case 2:
                day = "월";
                break;
            case 3:
                day = "화";
                break;
            case 4:
                day = "수";
                break;
            case 5:
                day = "목";
                break;
            case 6:
                day = "금";
                break;
            case 7:
                day = "토";
                break;

        }

        return day;
    }
}

일단 소스코드는 이렇습니다.

현재가 몇년도인지, 몇월인지 입력을 하면 밑의 이 곳에 날짜가 재설정되도록 만들고 있습니다. 

하지만 현재, 날짜를 설정해야하는 텍스트 박스의 숫자가 년과 월 둘다 바꾸었을때는 숫자가 바뀌는데 월만 바꾸거나 년만 바꾸면 숫자가 바뀌지 않고 있습니다.

어떻게 하면 하나만 변경해도 숫자가 바뀌도록 할 수 있을까요?

그냥그런사람 (120 포인트) 님이 2021년 3월 14일 질문

1개의 답변

0 추천

Calendar 를 만들어주는 부분의 코드가 안보여서 뭐가 문제인지 말씀드리기는 힘드네요. 다만 로직을 변경이 용이하도록 좀 정리하시면 어떤 부분이 문제인지 좀 더 빨리 확인하실 수 있을 것 같아요. 그럼 문제 해결도 빠르겠죠.

그리고 제가 Calendar 를 만들어보진 않아서 모르겠지만, 저 같으면 RecyclerView를 GridLayout으로 해서 만들 것 같은데, 이렇게는 안되는 건가요? RecyclerView가 된다면 뭔가 변경이 생길 때 마다 Adapter 만 갱신을 해주면 되니 로직이 훨씬 명료해질 것 같은데요.

inputYears.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if(actionId == EditorInfo.IME_ACTION_SEND){
                    updateCalendar();

                    ...
                    return true;
                }
 
                ...
                return false;
            }
        });
 
        inputMonths.setOnEditorActionListener(new    TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if(actionId == EditorInfo.IME_ACTION_SEND){
                    updateCalendar();
                    ...
                    return true;
                }

                ...
                return false;
            }
        });
 
    }

private String getYear() {
    return InputYears.getText().toString();
}

private String getMonth() {
     return inputMonths.getText().toString();
}

private void updateCalendar() {
     final List<CalendarItem> items = getCalendarItems();
     // Calendar를 그려주는 실제 로직
}


public class CalendarItem {
     private final String year;
     private final String moth;
     // Constructor, getter 생략
}

 

spark (224,800 포인트) 님이 2021년 3월 14일 답변
...