2021. 03. 09

멍텅구리·2021년 3월 9일
0

AndroidStudio

목록 보기
5/7

1. 프래그먼트(Fragment)

프레그먼트란 액티비티에 들어가는 부분화면이라고 생각하면 된다. 시스템에서 관리하는 액티비티와 달리 프레그먼트는 액티비티안에 있는 프래그먼트 매니저(Fragment Manager)에서 관리한다.

액티비티의 장점은 시스템에서 직접 관리하지 않기때문에 액티비티보다 가볍게 이용할 수 있다. 또 어떤 액티비티위에서든 재사용할 수 있고 재사용에 있어 액티비티보다 리소스가 적게 들기 때문에 액티비티를 구성하는 데 있어 반드시 알아야 하는 특성이다.

프래그먼트는 두가지로 구성된다. 1. 프래그먼트 화면을 구성하는 xml 레이아웃 파일, 2. 프래그먼트의 기능을 구성하는 클래스 파일
이때 클래스파일은 Fragment 클래스를 상속해야 하고 onCreateView 메소드를 반드시 오버라이드 해주어야 한다. 단순하게 생각하면 onCreateView에서 xml 레이아웃에 정한 리소스들을 인플레이트 해준다.

1) 프래그먼트 생성하기

1. xml 레이아웃 이용

첫번째 방법으로 액티비티 xml에 fragment 태그를 추가함으로써 프래그먼트를 액티비티에 넣을 수 있다. 다음은 korea.co.myfragment.MainFragment 에 저장된 프래그먼트를 액티비티에 넣는 예시이다.

<fragment
            android:id="@+id/mainFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:name="korea.co.myfragment.MainFragment"/>

2. 액티비티 클래스 파일 이용

액티비티의 클래스 파일 안에서도 프래그먼트를 추가해 줄 수 있다.
액티비티에 프래그먼트를 추가해주는 과정에는 프래그먼트 매니저를 호출해transaction을 이용하는 과정이 들어간다. 다음은 container에 fragment를 추가해주는 예시이다.

FragmentManager manager = getSupportFragmentManager();
manager..beginTransaction().add(R.id.container, fragment).commit();

처음 프래그먼트를 넣어줄때는 add를 이용하고 그 다음 넣어준 프래그먼트를 재사용할 때는 replace를 통해 재사용해준다.

2. 프래그먼트 클래스 파일 구성

위에서 말했듯이 클래스파일은 Fragment 클래스를 상속해야 하고 onCreateView 메소드를 반드시 오버라이드 해주어야 한다. 다음은 MenuFragment의 클래스 예시이다.
public class MenuFragment extends Fragment {

public class MenuFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup)inflater.inflate(R.layout.fragment_menu, container, false);
        return rootView;
    }
}

onCreateView 메소드에서 프래그먼트의 레이아웃 파일인 fragment_menu를 인플레이트 해주고 이때 반환되는 객체를 반드시 return 해주어야 한다!

추가로 프래그먼트도 액티비티와 같이 생명주기를 갖는데 중요한 특징은 액티비티위에 올라갈때 onAttach 메소드가 먼저 호출되고 액티비티에서 사라질 때 onDetach 메소드가 호출 된다는 것이다. 예를들면 다음과 같이 프래그먼트 내에서 자신을 호출한 액티비티에 대한 정보를 알 수도 있다.

public void onAttach(Context context) {
       super.onAttach(context);
       activity = (Activity)getActivity(); 
       // 프래그먼트가 올라가있는 액티비티 반환
   }


public void onDetach() {
       super.onDetach();
       activity = null;
   }

2. 액션바와 탭

액션바와 탭은 어플리케이션 화면에서 상단부분을 말한다. 이때 위쪽에 타이틀이 표시되는 부분을 액션바라고 하고 액션바 아래에 있는 은 여러 화면들을 분리해서 넣어놓고 탭을 누름에 따라 저장된 화면들을 분리해서 보여주는 역할을 한다.
액션바
탭

1) 액션바

액션바에는 타이틀외에도 옵션메뉴를 지정하는데 많이 이용된다. 메뉴를 지정하기 위해서는 /res/menu 폴더에 메뉴에 대한 xml 레이아웃을 지정해주어야 한다. 이때 menu 폴더에 있는 레이아웃은 자동으로 메뉴로 인식이 된다. menu 태그에 item 태그를 넣어서 각각의 메뉴옵션을 지정해준다.

<menu xmlns:app="http://schemas.android.com/apk/res-auto"  xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menu_refresh"
        android:title="새로고침"
        android:icon="@drawable/ic_launcher_background"
        app:showAsAction="never"/>
    <item
        android:id="@+id/menu_search"
        android:title="검색"
        android:icon="@drawable/ic_launcher_foreground"
        app:showAsAction="always|withText"
        app:actionLayout="@layout/search_layout"/>
    <item
        android:id="@+id/menu_settings"
        android:title="설정"
        android:icon="@drawable/ic_launcher_background"
        app:showAsAction="never"/>
</menu>

그 후 메인 액티비티에서 메뉴의 작동을 지정해주면 된다. onCreateOptionsMenu() 메소드를 통해 메뉴 레이아웃을 인플레이트 해주고 onOptionsItemSelected() 메소드를 통해 어떤 메뉴 옵션이 선택되었는지 파악할 수 있다.

    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

   public boolean onOptionsItemSelected(MenuItem item) {

        int curId = item.getItemId();
        switch(curId){
            case R.id.menu_refresh:
                break;
            case R.id.menu_search:
                break;
            case R.id.menu_settings:
                break;
            default:
                break;
        }
        return super.onOptionsItemSelected(item);
   }

2) 탭

탭은 안드로이드에서 제공하는 탭 위젯을 이용하는 것 보다는 TabLayout을 이용하여 탭을 지정해주도록 한다. 탭은 activity의 xml에 TabLayout 태그를 추가하여 지정할 수 있고 탭의 기능은 activity의 자바 클래스에서 구현할 수 있다.
우선 탭을 activity 레이아웃에 추가하는 태그들의 구조는 기본적으로 다음과 같이 구성될 수 있다.

<CoordinatorLayout>
   <AppBarLayout>
      <Toolbar>
      </Toolbar>
      <TabLayout>
      </TabLayout>
   </AppBarLayout>
   <FrameLayout>
   </FrameLayout>
</CoordinatorLayout>

위에서는 액션바를 없애고 대신 액션바와 비슷한 기능을 하는 Toolbar를 이용하였다. AppBarLayout에 toolbar와 tabLayout을 넣어 화면의 상단부분을 지정하고 아래에는 fragment를 넣어주기 위해 FrameLayout 태그를 지정해준다. 이때 AppBarLayout과 FrameLayout은 빈틈없이 이어져야 하기 때문에 CoordinatorLayout으로 한번 더 묶어준다.

그 다음에 액티비티의 자바 클래스 파일에서 tabLayout을 불러와 addTab() 메소드를 통해 탭을 추가해주면 된다.

TabLayout tabs = (TabLayout) findViewById(R.id.tabs);
tabs.addTab(tabs.newTab().setText("탭1"));
tabs.addTab(tabs.newTab().setText("탭2"));
tabs.addTab(tabs.newTab().setText("탭3"));

그 후 TabLayout의 setOnTabSelectedListener() 메소드를 통해 탭이 선택되었을때 호출되는 메소드를 정의해준다.

 tabs.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
            '''
            }
profile
치열하게 연습하자

0개의 댓글

관련 채용 정보