안드로이드 스튜디오 34.1 기준으로 작성
BommonVaigationView 생성
프로젝트 생성시
Activity 추가시
기존 액티비티에 추가 할 때
public class MainActivity extends AppCompatActivity {
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener = new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.item1:
return true;
case R.id.item2:
return true;
case R.id.item3:
return true;
}
return false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView navView = findViewById(R.id.nav_view);
navView.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
}
}
activity에서 이벤트 리스너를 추가해준다.
Fragment 생성
BottomNavigation 이벤트를 통해 Fragment 변경
public class MainActivity extends AppCompatActivity {
Fragment menu1Fragment;
Fragment menu2Fragment;
Fragment menu3Fragment;
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_home:
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,menu1Fragment).commit();
return true;
case R.id.navigation_dashboard:
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,menu2Fragment).commit();
return true;
case R.id.navigation_notifications:
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,menu3Fragment).commit();
return true;
}
return false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView navView = findViewById(R.id.nav_view);
navView.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
menu1Fragment = new Menu1Fragment();
menu2Fragment = new Menu2Fragment();
menu3Fragment = new Menu3Fragment();
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,menu1Fragment).commit();
}
}
fragment 생성 후 BottonNavigationView 이벤트에 FragmentManager로 출력될 fragment를 넣어주면 원하는 fragment가 출력된다.
추가 내용
Fragment layout.xml click 이벤트 이슈
아래와 같이 Fragment layout xml 파일에서 클릭이벤트를 지정하고 해당 메소드를 Fragment Class 파일에 작성하면
java.lang.IllegalStateException: Could not find method onClickButton(View) in a parent or ancestor Context for android:onClick attribute defined on view class androidx.appcompat.widget.AppCompatButton with id 'button'
메소드를 찾지 못하는 것을 볼수있다.
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorAccent"
tools:context=".Menu1Fragment">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClickButton"
android:text="Button" />
</FrameLayout>
Fragment를 생성하는 Activity 쪽에 매소드를 만들면 정상작동이 되지만 좋은방법이 아니므로
Fragment 클래스에서 View 를 바로 리턴하지말고 View에서 버튼을 찾아 이벤트를 잡아주자.
public class Menu1Fragment extends Fragment {
private View view ;
private Button button;
public Menu1Fragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
//return inflater.inflate(R.layout.fragment_menu1, container, false);
view= inflater.inflate(R.layout.fragment_menu1,container,false);
button= view.findViewById(R.id.button);
button.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View view) {
}
});
return view;
}
}
참고 : https://ljs93kr.tistory.com/4
https://wimir-dev.tistory.com/13
'부스러기 > 안드로이드' 카테고리의 다른 글
테이블레이아웃 화면에 맞지않을 경우 (0) | 2014.10.08 |
---|---|
소프트 키보드 보이기/감추기 (0) | 2014.10.08 |