Android Studio - Activity & Fragment

Minjae Lee·2024년 3월 2일

Android Studio

목록 보기
1/12

1. Activity 개념

Activity class is a crucial component of an Android app.
Activity는 Android app에서 중요한 기본 구성 요소이다.
(Android Developers - Activity)

Activity는 Android Developers 공식 문서의 설명대로, 앱을 구성하는 가장 기본적인 Class이다. 사용자 인터페이스 화면을 띄워주는 역할을 주로 한다.
Activity Class는 onCreate() 콜백 함수가 필수적으로 포함되어야 하는데, 이 함수는 Activity가 활동을 시작할 때 처음 실행된다. 이 외에도 onStart(), onResume() 등의 다양한 콜백이 있지만, 앱을 간단히 제작하는 것이 목적이므로 설명을 생략하겠다.

1-1. onCreate - 기본함수

Android Studio의 Project를 새로 생성한 후 MainActivity의 onCreate() 콜백 함수를 살펴보면, 아래와 같이 구성되어 있다.

  • MainActivity.java
public class MainActivity extends AppCompatActivity {

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

위의 함수에서 setContentViewR.layout.activity_main을 앱의 화면에 띄워주는 역할을 하는데, R.layout.activity_main은 res 폴더 > layout 폴더에 있는 activity_main.xml 파일을 의미한다. 따라서 위의 MainActivity Class가 실행되면 activity_main.xml 파일의 내용이 화면에 실행되게 된다.

1-2. Intent - 화면 전환

Activity에서 다른 Activity로 화면 전환을 필요로 한다면 intent를 사용해야 한다. 화면을 전환할 Activity Class를 인자로 전달하는 방법으로 사용할 수 있다. 구체적인 코드는 아래와 같다.
getApplicationContext함수를 쓰면 현재 앱에 띄워져있는 Context 즉, 현재 Activity를 가져오게 된다. Intent함수는 첫번째 인자의 Activity에서 의 두번째 인자의 Activity로 화면전환을 해주는 함수이기 때문에, 아래의 코드에서는 MainActivity에서 SubActivity로 화면 전환이 이루어지게 된다.

  • MainActivity.java
Intent intent = new Intent(getApplicationContext(), SubActivity.class);
startActivity(intent);

1-3. findViewById - 요소 찾기

Activity에서 띄우는 xml의 요소들(TextView, Button 등)에 대해 어떠한 작업(클릭, 텍스트나 그림 등 내용 변경)을 해주기 위해서 findViewById라는 함수가 필수적이다. 해당 함수는 말 그대로 화면에서 Id를 기준으로 View(요소)를 찾아주는 함수이다.
아래의 코드를 살펴보면, 어떻게 사용해야 하는지 알 수 있다. 먼저 찾으려고 하는 Class를 입력(ImageView, TextView)하고, 변수명을 지정해준다. 그 다음으로 findViewById함수를 호출해주는데, 그 인자로 Id를 넘겨주면 된다.
아래의 코드는 "imageView"라는 Id를 가지는 ImageView를 imageView라는 변수에 저장한 상황과 "welcomeText"라는 Id를 가지는 TextView를 a라는 변수에 저장한 상황이다.

ImageView imageView = findViewById(R.id.imageView);
TextView a = findViewById(R.id.welcomeText);

위와 같이 findViewById를 하고 나면 아래와 같이 setText함수를 이용해 TextView의 내용을 바꾸던가, setOnClickListener함수를 이용해 클릭 시 클릭됨을 알려주는 등 다양하게 활용할 수 있게 된다.

a.setText("welcome, user");
imageView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Toast.makeText(getApplicationContext(), "clicked!", Toast.LENGTH_LONG).show();
    }
});

2. Fragment 개념

Fragment is a reusable portion of your app's UI.
Fragment는 앱 UI의 재사용 가능한 부분을 나타낸다.
(Android Developers - Fragment)

즉, Fragment는 Activity에서 만든 화면의 구성 요소를 재사용 할 수 있다. 재사용이라 함은 새로운 화면을 만들지 않고, 기존에 만들어졌던 화면을 이용하는 것을 말한다. 예를 들면, 앱 개발에서 하단 바를 사용하는 경우, MainActicity의 하단 바 부분은 변하지 않고, 위의 탭만 바뀌기 때문에 하단 바는 Activity로, 위의 탭은 Fragment로 구성해야 한다.

2-1. onCreateView - 기본함수

Fragment는 Activity와 다르게, onCreateView()콜백 함수를 필수적으로 포함해야 한다. 따라서 일부 함수들의 경우 onCreate()를 사용하는 Activity와 다른 코드를 사용해야 한다. 특히 현재 Class의 context를 가져오는 함수에서 가장 큰 차이가 발생한다. Activity에서는 getApplicationContext() 함수를 통해 context를 가져오고, Fragment에서는 getContext() 함수를 통해 context를 가져온다.
Fragment는 아래와 같은 코드가 기본 코드가 된다. Activity와 다른 점으로는 Fragment1과 같이 비어있는 객체가 하나 필요하며, 화면을 띄울 때 setContentView 함수가 아닌 inflater.inflate함수를 사용한다. 따라서 아래의 Fragment가 실행되면 fragment1.xml 파일이 Activity의 부분에 띄워지게 된다.

public class Fragment1 extends Fragment {
    public Fragment1() { }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment1, container, false);
    }
}

2-2. FragmentManager - fragment 전환

Fragment는 Activity의 한 부분이기 때문에, Fragment 단독으로는 사용할 수 없고 Activity나 다른 Fragment에 의해 호출 되어야 한다. Activity에서 Fragment를 호출할 때는 새로운 Fragment 객체를 하나 생성한 후, FragmentManager를 이용하여야 한다. 예시 코드는 아래와 같다. 아래 코드에서 R.id.container는 Fragment가 들어갈 위치라고 생각하면 편하다.

Fragment1 fragment1 = new Fragment1();
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment1).commit();

2-3. findViewById - 요소 찾기

fragment와 Activity의 가장 큰 차이가 발생하는 것 중 하나이다. findViewById는 기본적으로 Activity에서 사용되는 메소드이기 때문에, Fragment에서 사용하기 위해선 우리가 띄울 View에서 찾겠다고 명시해줘야 한다. 따라서 위에서 설명했던 inflager.inflate를 view라는 변수에 저장한 후, findViewById함수를 사용하기 전 view.을 붙여줘야 한다. 예시 코드는 아래와 같다.

  • Fragment1.java
public class Fragment1 extends Fragment {
    public Fragment1() { }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment1, container, false);
        
        ImageView imageView = view.findViewById(R.Id.imageView);
    }
}

0개의 댓글