안드로이드 스튜디오 34.1 기준으로 작성 

BommonVaigationView 생성

프로젝트 생성시

프로젝트 생성시 Bottom Navigation Activity 를 선택

Activity 추가시

New > Activity > Bottom Navigation Activity 선택

 

...더보기

기존 액티비티에 추가 할 때

containers > BottomNavigationView 를 끌어다넣는다 그러면 라이브러리가 필요하다고 나오는데 OK를 눌러주자 
Menu item을 슥슥 추가하고 id , icon을 적절하게 넣어준다
추가한 메뉴를 추가해준

 

MissingConstraints 에러가 나고있던것은 레이아웃에서 적절히 잡아주고 background 를 넣어주면 메뉴가 나타난다 
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 생성 

New > Fragment > Fragment (Blank) 로 Fragment 를 생성 
간단한 fragment 를 만듬으로 include fragment factory method와 include interface callback 체크를 풀어준다 

 

각 fragment 레이아웃을 알아볼수있게 적당히 배경색을 바꾼다 

 

BottomNavigation 이벤트를 통해 Fragment 변경

처음만든 레이아웃에 프래그먼트출력을위해 컨테이너를 만들자 예시를 위해 fragment_container를 대충 넣었지만 저런짓은 하지말자 

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

 

 

 

 

 


TableLayout 속성에
 android:stretchcolumns="0,1,2"

를 추가시킵니다
위 내용은 첫번째,두번째, 세번째 칼럼에 남는 여분의 사이즈를 준다는 의미 

 
하지만, 여기서 컬럼이 아니라 Row(세로)의 크기를 똑같이 주고자 할경우

TableRow 속성에 각각
android:layout_weight = "1" 

주세요. 

위 내용은 만약 TableRow가 5개 있을 경우
전체 TableLayout의 전체 높이에 1/5을 사용한다는 말입니다.


1. 키보드 감추기

EditText editText = (EditText) findViewById(R.id.myEdit);
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

2. 키보드 보여주기
EditText editText = (EditText) findViewById(R.id.myEdit);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);

위 코드로 안보이는 경우 아래코드도 시도해보세요
- imm.showSoftInputFromInputMethod (editText .getApplicationWindowToken(),InputMethodManager.SHOW_FORCED);

onCreate등에서 제대로 동작하지 않는다면 
Handler로 post를 해서 위 코드를 실행시켜보세요.

3. 키보드 토글 - 위 두가지 방법으로 안되는 경우 다음과 같은 코드로 동작하는 경우가 있습니다.
imm.toggleSoftInputFromWindow(editText.getApplicationWindowToken(),  InputMethodManager.SHOW_FORCED, 0); 

4. 액티비티 시작시 자동으로 키보드 보여주기
AndroidManifest.xml의 activity 태그의 속성에 android:windowSoftInputMode="stateVisible" 혹은 "stateAlwaysVisible"삽입

5. 액티비티 시작시 자동으로 키보드 보여주지 않기
AndroidManifest.xml의 activity 태그의 속성에 android:windowSoftInputMode="stateHidden" 혹은 "stateAlwaysHidden" 삽입

6. 에디트 텍스트 선택해도 키보드 안뜨게 하기
EditText xml 속성에서 inputType 을 0으로 주면 안뜹니다.

+ Recent posts