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

소스 코드 중 for 문의 의미

0 추천

안녕하세요.

안드로이드 공부를 시작한지 2개월째인 초보 프로그래머입니다.

제가 github에서 소스 코드를 받아서 하나 하나 뜯어보면서 공부를 하고 있는데요 일부 소스 코드가 이해가

안되서 질문 드립니다.

아래 코드는 Custom Calendar View 중 일부인데요

public class CalendarView extends ViewGroup {
    private final String TAG = "TIME";
    private final int mScreenWidth;
    private final int mWidthDate;

    private long mMillis;

    private int mDateOfWeek;

    private int mMaxtDateOfMonth;

    private int mDefaultTextSize = 40;

    public static String[] DAY_OF_WEEK;

    public CalendarView(Context context, AttributeSet attrs) {
        super(context, attrs);

        mScreenWidth = getResources().getDisplayMetrics().widthPixels; 
        mWidthDate = mScreenWidth / 7;
        //DAY_OF_WEEK = getResources().getStringArray(R.array.day_of_week);
    }

  
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int count = getChildCount();

        int maxHeight = 0;
        int maxWidth = 0;
        int childState = 0;
        int mLeftWidth = 0;
        int rowCount = 0;

        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(mMillis);
        Log.d("TAG", "setTimeInMillis : " + calendar);

        for (int i = 0; i < count; i++) {
            final View child = getChildAt(i);

            if (child.getVisibility() == GONE)
                continue;

            measureChild(child, widthMeasureSpec, heightMeasureSpec);
       
            maxWidth += Math.max(maxWidth, child.getMeasuredHeight());
            //maxWidth = maxWidth + Math.max(maxWidth, child.getMeasuredHeight())
            mLeftWidth += child.getMeasuredWidth();

            if ((mLeftWidth / mScreenWidth) > rowCount) {
                maxHeight += child.getMeasuredHeight();
                rowCount++;
            } else {
                maxHeight = Math.max(maxHeight, child.getMeasuredHeight());
            }
            childState = combineMeasuredStates(childState, child.getMeasuredState());
        } // combineMeasuredStates(curState, newState) : Merge two states as return by getMeasureState()



        maxHeight = (int) (Math.ceil((count + mDateOfWeek - 1) / 7d) * (mWidthDate * 0.75));
        
        maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth());
        
        int expandSpec = MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK, MeasureSpec.AT_MOST);

        setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState), resolveSizeAndState(maxHeight, expandSpec, childState << MEASURED_HEIGHT_STATE_SHIFT));
       
        //setMeasuredDimension(measuredWidth, measuredHeight)
        LayoutParams params = getLayoutParams();
        //getLayoutParams :
        params.height = getMeasuredHeight();

    }

여기서 궁금한점이 있어서 질문 드립니다.

1. 생성자 public CalendarView(Context context, AttributeSet attrs)

에서 생성자에 들어가는 소스 코드들은 어떤게 들어가야하는지 정해진게 있나요?

구글링해보니 초기화해야하는 값들을 넣는다고 하는데 맞나요?

2. onMeasure 메소드에서 count 의 숫자는 몇인가요? log.d로 확인을 해보려고 해도 

틀린부분이 있는지 log값을 확인할수 없네요. 그 밑에 for 문에 i < count가 있는데 이 count가 

달력의 숫자가 들어가는 빈칸 하나하나를 의미하는 것으로 추측은 하고 있습니다.

3. 마지막으로 여기서 mLeftWidth가 의미하는게 무엇인지 감이 오질 않습니다.

 

처음 질문하는거라 두서없이 생각나는대로 작성하였습니다.

잘 아시는 고수분들의 도음을 간절히 요청합니다.

감사합니다.

익명사용자 님이 2019년 9월 18일 질문

1개의 답변

+1 추천
1. xml 에서 이 클래스를 넣어서 사용하는데, 거기서 context를 가져오고 layout_width 같은 값이 attrs로 넘어 옵니다.

2. 달력이니 화면에 표시되는 일 수가 될 것 같습니다. 다만 이전 달과 다음 달의 몇 개가 포함되느냐 여부에 따라 갯수는 달라질 수 있을 것 같네요.

3. 월화수목금토일 순서로 표시하려면, 왼쪽에 있는 요일의 너비를 알아내서, 왼쪽을 그만큼 띄어주면 겹치지 않게 잘 나오겠죠?
쎄미 (162,410 포인트) 님이 2019년 9월 19일 답변
답변 정말 감사합니다. 한번만 더 여쭈어 봐도 될까요?
1. 그럼 mScreenWidth가 attrs의 값인가요?
2. 만약 1월이라면 31일까지 표시가 되어야하는데 count와 연결된 메소드
    getchildcount가 무엇을 근거로 count에 31이라는 값을 넣는건가요?
3. 이해가 되었습니다.
1. mScreenWidth 는 attrs를 전혀 사용하지 않으니 당연히 폰의 해상도를 뜻하겠죠?
2. 선택된 달이 며칠까지 있는지는 이미 계산이 끝났을 겁니다. 그 후에 가져오는거니 31이 오는거겠죠.
감사합니다. 정말.ㅠㅠ
그런데 또 궁금한게 생겨서요
1. 이 소스 처럼 달력을 커스텀 뷰로 만들고자 할때 onMeasure 함수로 사이즈를 측정하잖아요? 그런데 onMeasure로 측정하는 사이즈가 1일 2일이 들어가는 칸의 사이즈 인가요 아니면 1~31일까지 가로 7칸 세로 5칸 이 모여서 이루어진 전체의 칸들의 총합 사이즈 인가요?

2.커스텀 뷰에서 말하는 child가 1일, 2일 각각에 들어가는 칸을 말하는건가요?
1. width는 뷰 자체의 너비겠고, child의 width는 1일 2일이 들어가는 날짜의 너비겠죠.
2. 그럴 가능성이 높습니다.
...