Android
[Android] ActionBar(액션바)
jane.dev
2021. 10. 29. 09:29
반응형
ActionBar
탭을 클릭하면 해당 탭의 테마가 요청하는 레이아웃으로 변경
ActionBar는 Activity 내부에 기본적으로 포함된 요소이기 때문에, xml에 위젯을 추가하지 않아도 사용가능
→ activity_main.xml
파일이 필요하지 않으며
MainActivity.java
에서 탭을 구현하고 CustomTabFragment.java
를 만들어 탭별로 화면 구성
MainActivity.java
// MainActivity는 AppCompatActivity 를 상속하고 ActionBar 를 구현
public class MainActivity extends AppCompatActivity implements ActionBar.TabListener {
// Tap 개수만큼 변수 선언(3개의 Tab)
ActionBar.Tab tabKorean, tabChinese, tabJapanese;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// getSupportActionBar()를 호출하면
// ActionBar의 메서드를 호출하고 이는 AppBar를 조정하는 ActionBar 객체 참조를 반환
ActionBar bar = getSupportActionBar();
// NavigationMode 탭을 지원하도록 속성을 설정
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// 1번 탭
tabKorean = bar.newTab();
tabKorean.setText("한식");
tabKorean.setTabListener(this);
bar.addTab(tabKorean);
// 2번 탭
tabChinese = bar.newTab();
tabChinese.setText("중식");
tabChinese.setTabListener(this);
bar.addTab(tabChinese);
// 3번 탭
tabJapanese = bar.newTab();
tabJapanese.setText("일식");
tabJapanese.setTabListener(this);
bar.addTab(tabJapanese);
}
// 탭이 선택될 때마다 바뀌는 내용을 처리해야하므로 onTabSelected를 재정의
// CustomTabFragment 3개를 선언
CustomTabFragment customFrags [] = new CustomTabFragment[3];
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
// 위에서 선언한 CustomTabFragment를 초기화
CustomTabFragment cFrag = null;
// 탭이 선택되지 않았다면 새로 탭을 생성(선택된 탭을 getPosition()으로 얻어올 수 있음)
if(customFrags[tab.getPosition()] == null){
cFrag = new CustomTabFragment();
Bundle data = new Bundle();
data.putString("tabName", tab.getText().toString());
cFrag.setArguments(data);
customFrags[tab.getPosition()] = cFrag;
}else{
// 탭이 선택된 적인 있다면
cFrag = customFrags[tab.getPosition()];
}
// 화면을 해당 탭으로 교체
ft.replace(android.R.id.content, cFrag);
}
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
}
}
CustomTabFragment.java
// androidx.fragment.app.Fragment 를 상속
public class CustomTabFragment extends androidx.fragment.app.Fragment{
// 탭 이름을 감지해 어떤 탭을 보여줘야 하는지(한식, 중식, 일식) 확인을 위한 변수 선언
String tabName;
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
// 탭 이름 감지 관련 코드 세팅
Bundle data = getArguments();
tabName = data.getString("tabName");
}
// 화면이 변경될 때마다 처리할 로직 작성
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// java 코드에서 LinearLayout을 생성
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
// baseLayout은 탭 하단의 실제로 바뀔 화면
LinearLayout baseLayout = new LinearLayout(super.getActivity());
baseLayout.setOrientation(LinearLayout.VERTICAL);
baseLayout.setLayoutParams(params);
// 이미지파일을 넣으려면
ImageView img = new ImageView(super.getActivity());
if (tabName == "한식") {
img.setImageResource(R.drawable.koreanfood);
baseLayout.addView(img);
}
if (tabName == "중식") {
img.setImageResource(R.drawable.chinese);
baseLayout.addView(img);
}
if (tabName == "일식") {
img.setImageResource(R.drawable.japanesefood);
baseLayout.addView(img);
}
return baseLayout;
}
}