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;
    }
}