본문 바로가기
Android

[Android] fragment 사용하여 탭 만들기

by eyoo 2022. 7. 27.

fragment는 화면을 보여준다.

 

먼저 메인 레이아웃을 RelativeLayout으로 바꾼다.

 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    tools:context=".MainActivity">


</RelativeLayout>

 

 

디자인에서 BottomNavigationView를 골라 넣는다.

 

# layout height를 wrap_content로 설정한다.

# layout_alignParentbottom을 true로 설정하여 NavigationView를 밑으로 보낸다.

# id를 bottomNavigationView로 설정한다.

 

 

왼쪽의 Resource Manager를 열고 Navigation을 선택 후 추가버튼을 누른다.

 

# 그럼 Navigation Resource File이 나오는데 그것을 눌러 생성한다.

 

 

경고창이 나오면 OK를 눌러 넘어가자

 

# 간혹 위의 경고창이 뜨지않고 계속 loading중으로 되어 design기능을 사용하지 못하는 경우가 있는데 이때는 프로그램 재시작하면 사용할수있다.

 

 

위의 New Destination 버튼을 누른 후 Create new destination을 선택해  fragment들을 추가한다.

 

# 이 방식으로 구현하고자 하는 탭의 수만큼 만든다.

 

 

그 후 메인 레이아웃에서 NavHostFragment를 BottomNavigationView와 같은 위치에 넣는다.

 

 

 

그러면 아래와 같은 창이 나오는데  위에서 만들었던 my_nav를 선택하여 넣는다.

 

# 그 후 code에서 layout_above을 bottomNavigationView 위쪽으로 설정하여 디자인해준다.

 

android:layout_above="@+id/bottomNavigationView"

 

 

이제 탭을 구성하기 위해 메뉴를 만든다.

 

# 메뉴도 Resource Manager를 통해 만들수 있다.

 

 

Menu item을 구성할 탭의 수만큼 만들어 준다.

 

 

 

위에서 만든 메뉴를 메인 레이아웃의 bottomNavigationView에서 menu로 적용시킨다.

 

# 만약 탭이 3개 이상이면 정상적으로 보이지 않는 경우가 있는데 그때 코드에서 BottomNavigationView에 labelVisibilityMode를 labeled로 설정한다.

 

app:labelVisibilityMode="labeled"

 

 

이제 메인 엑티비티에서 fragment를 눌렀을때 해당 화면이 불러지도록 코드를 작성한다,

 

public class MainActivity extends AppCompatActivity {

    BottomNavigationView nevigationView;
    Fragment firstFragment;
    Fragment secondFragment;
    Fragment thirdFragment;

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

        // 엑션바 숨기는 함수
        getSupportActionBar().hide();
        nevigationView = findViewById(R.id.bottomNavigationView);
        
        // Fragment호출
        firstFragment = new FirstFragment();
        thirdFragment = new ThirdFragment();
        secondFragment = new SecondFragment();


        // Fragment 선택하는 함수
        nevigationView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                int itemId = item.getItemId();

                Fragment fragment =  null;

                if(itemId == R.id.firstFragment){
                    fragment = firstFragment;
                    getSupportActionBar().setTitle("홈");
                    getSupportActionBar().show();

                } else if(itemId == R.id.secondFragment){
                    fragment = secondFragment;
                } else if(itemId == R.id.thirdFragment){
                    fragment = thirdFragment;
                }
                return loadFragment(fragment);
            }
        });
        
    }

    // Fragment 로드하는 함수
    private boolean loadFragment(Fragment fragment) {
        if(fragment!=null){
            getSupportFragmentManager()
                    .beginTransaction()
                    .replace(R.id.fragment, fragment)
                    .commit();
            return true;
        }
        return false;
    }
}

 

 

이후 fragment java파일에서 각 fragment들의 기능이 동작하도록 작업한다.

 

public class FirstFragment extends Fragment {

    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;

    // 첫째로 화면과 매칭할 멤버변수 설정
    RecyclerView recyclerView;
    MyPostingAdapter adapter;
    ArrayList<Posting> postingList = new ArrayList<>();

    ProgressBar progressBar;
    private int count;
    private int offset;
    private int limit = 25;


    public FirstFragment() {
        // Required empty public constructor
    }

    ...

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        // 그 후 여기서 작업
        // ViewGroup rootView 설정
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_first, container, false);

        // rootView를 통해 findViewById를 사용한다.
        progressBar = rootView.findViewById(R.id.progressBar);
        recyclerView = rootView.findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        // 프레그먼트는 getContext를 사용
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

        getNetworkData();

        return rootView;
    }

    // 네트워크에 데이터를 가져오는 함수 (onResume 에서 실행할 함수)
    void getNetworkData(){
        Log.i("MyApp","get호출");
        postingList.clear();
        count = 0;
        offset = 0;

        progressBar.setVisibility(View.VISIBLE);

        Retrofit retrofit = NetworkClient.getRetrofitClient(getContext());
        PostingApi api = retrofit.create(PostingApi.class);

//        SharedPreferences sp = getContext().getSharedPreferences(Config.PREFERENCE_NAME,getContext().MODE_PRIVATE);  테스트를 위한 하드코딩
        String accessToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcmVzaCI6ZmFsc2UsImlhdCI6MTY1ODg5Mzk1OCwianRpIjoiMzEyZGE2OGItYmNmNS00MmU0LTlkNzYtNDQxM2FmMzFiMzMzIiwidHlwZSI6ImFjY2VzcyIsInN1YiI6MSwibmJmIjoxNjU4ODkzOTU4fQ.MjQz3rXpXhEMCTAsovU7hqlHce9OCvIi9LtmDOEq7As"; // sp.getString("accessToken","");

        Call<PostingList> call = api.getMyPosting("Bearer "+accessToken,
                offset,
                limit);
        call.enqueue(new Callback<PostingList>() {
            @Override
            public void onResponse(Call<PostingList> call, Response<PostingList> response) {
                progressBar.setVisibility(View.GONE);
                if(response.isSuccessful()){
                    count = response.body().getCount();
                    postingList.addAll(response.body().getResult_list());
                    offset = offset + count;
                    adapter = new MyPostingAdapter(getContext(), postingList);
                    recyclerView.setAdapter(adapter);
                }
            }

            @Override
            public void onFailure(Call<PostingList> call, Throwable t) {
                progressBar.setVisibility(View.GONE);
            }
        });

    }
}

 

 

잘 작동된다.

 

 

 

 

 

 

댓글