공부일지

231211 (Android)

CD가참둥그렇다 2023. 12. 11. 14:13

리사이클러뷰로 스와이프 뷰 만들기

  • viewpager2를 xml에서 만들어준다.
  • viewpager2에 리사이클러뷰 어댑터를 설정해준다.
  • setOrientation : 스와이프 방향을 설정한다.
  • 양쪽에 다음 페이지와 이전 페이지가 살짝 보이게 하고 싶은 경우 아래의 코드를 사용한다.
  • setClipToPadding : 패딩을 스크롤 영역으로 사용하기 위해서 false를 부여해 준다.
  • setClipChildren : 뷰가 자신의 영역 밖에서 동작할 수 있도록 false로 처리한다. true시 자신의 영역에서만 동작한다.
  • setOffscreenPageLimit : 선택된 페이지 이외에 로딩될 페이지 수를 정한다. 좌우로 선택된 개수만큼 미리 로딩된다.
  • setPageTransformer : 페이지 전환 효과를 설정할 수 있다.
  • MarginPageTransformer : 페이지 전환 효과 중 양쪽 페이지의 일부를 보여주도록 하는 전환 효과를 말한다. 파라메터로 넘기는 숫자는 좌우에 보여줄 페이지의 크기를 말한다.
binding.viewpager2.setClipToPadding(false);
        binding.viewpager2.setClipChildren(false);
        binding.viewpager2.setOffscreenPageLimit(1);
        binding.viewpager2.setPadding(50, 0, 50, 0);
        binding.viewpager2.setPageTransformer(new MarginPageTransformer(25));
binding.viewpager2.setAdapter(new AccountAdapter(inflater, getContext()));
        binding.viewpager2.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL);
        binding.viewpager2.setClipToPadding(false);
        binding.viewpager2.setClipChildren(false);
        binding.viewpager2.setOffscreenPageLimit(1);
        binding.viewpager2.setPadding(50, 0, 50, 0);
        binding.viewpager2.setPageTransformer(new MarginPageTransformer(25));
        binding.viewpager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
            @Override
            public void onPageSelected(int i) {
                super.onPageSelected(i);

            }
        });

칩, 칩그룹(Chip, Chip Group)

  • 선택 토글 기능이 있는 버튼을 말한다.
  • 칩은 칩 그룹으로 관리한다.
  • 칩은 선택된 상태와 선택되지 않은 상태가 있다.
  • 각 상태에 따른 형태는 drawable에 미리 색상을 지정하여 적용할 수 있다.
<com.google.android.material.chip.ChipGroup
            android:id="@+id/chipGroup"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:singleSelection="true"
            app:selectionRequired="true">

<com.google.android.material.chip.Chip
            android:id="@+id/chip_1"
            style="@style/Widget.MaterialComponents.Chip.Choice"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:chipIconTint="@drawable/chip_opentalk_foreground"
            android:textColor="@drawable/chip_opentalk_foreground"
            app:chipBackgroundColor="@drawable/chip_opentalk_background"
            android:checked=""
            app:chipIcon="@drawable/ic_chip_opentalk1"
            app:chipIconEnabled="true"
            app:iconStartPadding="10dp"
            app:iconEndPadding="10dp"
            app:textStartPadding="5dp"
            app:textEndPadding="5dp"
            app:chipMinHeight="40dp"
            android:text="내 채팅방"/>

칩, 칩그룹의 속성들

  • singleSelection : 하위 요소 중 하나만 선택 가능하도록 한다.
  • selectionRequired : 반드시 하위 요소 중 선택된 것이 있어야 한다.
  • chipIcon : 칩 왼쪽에 표시할 아이콘 리소스
  • chipIconEnabled : 칩 아이콘을 표시할지 여부
  • iconStartPadding : 패딩 설정이 아이콘과 텍스트가 따로 적용되고, 좌우를 start와 end로 구분하여 적용한다.
  • checked : 기본값이 체크 된 상태로 적용한다.
  • textColor : 글자 색이나 배경 색은 drawable에 미리 만들어둔 색상 정보를 적용시킬 수 있다. 선택됨 여부에 따라 글자 색과 배경 색이 바뀌게 된다.
<com.google.android.material.chip.ChipGroup
            android:id="@+id/chipGroup"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:singleSelection="true"
            app:selectionRequired="true">

<com.google.android.material.chip.Chip
            android:id="@+id/chip_1"
            style="@style/Widget.MaterialComponents.Chip.Choice"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:chipIconTint="@drawable/chip_opentalk_foreground"
            android:textColor="@drawable/chip_opentalk_foreground"
            app:chipBackgroundColor="@drawable/chip_opentalk_background"
            android:checked=""
            app:chipIcon="@drawable/ic_chip_opentalk1"
            app:chipIconEnabled="true"
            app:iconStartPadding="10dp"
            app:iconEndPadding="10dp"
            app:textStartPadding="5dp"
            app:textEndPadding="5dp"
            app:chipMinHeight="40dp"
            android:text="내 채팅방"/>

프래그먼트 스테이트 어댑터(FragmentStateAdapter)

  • 프래그먼트를 슬라이드로 전환하는 방식의 어댑터
  • 프래그먼트를 요소로 가진다.
  • RecyclerView || ViewPager2 같이 사용된다.
  • Fragment 리스트를 넘기고 FragmentStateAdapter를 상속받아 메소드를 완성시킨다.
ArrayList<Fragment> list;

    public OpenTalkPagerAdapter(@NonNull Fragment fragment, ArrayList<Fragment> list) {
        super(fragment);
        this.list = list;
    }

    @NonNull
    @Override
    public Fragment createFragment(int i) {
        return list.get(i);
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

페이지 전환의 체크 후 칩그룹에 보여주기

binding.pager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
            @Override
            public void onPageSelected(int i) {
                super.onPageSelected(i);
                if(i == 0){
                    binding.chipGroup.check(R.id.chip_1);
                } else  if(i == 1){
                    binding.chipGroup.check(R.id.chip_2);
                } else  if(i == 2){
                    binding.chipGroup.check(R.id.chip_3);
                } else  if(i == 3){
                    binding.chipGroup.check(R.id.chip_4);
                }
            }
        });

칩 그룹 선택 시 뷰페이저 전환

  • setOnCheckedChangeListener : 칩그룹의 선택된 요소가 바뀔 때 동작한다.
  • checkedId : 칩그룹 중 체크된 요소의 아이디를 가져온다.
  • setCurrentItem : 현재 보여지는 프래그먼트를 해당 번호의 프래그먼트로 전환한다.
binding.chipGroup.setOnCheckedChangeListener(new ChipGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(@NonNull ChipGroup group, int checkedId) {
                if(checkedId == R.id.chip_1){
                    binding.pager2.setCurrentItem(0,true);
                } else if(checkedId == R.id.chip_2){
                    binding.pager2.setCurrentItem(1,true);
                } else if(checkedId == R.id.chip_3){
                    binding.pager2.setCurrentItem(2,true);
                } else if(checkedId == R.id.chip_4){
                    binding.pager2.setCurrentItem(3,true);
                }
            }
        });

인플레이터, 컨텍스트를 받아오지 않았을 때 인플레이터 처리

  • 인플레이터를 가져오지 않았을 때 from 메소드와 parent.getContext()를 이용하여 인플레이터를 가져올 수 있다.
ItemRecvChatBinding binding 
	= ItemRecvChatBinding.inflate(LayoutInflater.from(parent.getContext()),parent,false);

글자 수 제한과 초과 시 … 나오는 처리

  • 글자 수 제한으로 maxLength를 이용할 수 있다.
  • 글자 수 제한으로 maxLength 대신 ems를 이용하면 글자 수 초과시 …을 나타내도록 할 수 있다.(ellipsize=”end”)
		android:ems="11"
            android:ellipsize="end"
            android:maxLines="1"