본문 바로가기

안드로이드/코드

[안드로이드] 액티비티, 프래그먼트 데이터 전달 Intent, Bundle, setArguments, getArguments

반응형

 

 

 

 

 

send3

 

액티비티와 액티비티, 그리고 액티비티에서 프래그먼트로 데이터를 전달하는 예제를 만들어보겠습니다.

액티비티 2개, 프래그먼트 1개를 만들고

 

1. MainActivity에서 RequestActivity로 데이터를 전달

2. RequestActivity에서 Fragment1로 데이터 전달

 

1. RequestActivity 생성

패키지 폴더에서 마우스 오른쪽버튼을 누르시고 숫자 순서로 진행하시면 됩니다. 잘 안보이시면 빨, 주, 노, 초 순으로 했으니까 색으로 구분하셔서 보시면 됩니다.

send2

 

 

send1

 

 

2. activity_main.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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/main_et"
        android:inputType="text"
        android:imeOptions="actionDone"
        android:maxLines="1"
        android:gravity="center"
        android:textColor="@android:color/black"
        android:textSize="30sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
        android:imeOptions="actionDone"
        android:id="@+id/main_bt"
        android:textColor="@android:color/black"
        android:textSize="30sp"
        android:text="전송"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>



</LinearLayout>

 

android:inputType="text"
android:imeOptions="actionDone"
android:maxLines="1"

텍스트를 입력하고 확인을 누르면 키보드가 내려가지 않아서 해당부분을 추가했습니다.

 

3. activity_request.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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/request_layout"
    tools:context=".RequestActivity"
    android:orientation="horizontal">

</LinearLayout>

레이아웃은 어떤 레이아웃이라도 상관없습니다.

프래그먼트를 띄워줘야하기 때문에 id값만 잘 기억하고 계시면 됩니다.

저는 request_layout이라고 만들었습니다.

 

4. fragment1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:gravity="center"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/fragment_tv"
        android:gravity="center"
        android:textSize="30sp"
        android:textColor="@android:color/black"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

 

5. MainActivity.java

import androidx.appcompat.app.AppCompatActivity;

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

public class MainActivity extends AppCompatActivity {
    EditText main_et;
    Button main_bt;

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

        main_et = findViewById(R.id.main_et);

        main_bt = findViewById(R.id.main_bt);
        main_bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //EditText의 text를 저장
                String text = main_et.getText().toString();

                //RequestActivity로 전달할 인텐트 생성
                Intent intent = new Intent(MainActivity.this, RequestActivity.class);

                //text값 인텐트에 저장
                intent.putExtra("text",text);

                //RequestActivity 시작
                startActivity(intent);
            }
        });
    }
}

EditText에 값을 입력하고 버튼을 누르게 되면 RequestActivity에 데이터를 전달하면서 액티비티를 시작합니다.

 

 

6. RequestActivity.java

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;

public class RequestActivity extends AppCompatActivity {
    Fragment1 fragment1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_request);
        //MainActivity의 인텐트를 받아서 text값을 저장
        Intent intent = getIntent();
        String text = intent.getStringExtra("text");

        //fragment 생성
        fragment1 = new Fragment1();

        //requestActivity에 fragment1을 띄워줌
        getSupportFragmentManager().beginTransaction().replace(R.id.request_layout,fragment1).commit();

        //번들객체 생성, text값 저장
        Bundle bundle = new Bundle();
        bundle.putString("text",text);

        //fragment1로 번들 전달
        fragment1.setArguments(bundle);
    }
}

MainActivity로 부터 받은 인텐트를 이용해서 인텐트 안의 값을 불러오고 프래그먼트로 데이터를 전달합니다.

 

//번들객체 생성, text값 저장
Bundle bundle = new Bundle();
bundle.putString("text",text);


//fragment1로 번들 전달
fragment1.setArguments(bundle);

이부분이 액티비티에서 프래그먼트로 데이터를 전달하는 부분입니다.

 

7. Fragment1.java

 

package com.everyshare.sendtest;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

public class Fragment1 extends Fragment {
    ViewGroup viewGroup;
    TextView fragment_tv;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        viewGroup = (ViewGroup) inflater.inflate(R.layout.fragment1,container,false);
        fragment_tv = viewGroup.findViewById(R.id.fragment_tv);

        //RequestActivity에서 전달한 번들 저장
        Bundle bundle = getArguments();

        //번들 안의 텍스트 불러오기
        String text = bundle.getString("text");

        //fragment1의 TextView에 전달 받은 text 띄우기
        fragment_tv.setText(text);

        return viewGroup;
    }
}

 

 

 

Bundle을 이용해서 클래스를 전달하기 위해서는 클래스를 Serializable을 해줘야하는데 Parcelable이 안드로이드 내에서는 더 효율적이라고 하는데요. 다음 포스팅에서는 Parcelable을 이용해서 객체를 전달하는 예제를 만들어보겠습니다.

 

 

반응형