우와테크

androidStudio 안드로이드 BottomSheetDialogFragment를 다보이게 FullScreen 설정하기 본문

java-androidStudio

androidStudio 안드로이드 BottomSheetDialogFragment를 다보이게 FullScreen 설정하기

uwaTech 2022. 7. 7. 11:49

검색조건을 구현하고 있다.

검색조건입력란에 키보드를 이용해서 사용자가 직접 입력하기도 하지만 사용자의 실수를 줄이기 위해서 보기를 만들려고 한다. 우와는 이 보기를 만들고 싶다.

지금 우와는 Dialog를 쓰고 싶은데 가상키보드가 구현되는 것처럼 하고 싶다.

 

1. 화면 아래에서 위로 뜨는데

2. Dialog가 화면에 표시 될때는 화면 아래에 위치하고

3. 해당 내용이 모두 보일 수 있게 

구현 하고 싶다.

 

여기서 필요한 것이 BottomSheetDialog이다.

 

보는 사람 : ????????제목은 BottomsheetDialogFragment 인데???

 

기존에 우와는 4.dialog에 입력값을 넘겨 받을 때 Bundle을 이용하고 있다.

이부분을 그대로 사용하기 위해서 BottomSheetDialogFragment를 이용하기로 한다.

BottomSheetDialogFragment를 생성하고 해당 값을 넘겨줄 때 setArguments(번들변수); 를 쓸 것이다.

 

[순서]
1. dialog.xml 만들기
2. BottomSheetDialogFramgent.java 만들기
3. BottomSheetDialogFramgent 상속받기
4. dialog.xml 연결하기
5. BottomSheetBehavior 선언하기
6. BottomSheetBehavior 조작하기 - 해당내용을 모두 보일 수 있게 (default : 빼꼼보인다.)
7. Main.java에서 Dialog 보이는 이벤트 만들기
8. setArguments(번들변수) 사용하기

 

 

1. dialog.xml 만들기

<?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:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="test"/>
        
</LinearLayout>

2. BottomSheetDialogFramgent.java -BSDialogFragment만들기

public class BSDialogFragment extends BottomSheetDialogFragment {//3. BottomSheetDialogFramgent 상속받기
    private String value;  //앞의 화면에서 받아오는 값 받는 변수
    BottomSheetBehavior bottomSheetBehavior; //5. BottomSheetBehavior 선언하기
    public AFragment aFragment;
    public AActivity aActivity;

    public BSDialogFragment(AFragment aFragment) {
        this.aFragment =  aFragment;
    }
    public BSDialogFramgent(AActivity aActivity){
    	this.aActivity = aActivity;
    }

    @Nullable
    @Override
    public View onCreateView(@Nullable LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.dialog, container, false); //4. dialog.xml 연결하기
		//앞의 화면에서 받아오는 값
        Bundle args = getArguments();
        value = args.getString("value");

        TextView textView = (TextView)view.findViewById(R.id.textView);
        return view;
    }
    //6. BottomSheetBehavior 조작하기 - 해당내용을 모두 보일 수 있게 (default : 빼꼼보인다.)
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        bottomSheetBehavior = BottomSheetBehavior.from((View) (view.getParent()));
        bottomSheetBehavior.setMaxWidth(ViewGroup.LayoutParams.MATCH_PARENT);
        bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
    }

}

3-6 번은 소스내에 있다.

 

7. Main.java에서 Dialog 보이는 이벤트 만들기

public class AFragment extends Fragment {
    public AFragment(){}
    
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_a, container, false);
        Button btn = (Button) view.findViewById(R.id.btn);
        btn.setOnClickListener(onClickListener);
        return view;
    }
    /**
     * 버튼 리스너
     */
    private final View.OnClickListener onClickListener = view -> {
        Bundle args = new Bundle();
        args.putString("value", "데이터 전달");
        BottomSheetDialogFragment dialog = new BSDialogFragment(this);
        dialog.setArguments(args); //8. setArguments(번들변수) 사용하기
        dialog.show(getActivity().getSupportFragmentManager(), "tag");
        }
    };
}

[Fragment 버전]

public class AActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);        
        setContentView(R.layout.activity_a);
        Button btn = (Button) view.findViewById(R.id.btn);
        btn.setOnClickListener(onClickListener);
    }
    /**
     * 버튼 리스너
     */
    private final View.OnClickListener onClickListener = view -> {
        Bundle args = new Bundle();
        args.putString("value", "데이터 전달");
        BottomSheetDialogFragment dialog = new BSDialogFragment(this);
        dialog.setArguments(args); //8. setArguments(번들변수) 사용하기
        dialog.show(getSupportFragmentManager(), "tag");
        }
    };
}

[Activity버전]

 

 

주의 할 점 

생명주기를 무조건 지켜야 한다!!!!안지키면 안드로이드는 죽는다..

2번 소스를 보면

onCreateView
onViewCreated


를 사용하였다.

        bottomSheetBehavior = BottomSheetBehavior.from((View) (view.getParent()));
        bottomSheetBehavior.setPeekHeight(BottomSheetBehavior.PEEK_HEIGHT_AUTO);

를 onCreateView 에 작성하면 아래와 같은 에러가 뜬다.

 

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.ViewGroup$LayoutParams android.view.View.getLayoutParams()' on a null object reference (안지켜서 대충 죽었다는 말)

 

view가 만들어진 뒤에 view의 속성을 초기화해야 하는데 view를 만들기전에 초기화했기 때문이다.

이부분을 주의 해야 한다.

onCreateView - view 만들기
onViewCreated - view 속성( bottomSheetBehavior) 초기화하기

 

 

끄ㅌ

참조 : https://developer.android.com/guide/components/fragments?hl=ko#Creating