결과 화면 :
이렇게 머리 위에 뜨는 것을 탭 레이아웃이라고 한다.
먼저 부모 레이아웃 내부에 탭 레이아웃을 생성한다. 이건 구글의 디자인이므로 implement 해주어야 한다.
- 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:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</com.google.android.material.tabs.TabLayout>
<androidx.viewpager.widget.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
이제 레이아웃 리소스에 전환될 화면 3개를 만들어보자.
-Frag1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:background="@android:color/holo_blue_light"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="첫 번째 프래그먼트"
android:textSize="40sp"
android:textStyle="bold"
android:gravity="center"/>
</LinearLayout>
-Frag2.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:background="@android:color/holo_orange_light"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="두 번째 프래그먼트"
android:textSize="40sp"
android:textStyle="bold"
android:gravity="center"/>
</LinearLayout>
-Frag3.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_green_light">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="세 번째 프래그먼트"
android:textSize="40sp"
android:textStyle="bold"
android:gravity="center"/>
</LinearLayout>
이제 디자인이 끝났으니, java 코드를 살펴보자.
먼저, 세 Frag를 불러줄 frag 클래스를 따로 지정해야한다.
-Frag1.java
package com.mary.myapplication;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
//외부에서 new Frag1 호출 시
public class Frag1 extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v=inflater.inflate(R.layout.frag_1,container,false);
return v;
}
}
-Frag2.java
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
public class Frag2 extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v=inflater.inflate(R.layout.frag_2,container,false);
return v;
}
}
-Frag3.java
package com.mary.myapplication;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
public class Frag3 extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v=inflater.inflate(R.layout.frag_3,container,false);
return v;
}
}
inflater은 xml을 객체화 시켜 화면에 띄우는 용도이다. 탭을 한다고 해서 화면의 전환이 이루어지는게 아닌, ajax처럼 탭 아래만 전환되기 때문이다.
R 파일 내부의 frag 레이아웃을 찾아서, 뷰를 띄울 컨테이너를 찾는다. 이 때, 마지막 attachtoroot를 false로 지정해줘야 한다.
이제 이 Fragment를 관리해줄 어댑터를 만든다.
package com.mary.myapplication;
//FragmentPagerAdapter -> 모든 프래그먼트를 메모리에 미리 로딩 시키고 소멸X
//FragmentStatePagerAdapter -> default 3. 자기를 포함한 양 옆까지 메모리에 로딩
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import java.util.ArrayList;
import java.util.List;
public class FragmentAdapter extends FragmentPagerAdapter {
private List<Fragment> fragmentList = new ArrayList<>();
public FragmentAdapter(@NonNull FragmentManager fm, int behavior) {
super(fm, behavior);
}
public void addFragment(Fragment fragment){
fragmentList.add(fragment);
}
@NonNull
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}
@Override
public int getCount() {
return fragmentList.size();
}
}
어댑터는 다양한 fragment를 관리해야하므로, 컬랙션의 형태로 지정한다.
FragmentAdapter, getItem, getCount의 경우 extend한 FragmentPagerAdapter 인터페이스가 가지는 강제성이므로, 이것을 반드시 부여해야한다(안드로이드 기본 단축키 (ctrl+i or ctrl+o).
getItem의 경우 fragmentList의 아이템을 불러오는 함수이므로, get(index)의 형태로 불러오도록 한다.
getCount는 fragmentList의 길이를 구하는 함수이다.
여기에 추가로 addFragment 함수를 추가하는데, 외부에서 이 함수를 통해 fragmentList에 fragment를 넣을 수 있게 한다.
이제 메인 페이지로 넘어가자.
- MainActivity.java
package com.mary.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;
import android.os.Bundle;
import com.google.android.material.tabs.TabItem;
import com.google.android.material.tabs.TabLayout;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "Main_Activity";
private TabLayout tabLayout;
private ViewPager viewPager;
private FragmentAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tabLayout=findViewById(R.id.tabs);
viewPager=findViewById(R.id.view_pager);
adapter=new FragmentAdapter(getSupportFragmentManager(),1);
//FragmentAdapter에 컬렉션 담기
adapter.addFragment(new Frag1());
adapter.addFragment(new Frag2());
adapter.addFragment(new Frag3());
//ViewPager Fragment 연결
viewPager.setAdapter(adapter);
//ViewPager과 TabLayout 연결
tabLayout.setupWithViewPager(viewPager);
tabLayout.getTabAt(0).setText("첫 번째");
tabLayout.getTabAt(1).setText("두 번째");
tabLayout.getTabAt(2).setText("세 번째");
}
}
각 요소를 전역변수로 지정하고, 전역변수에 findViewById를 통해 값을 집어넣는다.
Adapter에서 만든 addFragment 함수를 이용해 프레그먼트를 리스트 내부에 집어넣고, set함수를 통해 viewPager과 Fragment, TabLayout을 연결한다.
마지막으로 탭에 이름을 선언해주면 완료된다.
'Android' 카테고리의 다른 글
안드로이드 스튜디오,java]Bottom Navigation 구현 (0) | 2020.07.16 |
---|---|
안드로이드 스튜디오, java]프레그먼트, 탭, 메뉴 구성 응용 (0) | 2020.07.16 |
안드로이드 스튜디오,java]커스텀 액션 바 제작하기 (5) | 2020.07.15 |
안드로이드 스튜디오,java] 기초 액션바 만들기 (0) | 2020.07.15 |
안드로이드 스튜디오] 이벤트가 실행되기 까지 (0) | 2020.07.14 |