build.grale.ks (Module : app)에서
implementation("com.google.android.material:material:1.9.0")
추가
Sync Now
drawble 우클릭 -> Vector Asset -> cilp Art-> 원하는 이모티콘 클릭-> Next (이렇게 총 5개 만들기)

5개 버튼 이용해서 res 우클릭 후 New Resource Directory에서 menu 만들고 menu 우클릭 후 bottom_menu.xml 만든다.
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_bedroom"
android:enabled="true"
android:icon="@drawable/baseline_bedroom_baby_24"
android:title="아기 침대" />
<item
android:id="@+id/action_bluetooth"
android:enabled="true"
android:icon="@drawable/baseline_bluetooth_24"
android:title="블루투스" />
<item
android:id="@+id/action_bolt"
android:enabled="true"
android:icon="@drawable/baseline_bolt_24"
android:title="번개" />
<item
android:id="@+id/action_bright"
android:enabled="true"
android:icon="@drawable/baseline_brightness_1_24"
android:title="동그라미" />
<item
android:id="@+id/action_build"
android:enabled="true"
android:icon="@drawable/baseline_build_24"
android:title="수리공" />
</menu>
activity_main.xml
ConstraintLayout 써보기

bottomNavigationView 끌어서 맨 밑에 두기
밑 마진 0으로 만들어서 밑으로 붙이기
그럼 ConstraintLayout에 제약을 하나 걸어준 것이기 때문에 에러가 사라진다
Constraint는 Design작업이 편함
FrameLayout 우측 좌측 상단 하단 다 연결해주기->fragment 만드려고 한 거다
layout에서 frag1.xml 만들기 (LinearLayout)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1번 화면 입니다."
android:textSize="40sp"/>
</LinearLayout>
5번 화면까지 만들기
Frag1.java
package com.example.bottomnavi;
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 Frag1 extends Fragment {
private View view;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.frag1,container,false); //findViewId랑 비슷한 것
return view;
}
}
5번까지 만들기
MainActivity.java
package com.example.bottomnavi;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import android.app.Fragment;
import android.os.Bundle;
import android.view.MenuItem;
import com.google.android.material.bottomnavigation.BottomNavigationView;
public class MainActivity extends AppCompatActivity {
private BottomNavigationView bottomNavigationView; // 바텀 네비게이션 뷰
private FragmentManager fm;
private FragmentTransaction ft;
private Frag1 frag1;
private Frag2 frag2;
private Frag3 frag3;
private Frag4 frag4;
private Frag5 frag5;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bottomNavigationView = findViewById(R.id.bottomNavi);
bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
int itemId = item.getItemId();
if (itemId == R.id.action_bedroom) {
setFrag(0);
} else if (itemId == R.id.action_bluetooth) {
setFrag(1);
} else if (itemId == R.id.action_call) {
setFrag(2);
} else if (itemId == R.id.action_bright) {
setFrag(3);
} else if (itemId == R.id.action_build) {
setFrag(4);
}
return true;
}
});
frag1 = new Frag1();
frag2 = new Frag2();
frag3 = new Frag3();
frag4 = new Frag4();
frag5 = new Frag5();
setFrag(0);//첫 프레그먼트 화면을 무엇으로 지정해줄 것인지 선택.
}
// 프레그먼트 교체가 일어나는 실행 문이다.
private void setFrag(int n) {
fm = getSupportFragmentManager();
ft = fm.beginTransaction(); //실제적인 프레그먼트 교체 이루어질 때 프레그먼트 가져와서 transaction
switch (n){
case 0:
ft.replace(R.id.main_frame, frag1);
ft.commit();
break;
case 1:
ft.replace(R.id.main_frame, frag2);
ft.commit();
break;
case 2:
ft.replace(R.id.main_frame, frag3);
ft.commit();
break;
case 3:
ft.replace(R.id.main_frame, frag4);
ft.commit();
break;
case 4:
ft.replace(R.id.main_frame, frag5);
ft.commit();
break;
}
}
}
OnNavigationItemSelected도 원래 switch 문으로 구현했다가 오류가 나서
Alt+Enter키로 if else로 바꿔주었다.
*참고
Android - constant expression required
switch ~ case 문에 상수가 final로 선언되지 않아서 발생하는 문제. Library Project 생성시 R.java 내 값들이 final로 선언되지 않기 때문에 발생하며, R.java은 개발자가 임의로 건들 수 없기 때문에 if ~ else
rosia.tistory.com
[자바 기초] switch case 문에서 final 상수 사용 관련 질문입니다.
if-else 문을 쓰면더 효율적인걸 알고있지만 switch case로 해결해야 하는 숙제입니다. //final int myS = 'A' 로 두었을때는 작동하지만 scanner 메서드로 입력받고 case expressions must be constant expressions 에러가
qna.programmers.co.kr
https://literate-t.tistory.com/43
객체의 final 변수
public class Final { final int ONE = 1; final int TWO = 2; final int THREE = 3; } public class Main { public static void main(String[] args) { Final f = new Final(); int menu = 3; switch(menu) { case f.ONE: break; case f.TWO: break; case f.THREE: break; }
literate-t.tistory.com
결과

'[Android Studio] (Java)' 카테고리의 다른 글
| [Android Studio] Selector (1) | 2023.09.01 |
|---|---|
| [Android Studio] StartActivityForResult (0) | 2023.09.01 |
| [Android Studio] (뒤로 가기 두 번 눌러 앱 종료) (0) | 2023.08.31 |
| [Android Studio] (Spinner 드롭 다운) (0) | 2023.08.29 |
| [Android Studio] (Service 백 그라운드 음악) (0) | 2023.08.28 |