공부일지
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"