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

데이트피커 선택 날짜 저장 어떻게 하나요?

0 추천

안녕하세요. 현재 날짜 계산기를 만들어 보려고 하는데요

SharedPreferences 를 이용해서 이름 텍스트 저장 까지는 진행 했는데

데이트피커의 선택 날짜는 앱 종료나 페이지 나감을 하면 초기화가 됩니다..

 

구동하려는 방식을 간략하게 말하자면

사용자가 선택한 날짜는 고정적으로 저장되어 있고

앱 구동시마다 저장된 날짜와 현재 날짜가 서로 비교되면서 "몇주 몇일 지났습니다"

식의 카운터를 구현해 보려고 합니다

코드 좀 한번 봐주시면 감사하겠습니다ㅠㅠ

public class Widget extends Activity {

    private TextView ddayText;
    private TextView todayText;
    private TextView resultText;
    private TextView nameText;
    private Button dateButton;


    private int tYear;           
    private int tMonth;
    private int tDay;

    private int dYear = 1;     
    private int dMonth = 1;
    private int dDay = 1;


    private long d;
    private long t;
    private long r;
    private long w;

    private int resultNumber = 0;
    private int dayNumber = 0;
    static final int DATE_DIALOG_ID = 0;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.widget);

        ddayText = (TextView) findViewById(R.id.dday);
        todayText = (TextView) findViewById(R.id.today);
        resultText = (TextView) findViewById(R.id.result);
        dateButton = (Button) findViewById(R.id.dateButton);
        nameText = (TextView) findViewById(R.id.name);

        dateButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                showDialog(0);//----------------

            }
        });
        //데이트피커, 닉네임 저장값 불러오기
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(Widget.this);
        String str = prefs.getString("name", "");
        prefs.getLong("date", new Date().getTime());
        nameText.setText(str); 

        Calendar calendar = Calendar.getInstance();    
        tYear = calendar.get(Calendar.YEAR);
        tMonth = calendar.get(Calendar.MONTH);
        tDay = calendar.get(Calendar.DAY_OF_MONTH);

        Calendar dCalendar = Calendar.getInstance();
        dCalendar.set(dYear, dMonth, dDay);

        t = calendar.getTimeInMillis();     
        d = dCalendar.getTimeInMillis();   
        r = (d - t) / (7 * 24 * 60 * 60 * 1000L);  
        w = (d - t) / (24 * 60 * 60 * 1000L); 
        resultNumber = (int) r * (-1);
        dayNumber = (int) w * (-1);

        updateDisplay();
    }//OnCreate end
    private void updateDisplay() {

        todayText.setText(String.format("%d년 %d월 %d일", tYear, tMonth + 1, tDay));
        ddayText.setText(String.format("%d년 %d월 %d일", dYear, dMonth + 1, dDay));

        if (resultNumber >= 0) {
            resultText.setText(String.format("임신 %d주 %d일", resultNumber % 45L, dayNumber % 7L + 1));

        } else {

            int absR = Math.abs(resultNumber);
            resultText.setText(String.format("임신 %d주 %d일", absR, dayNumber % 7L));
        }
    }
    @Override
    protected Dialog onCreateDialog(int id) {
        if (id == DATE_DIALOG_ID) {
            return new DatePickerDialog(this, dDateSetListener, tYear, tMonth, tDay);
        }
        return null;
    }

    private DatePickerDialog.OnDateSetListener dDateSetListener = new DatePickerDialog.OnDateSetListener() {
        @Override
        public void onDateSet(DatePicker view, int year, int monthOfYear,
                              int dayOfMonth) {
            // TODO Auto-generated method stub
            dYear = year;
            dMonth = monthOfYear;
            dDay = dayOfMonth;
            final Calendar dCalendar = Calendar.getInstance();
            dCalendar.set(dYear, dMonth, dDay);

            d = dCalendar.getTimeInMillis();
            r = (d - t) / (7 * 24 * 60 * 60 * 1000L);
            w = (d - t) / (24 * 60 * 60 * 1000L);

            resultNumber = (int) r * (-1);
            dayNumber = (int) w * (-1);

            updateDisplay();
        }
    };
    @Override                  //데이트피커, 닉네임 저장
    protected void onStop() {
        super.onStop();

        DatePicker dp = null;

        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(Widget.this);
        SharedPreferences.Editor editor = prefs.edit();

        String str = nameText.getText().toString();
        Date date = new Date(dp.getYear(), dp.getMonth(), dp.getDayOfMonth());

        editor.putString("name", str);
        prefs.edit().putLong("date", date.getTime()).apply();

        editor.apply();
    }
}

 

컬러색종이 (300 포인트) 님이 2019년 1월 24일 질문
컬러색종이님이 2019년 1월 24일 수정

1개의 답변

+1 추천
 
채택된 답변
무슨이유인진 모르겠으나 onStop에서 Null로 초기화된 DatePicker의 값을 저장하시네요.

onDateSet 내부에서 바로 SharedPreferences에 저장하면 해결되지않을까요?
익명사용자 님이 2019년 1월 24일 답변
컬러색종이님이 2019년 1월 28일 채택됨
답변 감사합니다. 제가 왕초보라;; 코드 짜집기로 해보고 있어서 저 부분을 넣게 되었습니다. DatePicker dp = null 부분이 없으면 Date date = new Date(dp.getYear(), dp.getMonth(), dp.getDayOfMonth()) 부분이 빨간게 안없어 지더라구요;; 그래서 부득이 넣게되었습니다. 염치없지만 어떻게 코드를 넣어야 할까요?ㅠㅠ
나가면 초기화군요..

그렇다면 SharedPreferences를 쓰실 필요는 없지않을까요?

현재날짜 System.currentTimeMillis를 불러와서 onDateSet에서 선택한 값을 비교하면 될텐데 SharedPreferences를 쓰는 이유를 알려주세요.
임신주수를 1회성 말고 앱 실행시마다 사용자가 선택한 임신 확인일과 현재 날짜가 자동으로 계산되서 매일 현재 주수를 표기하기 위해서 데이터 값을 저장해야 할 것 같아 검색하다가  SharedPreferences 를 발견했고 적용해보게 되었습니다. 더 나은 방법이 있다면 조언 부탁드립니다
앱 실행 시 마다 사용자가 선택한 확인일을 들고오는거라면 onStop에서 null값을 주면 다음 실행시엔 당연히 null 값을 갖고오죠.

LifeCycle과 SharedPreferences를 조금 더 공부해보세요

onDateSet에서 선택한 값들을 toDate -> SharedPreferences에 long으로 저장...
앱 재실행 시 SharedPreferences에 저장된 값을 불러와서 현재 시간(System.currentTimeMillis)과 비교...
이렇게 생각해보세요.
long으로 저장하는 코딩을 모르겠어서..ㅠㅠ 아무리 검색해도 그부분을 못찾겠더라구요.ㅠㅠ 우선 알려주신대로 다시 공부해보겠습니다 감사합니다
...