본문 바로가기

안드로이드

안드로이드 - 7 Intent를 이용한 화면 전환과 데이터 전달0203

1.ColorPickerActivity.java

package com.example.app0203;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;

public class ColorPickerActivity extends AppCompatActivity {
    Button btn_red,btn_green,btn_blue;

    private  final static int COLR_PICKER_CODE = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_color_picker);
        btn_red =findViewById(R.id.btn_red);
        btn_green =findViewById(R.id.btn_green);
        btn_blue =findViewById(R.id.btn_blue);


        btn_red.setOnClickListener(v->{
            Intent intent = new Intent();
            intent.putExtra("color","#FD5454");
                            // RESULT_OK 대신 1 이것도 가능
            setResult(1,intent);
            finish();
        });

        btn_green.setOnClickListener(v->{
            Intent intent = new Intent();
            intent.putExtra("color","#99CC00");
            // RESULT_OK 대신 COLR_PICKER_CODE 이것도 가능
            setResult(COLR_PICKER_CODE,intent);
            finish();
        });

        btn_blue.setOnClickListener(v->{
            Intent intent = new Intent();
                                            //효창-> 핵사 컬러만 가능 안드로이드 컬러 오류남
            intent.putExtra("color","FF33B5E5");
            setResult(RESULT_OK,intent);
            finish(); 
        });
    }
}

이 코드는 컬러를 선택하는 색상 선택 화면의 액티비티를 구현하는 코드입니다. 코드 자체는 간단하고 이해하기 쉽습니다.

 

주요 포인트:

  • 컬러 선택 버튼을 클릭하면 해당 컬러 코드를 인텐트에 담아서 setResult 메서드로 설정합니다.
  • setResult 메서드는 현재 액티비티의 결과 코드와 함께 실행됩니다.
  • finish() 메서드는 현재 액티비티를 종료합니다.

개선할 점:

  • 컬러 코드를 직접 입력하거나 기타 컬러를 선택할 수 있는 기능을 추가하는 것이 좋을 것입니다.
  • 컬러 코드를 직접 입력하는 경우, 입력값에 대한 유효성 검사가 필요합니다.

2. activity_color_picker.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ColorPickerActivity">

    <Button
        android:id="@+id/btn_red"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:backgroundTint="#FD5454"
        android:text="빨강"
        android:textSize="40sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toTopOf="@+id/btn_green"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_chainStyle="spread" />

    <Button
        android:id="@+id/btn_blue"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:backgroundTint="#33B5E5"
        android:text="파랑"
        android:textSize="40sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="@+id/btn_green"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="@+id/btn_green"
        app:layout_constraintTop_toBottomOf="@+id/btn_green" />

    <Button
        android:id="@+id/btn_green"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:backgroundTint="#99CC00"
        android:text="초록"
        android:textSize="40sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toTopOf="@+id/btn_blue"
        app:layout_constraintEnd_toEndOf="@+id/btn_red"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="@+id/btn_red"
        app:layout_constraintTop_toBottomOf="@+id/btn_red" />
</androidx.constraintlayout.widget.ConstraintLayout>

레이아웃 코드에서는 ConstraintLayout을 사용하여 버튼들을 배치하고 있습니다. ConstraintLayout은 안드로이드에서 기본적으로 제공하는 레이아웃 중 하나로, 부모 컨테이너와 자식 뷰들 간에 Constraint(제약) 관계를 설정하여 뷰를 배치하는 방법입니다.

버튼들 간에 Constraint 관계를 설정하여 뷰들을 배치하고 있습니다. 예를 들어, btn_red와 btn_green, btn_green과 btn_blue 간에 Constraint 관계를 설정하여 버튼들이 일정한 간격으로 배치됩니다.

버튼의 속성들을 통해 배경색상, 텍스트, 텍스트 크기 등을 설정하여 꾸밀 수 있습니다.

3. ListViewActivity

package com.example.app0203;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;

public class ListViewActivity extends AppCompatActivity {

    ListView lv;
    ArrayList<String> items;
    ArrayAdapter<String> adapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_view);
        //드래그 후 ctrl+ alt +m 누르기(화면 축소)
        // view or 객체를 초기화하는 메소드!
        init();
        // 데이터를 dkdlxpa 레이아웃에 연결(qkdlseld)하여 아이템뷰로 변환해주기 위한 어댑터 객체 생성!
        // 생성할 때 필요한 데이터 3가지!
        // 1. 액티비티 정보 : 액티비티명.this
        // 2. 아이템 레이아웃
        // 3. 데이터(배열 or ArrayList)

        adapter = new ArrayAdapter<>(
                ListViewActivity.this,
                android.R.layout.simple_list_item_1,
                items

        );
        // 생성된 어댑터 객체를 화면에 보여주기 위해 어댑터뷰인 리스트뷰에 저장!
        lv.setAdapter(adapter);

        // 아이템을 클릭했을 때 이벤트 처리하기!
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                // adapterView : 클릭이 발생한 AdapterView를 가져온다!
                // view : 클린한 아이템뷰를 Object롤 가져온다!
                // i : 클릭한 아이템의 행 위치 -> 인덱스로 활용!
                Log.v("ListViewActivity", items.get(i));
            }
        });

    }

    private void init() {
        lv = findViewById(R.id.lv);
        items = new ArrayList<>();
        items.add("사과");
        items.add("딸기");
        items.add("수박");
        items.add("오렌지");
        items.add("키위");
        items.add("포도");
        items.add("오렌지");
        items.add("거봉");
        items.add("망고");
        items.add("파인애플");
        items.add("귤");
        items.add("복숭아");
        items.add("애플망고");
        items.add("두리안");
        items.add("바나나");
        items.add("자몽");
        items.add("자두");
        items.add("참외");
    }
}
  • init() 메서드를 생성하여, onCreate() 메서드에서 뷰 및 어레이 리스트 초기화를 따로 구현하였다. 이는 가독성을 높이는 좋은 습관이다.
  • ListView 위젯을 사용하기 위해 레이아웃에서 선언하고, findViewById() 메서드를 호출하여 액티비티와 바인딩하였다.
  • ListView 위젯에 연결하기 위한 어댑터를 생성하고, ArrayAdapter 클래스를 사용하여 연결하였다.
  • setOnItemClickListener() 메서드를 사용하여, 아이템 클릭 이벤트를 처리하였다.
  • 아이템 클릭 이벤트에서는 Log 클래스를 사용하여 로그를 출력하였다.

좋은 점:

  • 가독성이 좋다.
  • 사용된 위젯과 이벤트 처리에 대한 이해도가 높다.
  • 효율적인 코드 작성이 이루어졌다.

개선할 점:

  • 리스트 뷰의 아이템을 클릭했을 때, 어떤 동작을 수행할지 명시적으로 나타내는 것이 좋다. 예를 들어, 클릭한 아이템의 내용을 다른 액티비티에 전달하거나, 해당 아이템에 대한 상세 정보를 화면에 보여주는 등의 기능을 구현할 수 있다.
  • 특정 기능을 수행하는 코드를 작성할 때, 해당 코드의 기능을 주석으로 나타내는 것이 좋다. 이를 통해 코드를 읽는 사람이 해당 코드의 목적을 쉽게 이해할 수 있다.

4.activity_list_view

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ListViewActivity">

    <ListView
        android:id="@+id/lv"
        android:layout_width="409dp"
        android:layout_height="729dp"
        android:layout_marginStart="1dp"
        android:layout_marginTop="1dp"
        android:layout_marginEnd="1dp"
        android:layout_marginBottom="1dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

ListViewActivity에서는 ListView에 ArrayList의 데이터를 보여주기 위한 ArrayAdapter 객체를 생성하고, ListView에 연결하는 코드가 포함되어 있습니다.

또한, ListView에서 아이템을 클릭하면 클릭한 아이템의 텍스트를 Log.v()를 통해 출력합니다.

activity_list_view.xml 파일도 문제 없이 ListView를 표시하고 있습니다.

ListView를 표시하는 데에는 ConstraintLayout을 사용하고 있습니다. 

 

 

5.ListViewActivity2

package com.example.app0203;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class ListViewActivity2 extends AppCompatActivity {

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

이 코드는 빈 액티비티로, 화면에는 레이아웃 하나만 있습니다.

따라서 이 코드에서 리뷰할 사항은 크게 없습니다.

다만, ListViewActivity에서 구현한 리스트뷰를 사용해 보여줄 데이터가 없는 것 같습니다.

이후에 리스트뷰에 어댑터를 적용하고,

데이터를 추가하여 보여주는 등 리스트뷰를 사용하는 코드를 구현하려면 데이터가 필요합니다.

ListViewActivity와 함께 구현해보면서 이해해보세요.

 

6. activity_list_view2

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ListViewActivity2">

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.85499316" />

    <EditText
        android:id="@+id/edt_input"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="32dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="Name"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/guideline"
        app:layout_constraintVertical_bias="0.45" />

    <Button
        android:id="@+id/btn_save"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="28dp"
        android:text="추가"
        app:layout_constraintBottom_toBottomOf="@+id/edt_input"
        app:layout_constraintStart_toEndOf="@+id/edt_input"
        app:layout_constraintTop_toTopOf="@+id/edt_input"
        app:layout_constraintVertical_bias="1.0" />

    <ListView
        android:id="@+id/listView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="1dp"
        android:layout_marginEnd="1dp"
        app:layout_constraintBottom_toTopOf="@+id/guideline"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
  • Guideline: guideline을 사용하여 레이아웃을 나누는 것은 좋은 방법입니다.
  • 그러나 이번 레이아웃에서는 guideline이 필요하지 않습니다.
  • 대신, EditText와 Button의 상단 및 하단을 ListView와 맞춰주는 것이 좋을 것입니다.
  • EditText: EditText가 포함된 ConstraintLayout의 높이가 match_parent로 설정되어 있기 때문에,
  • EditText의 상하 공간을 레이아웃을 분할하여 설정하는 것이 좋습니다.
  • 예를 들어, EditText의 상단은 ListView의 하단에 붙이고, 하단은 guideline의 상단에 붙이면 됩니다.
  • Button: 버튼이 하나만 있고, 그것도 오른쪽 끝에 붙어있으므로,
  • 이 버튼은 부모 레이아웃의 오른쪽에 붙어있는 것이 좋습니다.
  • 또한, 버튼의 상하 위치는 EditText와 맞춰주는 것이 좋습니다.
  • ListView: ListView는 ConstraintLayout의 상하 공간을 채워야 하므로,
  • bottom constraint와 top constraint를 설정하는 것이 좋습니다.

7.MainActivity.java

package com.example.app0203;

import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;

import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
// Intent 용도 3가지
// 1. 다른 액티비티 실행
// 2. 실행된 액티비티에 데이터 전달
// 3. 실행된 액티비티로부터 결과 수신
public class MainActivity extends AppCompatActivity {
    private  final static int COLR_PICKER_CODE =1 ;
    TextView tv_msg;
    Button btn_next,btn_color;
    ConstraintLayout c_layout;
    // 이동한 화면(Next)에서 결과값을 수신하기 위한 객체 생성
    ActivityResultLauncher<Intent> mainLauncher = registerForActivityResult(
                                                   // 효창-> , 안써서 자동완성안됨
            new ActivityResultContracts.StartActivityForResult(),
            new ActivityResultCallback<ActivityResult>() {
                @Override
                public void onActivityResult(ActivityResult result) {
                    //result 변수를 이용해서 Intent 정보를 가져오기!

                    //result.getResultCode() : setResult()에 넘겼던 ResultCode값을 가져온다!
                    // result.getData() :setResult()에 넘겼던 intent값을 가져온다!

                    if(result.getResultCode() == RESULT_OK){
                        Intent intent = result.getData();
                        String msg = intent.getStringExtra("data");
                        tv_msg.setText(msg);
                        //String color = intent.getStringExtra("color");
                        //효창 -> btn_color 가 아니라 c_layout 이름으로 해야함 (배경색을 바꿔야 하기때문)
                       // c_layout.setBackgroundColor(Color.parseColor(color));
                    } else if (result.getResultCode() == COLR_PICKER_CODE) {
                        //액티비티 화면이 2개 이상인 경우, COLR_PICKER_CODE처럼
                        // 화면을 구분할 수 있는 변수를 생성해서 비교문에 활용해야 한다!
                        Intent intent = result.getData();
                        String color = intent.getStringExtra("color");
                        c_layout.setBackgroundColor(Color.parseColor(color));
                    }


                }


            });

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        c_layout = findViewById(R.id.c_layout);
        btn_color = findViewById(R.id.btn_color);
        tv_msg = findViewById(R.id.tv_msg);
        btn_next = findViewById(R.id.btn_next);
        // 효창-> mainLauncher 안에 넣었다가 오류남
        btn_next.setOnClickListener(v -> {
            Intent intent = new Intent(MainActivity.this, NextActivity.class);
            // 다른 액티비티를 실행해주기!
            // : 이동한 화면에서 보내준 데이터를 가져오는 기능 -> onActivityResult
            mainLauncher.launch(intent);
        });

        btn_color.setOnClickListener(v->{
            Intent intent = new Intent(MainActivity.this,ColorPickerActivity.class);
            mainLauncher.launch(intent);
        });
    }
}

코드를 살펴보면, MainActivity에서는 액티비티 간 이동과 결과 수신, 또는 색상 선택을 위한 ColorPickerActivity를 실행하는 버튼 이벤트 등이 구현되어 있습니다.

 

먼저, onActivityResult를 구현하는 부분에서는 registerForActivityResult() 함수를 사용하여 ActivityResultLauncher를 생성하고, 결과값을 처리하는 callback 함수를 작성합니다. 이 때, setResult() 함수를 통해 결과값을 전달하는 액티비티를 구분하기 위해 COLR_PICKER_CODE라는 상수를 생성하고, 결과값을 받는 부분에서 getResultCode() 함수를 사용하여 resultCode값을 비교합니다.

 

다음으로, 버튼 클릭 이벤트 부분에서는 생성한 ActivityResultLauncher를 사용하여 새로운 액티비티를 실행합니다. 또한, 버튼 클릭 이벤트를 처리하기 위해 setOnClickListener() 함수를 사용하고, 이 때 lambda 표현식을 활용하여 코드를 간결하게 작성하였습니다.

 

마지막으로, 색상 선택을 위한 버튼 이벤트에서는 ColorPickerActivity를 실행하도록 작성하였습니다.

 

 색상 선택을 위한 버튼 이벤트에서 c_layout.setBackgroundColor() 함수를 사용하여 배경색을 변경하는 부분은 btn_color 버튼이 아니라 c_layout 객체를 이용해야 한다는 점에 주의해야 합니다.

8. activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/c_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="168dp"
        android:layout_marginTop="148dp"
        android:layout_marginEnd="167dp"
        android:text="Main 화면"
        android:textSize="40sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tv_msg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="135dp"
        android:text="받은 결과가 없습니다."
        android:textSize="20sp"
        app:layout_constraintEnd_toEndOf="@+id/textView2"
        app:layout_constraintStart_toStartOf="@+id/textView2"
        app:layout_constraintTop_toBottomOf="@+id/textView2" />

    <Button
        android:id="@+id/btn_next"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="163dp"
        android:text="NEXT화면으로 이동"
        app:layout_constraintEnd_toEndOf="@+id/tv_msg"
        app:layout_constraintStart_toStartOf="@+id/tv_msg"
        app:layout_constraintTop_toBottomOf="@+id/tv_msg" />

    <Button
        android:id="@+id/btn_color"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="17dp"
        android:text="COLORPICKER로 이동"
        app:layout_constraintEnd_toEndOf="@+id/btn_next"
        app:layout_constraintStart_toStartOf="@+id/btn_next"
        app:layout_constraintTop_toBottomOf="@+id/btn_next" />

</androidx.constraintlayout.widget.ConstraintLayout>
  1. XML 파일의 tools:context 속성을 삭제해도 됩니다. 해당 속성은 디자인 탭에서 미리보기를 위해 사용되며, 앱의 런타임 동작과는 무관합니다.
  2. mainLauncher를 private 필드로 선언해도 됩니다. 현재는 private 키워드가 빠져 있어서 일부러 추가하지 않았을 수도 있습니다.
  3. 레이아웃 파일에서 android:id="@+id/c_layout" 속성을 삭제해도 됩니다. 해당 뷰를 코드에서 참조할 필요가 없기 때문입니다.
  4. tv_msg의 기본 텍스트를 strings.xml 파일에서 관리하면 좋습니다. 이렇게 하면 나중에 해당 텍스트를 수정할 때 레이아웃 파일과 소스 코드를 모두 수정하지 않아도 됩니다.

9.NextActivity.java

package com.example.app0203;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;

public class NextActivity extends AppCompatActivity {
    Button btn_result;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_next);

        btn_result = findViewById(R.id.btn_result);

        btn_result.setOnClickListener(v->{

            // 이전 화면(Main)으로 결과값 전달하기!
            Intent intent = new Intent();
            intent.putExtra("data","Next화면에서 전달받은 데이터입니다.");

            //setResult( resultCode, intent);
            // - resultCode : 이전 화면에서 값을 접근할때 성공/실패
            //                혹은 화면을 구분하기 위한값
            // - 종류 : RESULT_OK(성공),RESULT_CANCELED(실패), 사용자직접정의
            setResult(RESULT_OK,intent);
            finish();

        });
    }
}

NextActivity 클래스에서 setResult() 메소드를 호출하기 전에 finish()를 호출한다는 것에 주의해야 합니다.

finish() 메소드는 현재 액티비티를 종료하기 때문에, setResult() 메소드를 먼저 호출하지 않으면

이전 화면으로 결과값을 전달하지 못하게 됩니다.

따라서, setResult() 메소드를 호출한 이후에 finish() 메소드를 호출하는 것이 좋습니다.

다음과 같이 코드를 수정할 수 있습니다.

btn_result.setOnClickListener(v -> {
    Intent intent = new Intent();
    intent.putExtra("data", "Next화면에서 전달받은 데이터입니다.");
    setResult(RESULT_OK, intent);
    finish();
});

10. activity_next

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".NextActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="176dp"
        android:layout_marginTop="164dp"
        android:layout_marginEnd="178dp"
        android:text="Next 화면"
        android:textSize="40sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn_result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="292dp"
        android:text="데이터 결과 전달"
        app:layout_constraintEnd_toEndOf="@+id/textView"
        app:layout_constraintStart_toStartOf="@+id/textView"
        app:layout_constraintTop_toBottomOf="@+id/textView" />
</androidx.constraintlayout.widget.ConstraintLayout>
  • registerForActivityResult()에서 ActivityResultContracts.StartActivityForResult()를 호출할 때 외부 클래스와 함께 인스턴스화하지 않은 ActivityResultContracts.StartActivityForResult()를 직접 호출해야 합니다.
  • 이렇게 하면 이전 버전의 ActivityResultContracts 클래스와 호환되지 않으므로 ActivityResultLauncher의 생성자에 대한 직접 호출을 피해야 합니다. 해결 방법은 람다식 밖에서 registerForActivityResult()를 호출하는 것입니다.
  • 레이아웃에서 ConstraintLayout의 id가 c_layout으로 설정되어 있습니다. 그러나 MainActivity.java에서는 ConstraintLayout을 참조할 때 R.id.main으로 설정했는데, 이는 정확하지 않습니다. 레이아웃에서 설정한 id와 일치시켜야 합니다. 따라서 c_layout로 변경해야 합니다.

파일 다운 링크 :https://github.com/yoonhyochang/Android

'안드로이드' 카테고리의 다른 글

안드로이드 - 9 채팅 0210  (0) 2023.03.07
안드로이드 - 8 버튼 게임 0206  (1) 2023.03.07
안드로이드 - 6 로그인 0202  (0) 2023.03.07
안드로이드 - 5 주사위 App0201  (0) 2023.03.07
안드로이드 - 4 버튼 0131  (0) 2023.03.07