본문 바로가기
안드로이드 스튜디오

[안드로이드 스튜디오] 앱만들기 #3. Intent (화면 전환)

by sojung118 2024. 8. 26.

[ 실행 화면 ]

MainActivity.java, activity_main.xml

 

subActivity.java, activity_sub.xml

 


 

이번에는 우리가 평소 앱을 사용하면서 버튼을 누르면 다른 화면으로 전환되는 등

Intent (화면전환)에 대해서 알아보도록 하자!

 

우선 화면전환을 하기 위해서는 xml 화면이 2개가 있어야하고,

xml과 java 파일은 한 세트로 짝궁이므로 

 

이 화면에서 com.example.android_test - 마우스 우클릭 - New - Activity - Empty ... 클릭!

이후 두번째 activity 이므로 나는 subActivity로 이름을 설정해주었다. 

 


 

1. activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:fitsSystemWindows="true"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_move"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="이동하는 버튼" />

</LinearLayout>

 

버튼을 하나 만들어주고, 해당 버튼을 클릭하면 activity_sub.xml로 넘어가도록 설정해준다.

Button의 id는 이름 그대로 btn_move로 할당해준다.

 

 

2. activity_sub.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:orientation="vertical"
    tools:context=".subActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="서브 액티비티 도착"
        android:textSize="30sp" />


</LinearLayout>

 

화면 전환이 일어났을때 나타날 2번째 xml인 activity_sub.xml이다.

화면 전환이 되면 간단한 TextView가 나타날 것이다.

 


 

1. MainActivity.java

package com.example.android_test;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class MainActivity extends AppCompatActivity {

    private Button btn_move;

    @Override

    //onCreate -> 어플을 처음 실행했을때 실행됨

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);

//        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
//            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
//            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
//            return insets;
//        });


        btn_move=findViewById(R.id.btn_move);
        btn_move.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //첫번째 인자에는 현재 activity.this, 두번째 인자에는 이동하고 싶은 activity.class로 설정
                //intent 객체 생성
                Intent intent = new Intent(MainActivity.this, subActivity.class);
                startActivity(intent); //액티비티 이동해주는 구문
            }
        });


    }
}

 

 

앞 포스팅에서 알아뒀던 것처럼 변수를 선언하고 해당 변수에 findViewByID 를 한다!

이후 버튼을 클릭하면 화면 전환이 일어나야하므로 setOnClickListener를 해주고

여기서 중요한 부분은 Intent를 선언하는 부분이다.

 

//첫번째 인자에는 현재 activity.this, 두번째 인자에는 이동하고 싶은 activity.class로 설정
//intent 객체 생성
Intent intent = new Intent(MainActivity.this, subActivity.class);
startActivity(intent);  //액티비티 이동해주는 구문

 

Intent를 선언하는 () 안에는 2가지 인자가 들어가는데,

첫번째 인자에는 MainActivity이름.this

두번째 인자에는 subActivity이름.class가 들어가야한다. (this, class 주의!)

 

이후 startActivity(intent)를 해주면 현재 xml에서 지정해준 xml으로 화면 전환이 된다.

이 과정까지는 subActivity.java를 건드릴 필요가 전혀 없다!

 



 

이제 간단히 화면 전환 뿐만 아니라 화면이 전환된 후, A.xml에 있던 내용을 B.xml로 옮겨보자.

 

1.activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:fitsSystemWindows="true"
    tools:context=".MainActivity">
    
    <EditText
        android:id="@+id/et_test"
        android:layout_width="200dp"
        android:layout_height="wrap_content"/>

    <Button
        android:id="@+id/btn_move"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="이동하는 버튼" />

</LinearLayout>

 

넘겨줄 내용을 쓸 EditText를 xml에 추가해줬다.

id도 et_test로 부여해주기

 

 

 

2. activity_sub.xml (TextView에 tv_sub으로 id 추가해주기)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:orientation="vertical"
    tools:context=".subActivity">

    <TextView
        android:id="@+id/tv_sub"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="서브 액티비티 도착"
        android:textSize="30sp" />


</LinearLayout>

 

 

 

3. MainActivity.java

package com.example.android_test;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class MainActivity extends AppCompatActivity {

    private Button btn_move;
    private EditText et_test;
    private String str;
    //빈 문자열 선언

    @Override

    //onCreate -> 어플을 처음 실행했을때 실행됨

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);

//        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
//            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
//            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
//            return insets;
//        });


        et_test = findViewById(R.id.et_test);



        btn_move = findViewById(R.id.btn_move);
        btn_move.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                str = et_test.getText().toString();
                //텍스트 데이터 값 가져와서 str에 넣어주기
                //toString() 까지 해줘야함
                //onCreate안에 넣어주면 안됨 (처음 실행될떄 실행되는거니까 str에 빈값이 들어감


                //첫번째 인자에는 현재 activity.this, 두번째 인자에는 이동하고 싶은 activity.class로 설정
                //intent 객체 생성
                Intent intent = new Intent(MainActivity.this, subActivity.class);
                intent.putExtra("str",str);
                //이름, 실제로 들어가는 값 인자 순
                startActivity(intent); //액티비티 이동해주는 구문
            }
        });


    }
}

 

앞서 쓴 MainActivity.java와 다른점만 찾아보면 되겠다.

  • EditText ed_test 선언 + findViewId로 ed_test 가져오기
  • String str 선언
  • str을 btn_move의 onclick 함수 안에 넣어주기
  • str = et_test.getText().toString() : et_test의 텍스트 값을 가져와서 toString형으로 str에 넣어주기
  • intent.putExtra("str",str) : 첫번째 인자는 name으로 아무거나 지정, 두번째는 실제로 넣어줄 값

 

 

4. subActivity.java

package com.example.android_test;

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

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class subActivity extends AppCompatActivity {


    private TextView tv_sub;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_sub);
//        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
//            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
//            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
//            return insets;
//        });

        tv_sub = findViewById(R.id.tv_sub);


        //날아오는 데이터 값이 있으면 getIntent. 받겠다는 뜻
        Intent intent = getIntent();

        //string 형태로 날아온 데이터 값을 받기
        //name은 쏘아준 name 이랑 받는 name이랑 같아야함
        //MainActivity.java에서 name을 str로 줬으니까 str 받기
        String str = intent.getStringExtra("str");

        tv_sub.setText(str);



    }
}

 

여기서는 sub.xml에서 선언해준 id를 가져와야한다.

따라서 tv_sub을 선언해주고, tv_sub = findViewById(R.id.tv_sub) 해주기!

 

MainActivity.java에서 intent에 putExtra로 str값을 넣어 전송시켰으므로 여기서는 받아야한다.

따라서 Intent 객체를 선언하는데, getIntent()로 받아주는 객체를 선언한다.

 

String 형태로 받기 위해서 String str 선언

intent.getStringExtra(이부분) 에서 이부분은 앞서 쏘아줄때 임의로 설정한 name과 동일해야한다.

MainActivity.java에서 putExtra를 할 때 name을 "str"로 주었기 때문에, "str" 가져오기!

 

String 형태라서 getStringExtra인데, int형을 가져오거나 할때는 getIntExtra(?) 처럼 다른 형태일 것

이후 TextView에 setText를 하여 str 내용을 넣어주면 화면 전환 후 text 가져오기까지 완성~

 

 


 

 

[실행화면]

activity_main.xml

 

activity_sub.xml

 

 

강의를 들으면서 주석까지 썼는데, 이해가 잘 안되면 아래 강의 듣기!!

https://www.youtube.com/watch?v=EKCQ6sxMWNo&list=PLC51MBz7PMyyyR2l4gGBMFMMUfYmBkZxm&index=6