프로젝트 [코테 복습] - 문제 수정하기

유의선·2024년 5월 22일

코테 복습 프로젝트

목록 보기
12/13

저장된 Task를 수정하는 기능을 구현하였다.


먼저 MainActivity 에서 구현한 onItemSwipeListener 인터페이스의 editItem 메소드를 구현하였다.
이곳에 Task를 수정하는 액티비티로 이동하는 코드를 작성하였다.

public class MainActivity extends AppCompatActivity implements onItemSwipeListener {

    ...
    
    private ActivityResultLauncher<Intent> editResultLauncher;

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

		...
        
        // EditActivity ActivityResultCallback
        editResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
            @Override
            public void onActivityResult(ActivityResult o) {
                if(o.getResultCode() == RESULT_OK){
                    Intent intent = o.getData();
                    String task = intent.getStringExtra("task");
                    String date = intent.getStringExtra("date");
                    String address = intent.getStringExtra("address");
                    int id = intent.getIntExtra("id", -1);

                    //Edit Database
                    TaskDatabase database = TaskDatabase.getInstance(getApplicationContext());
                    String SQL = "UPDATE " + database.TABLE_USERS + " SET " +
                            "TASK = '" + task + "', " +
                            "date = '" + date + "', " +
                            "ADDRESS = '" + address + "' " +
                            "WHERE _id = " + id;
                    if(database != null){
                        database.execSQL(SQL);
                        loadTaskListData();
                    }
                }
            }
        });

	...


    }

	...

    // implements onItemSwipeListener editItem
    @Override
    public void editItem(int position) {
        Task task = adapter.getItem(position);

        Intent intent = new Intent(getApplicationContext(), EditActivity.class);
        intent.putExtra("id", task.getId());
        intent.putExtra("task", task.getTask());
        intent.putExtra("date", task.getDate());
        intent.putExtra("address", task.getAddress());

        editResultLauncher.launch(intent);
    }

ActivityResultLauncher를 사용해 만든 editResultLauncher를 사용해 리사이클러뷰의 item을 슬라이드하면 문제 수정 액티비티(EditActivity)으로 이동하도록 만들었다.
이 때 item에 저장된 Task 정보를 Intent를 이용해 문제 수정 액티비티로 전달하도록 하였다.

    // implements onItemSwipeListener editItem
    @Override
    public void editItem(int position) {
        Task task = adapter.getItem(position);

        Intent intent = new Intent(getApplicationContext(), EditActivity.class);
        intent.putExtra("id", task.getId());
        intent.putExtra("task", task.getTask());
        intent.putExtra("date", task.getDate());
        intent.putExtra("address", task.getAddress());

        editResultLauncher.launch(intent);
    }

수정 액티비티에서 Intent를 통해 응답을 받으면 Intent로 온 데이터를 이용해 데이터베이스를 수정한 후 리사이클러뷰를 갱신하도록 만들었다.

        // EditActivity ActivityResultCallback
        editResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
            @Override
            public void onActivityResult(ActivityResult o) {
                if(o.getResultCode() == RESULT_OK){
                    Intent intent = o.getData();
                    String task = intent.getStringExtra("task");
                    String date = intent.getStringExtra("date");
                    String address = intent.getStringExtra("address");
                    int id = intent.getIntExtra("id", -1);

                    //Edit Database
                    TaskDatabase database = TaskDatabase.getInstance(getApplicationContext());
                    String SQL = "UPDATE " + database.TABLE_USERS + " SET " +
                            "TASK = '" + task + "', " +
                            "date = '" + date + "', " +
                            "ADDRESS = '" + address + "' " +
                            "WHERE _id = " + id;
                    if(database != null){
                        database.execSQL(SQL);
                        loadTaskListData();
                    }
                }
            }
        });

문제를 수정하는 액티비티인 EditActivity를 만들었다.

레이아웃은 AddActivity와 같고, View의 text 정도만 수정하였다.

EditActivity의 코드는 다음과 같다.

public class EditActivity extends AppCompatActivity {

    EditText editTextTask;
    EditText editTextAdd;
    Button buttonSetTime;
    Button buttonEdit;
    TextView textYear;
    TextView textDate;

    String taskString;
    String yearString;
    String dateString;
    String addString;

    int id;

    DatePickerDialog datePickerDialog;

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

        // Views
        editTextTask = findViewById(R.id.editTextTask_edit);
        editTextAdd = findViewById(R.id.editTextAdd_edit);
        buttonSetTime = findViewById(R.id.buttonSetTime_edit);
        buttonEdit = findViewById(R.id.buttonEdit);
        textYear = findViewById(R.id.textYear_edit);
        textDate = findViewById(R.id.textDate_edit);

        // get data from MainActivity
        Intent intent = getIntent();
        if(intent != null){
            String task = intent.getStringExtra("task");
            String date = intent.getStringExtra("date");
            String address = intent.getStringExtra("address");
            id = intent.getIntExtra("id", -1);

            taskString = task;
            editTextTask.setText(taskString);

            String[] dates = date.split(" ");
            yearString = dates[0];
            textYear.setText(yearString);
            dateString = dates[1];
            textDate.setText(dateString);

            addString = address;
            editTextAdd.setText(addString);
        }

        // init DatePicker
        initDatePicker();

        buttonSetTime.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                datePickerDialog.show();
            }
        });

        buttonEdit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                taskString = editTextTask.getText().toString();
                dateString = yearString + " " + dateString;
                addString = editTextAdd.getText().toString();

                if(taskString == null || taskString.equals("")){
                    Toast.makeText(getApplicationContext(), "할 일을 입력해 주세요.", Toast.LENGTH_SHORT).show();
                }else if(yearString == null || yearString.equals("")){
                    Toast.makeText(getApplicationContext(), "날짜를 입력해 주세요.", Toast.LENGTH_SHORT).show();
                }else if(addString == null || addString.equals("")){
                    Toast.makeText(getApplicationContext(), "주소를 입력해 주세요.", Toast.LENGTH_SHORT).show();
                }else{
                    Intent intent = new Intent();
                    intent.putExtra("task", taskString);
                    intent.putExtra("date", dateString);
                    intent.putExtra("address", addString);
                    intent.putExtra("id", id);
                    setResult(RESULT_OK, intent);
                    finish();
                }
            }
        });
    }

    // init DatePicker
    private void initDatePicker() {
        DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker datePicker, int year, int month, int day) {
                month = month + 1;

                yearString = Integer.toString(year);
                dateString = month + "/" + day;

                textYear.setText(yearString);
                textDate.setText(dateString);
            }
        };

        Calendar calendar = Calendar.getInstance();
        int year;
        int month;
        int day;
        int style = AlertDialog.THEME_HOLO_LIGHT;

        if(yearString == null || yearString.equals("")){
            year = calendar.get(Calendar.YEAR);
        }else{
            year = Integer.parseInt(yearString);
        }

        if(dateString == null || dateString.equals("")){
            month = calendar.get(Calendar.MONTH);
            day = calendar.get(Calendar.DAY_OF_MONTH);
        }else{
            String[] dates = dateString.split("/");
            month = Integer.parseInt(dates[0]) - 1;
            day = Integer.parseInt(dates[1]);
        }

        datePickerDialog = new DatePickerDialog(this, style, dateSetListener, year, month, day);
    }
}

기능 자체는 AddActivity와 거의 같다.

차이점은 MainActivity에서 받아온 Task 데이터를 뷰에 바로 보여지도록 만들었고

        // get data from ListActivity
        Intent intent = getIntent();
        if(intent != null){
            String task = intent.getStringExtra("task");
            String date = intent.getStringExtra("date");
            String address = intent.getStringExtra("address");
            id = intent.getIntExtra("id", -1);

            taskString = task;
            editTextTask.setText(taskString);

            String[] dates = date.split(" ");
            yearString = dates[0];
            textYear.setText(yearString);
            dateString = dates[1];
            textDate.setText(dateString);

            addString = address;
            editTextAdd.setText(addString);
        }

DatePicker로 기본적으로 선택된 날짜도 받아온 데이터가 되도록 만들었다.

    // init DatePicker
    private void initDatePicker() {
        DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker datePicker, int year, int month, int day) {
                month = month + 1;

                yearString = Integer.toString(year);
                dateString = month + "/" + day;

                textYear.setText(yearString);
                textDate.setText(dateString);
            }
        };

        Calendar calendar = Calendar.getInstance();
        int year;
        int month;
        int day;
        int style = AlertDialog.THEME_HOLO_LIGHT;

        if(yearString == null || yearString.equals("")){
            year = calendar.get(Calendar.YEAR);
        }else{
            year = Integer.parseInt(yearString);
        }

        if(dateString == null || dateString.equals("")){
            month = calendar.get(Calendar.MONTH);
            day = calendar.get(Calendar.DAY_OF_MONTH);
        }else{
            String[] dates = dateString.split("/");
            month = Integer.parseInt(dates[0]) - 1;
            day = Integer.parseInt(dates[1]);
        }

        datePickerDialog = new DatePickerDialog(this, style, dateSetListener, year, month, day);
    }

0개의 댓글