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);
}
});
}
}
잘 작동된다.
'Android' 카테고리의 다른 글
[Android] 디바이스 위치: LocationManager (0) | 2022.07.29 |
---|---|
[Android] 버튼 색 바꾸기: setTextColor, setBackgroundColor (0) | 2022.07.28 |
[Android] Multipart를 이용한 사진파일 포스트 API (0) | 2022.07.26 |
[Android] Retrofit2 설정, API호출 (0) | 2022.07.21 |
[Android] 카메라 기능: string-array, provider (0) | 2022.07.21 |
댓글