여기 에서이 문제에 대해보고 했지만 (거기에서 내 해결 방법 프로젝트를 확인할 수도 있습니다), 지금은 약간 해킹이되었지만이를 극복 할 수있는 쉬운 방법을 찾았습니다.
여기에 코드가 있습니다. 이 클래스에서 확장하면 나머지는 자동입니다.
Kotlin
abstract class BasePreferenceFragment : PreferenceFragmentCompat() {
override fun onCreateAdapter(preferenceScreen: PreferenceScreen?): RecyclerView.Adapter<*> {
return object : PreferenceGroupAdapter(preferenceScreen) {
override fun onBindViewHolder(holder: PreferenceViewHolder, position: Int) {
super.onBindViewHolder(holder, position)
val preference = getItem(position)
if (preference is PreferenceCategory)
setZeroPaddingToLayoutChildren(holder.itemView)
else
holder.itemView.findViewById<View?>(R.id.icon_frame)?.visibility = if (preference.icon == null) View.GONE else View.VISIBLE
}
}
}
private fun setZeroPaddingToLayoutChildren(view: View) {
if (view !is ViewGroup)
return
val childCount = view.childCount
for (i in 0 until childCount) {
setZeroPaddingToLayoutChildren(view.getChildAt(i))
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
view.setPaddingRelative(0, view.paddingTop, view.paddingEnd, view.paddingBottom)
else
view.setPadding(0, view.paddingTop, view.paddingRight, view.paddingBottom)
}
}
}
자바
public abstract class BasePreferenceFragmentCompat extends PreferenceFragmentCompat {
@Override
protected RecyclerView.Adapter onCreateAdapter(PreferenceScreen preferenceScreen) {
return new PreferenceGroupAdapter(preferenceScreen) {
@SuppressLint("RestrictedApi")
@Override
public void onBindViewHolder(PreferenceViewHolder holder, int position) {
super.onBindViewHolder(holder, position);
Preference preference = getItem(position);
if (preference instanceof PreferenceCategory)
setZeroPaddingToLayoutChildren(holder.itemView);
else {
View iconFrame = holder.itemView.findViewById(R.id.icon_frame);
if (iconFrame != null) {
iconFrame.setVisibility(preference.getIcon() == null ? View.GONE : View.VISIBLE);
}
}
}
};
}
private void setZeroPaddingToLayoutChildren(View view) {
if (!(view instanceof ViewGroup))
return;
ViewGroup viewGroup = (ViewGroup) view;
int childCount = viewGroup.getChildCount();
for (int i = 0; i < childCount; i++) {
setZeroPaddingToLayoutChildren(viewGroup.getChildAt(i));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
viewGroup.setPaddingRelative(0, viewGroup.getPaddingTop(), viewGroup.getPaddingEnd(), viewGroup.getPaddingBottom());
else
viewGroup.setPadding(0, viewGroup.getPaddingTop(), viewGroup.getPaddingRight(), viewGroup.getPaddingBottom());
}
}
}
그리고 결과 ( 이 Google 샘플 의 XML 샘플은 여기 에서 찾을 수 있습니다. 여기 에서 확인하기 위해 생성 했습니다.)
이 코드는 약간 위험하므로 라이브러리를 업데이트 할 때마다 제대로 작동하는지 확인하십시오.
또한 android:layout
기본 설정을 직접 정의 할 때와 같은 일부 특수한 경우에는 제대로 작동하지 않을 수 있으므로이 문제에 대해 수정해야합니다.
더 나은 공식 솔루션이 있습니다.
각 환경 설정에 대해 app:iconSpaceReserved="false"
. 이것은 잘 작동하지만 어떤 이유로 PreferenceCategory에서 작동하지 않는 (알려진) 버그가 있습니다. 그것은보고 여기에 , 그리고 가까운 장래에 고정되어야한다.
따라서 지금은 내가 작성한 해결 방법과이 플래그의 혼합 버전을 사용할 수 있습니다.
편집 : 또 다른 해결책을 찾았습니다. 이것은 모든 기본 설정 isIconSpaceReserved
을 무시하고 각각에 대해 설정 합니다. 안타깝게도 위에서 썼 듯이 PreferenceCategory를 사용하면 파괴되지만 사용하지 않으면 정상적으로 작동합니다.
Kotlin
abstract class BasePreferenceFragment : PreferenceFragmentCompat() {
override fun setPreferenceScreen(preferenceScreen: PreferenceScreen?) {
super.setPreferenceScreen(preferenceScreen)
if (preferenceScreen != null) {
val count = preferenceScreen.preferenceCount
for (i in 0 until count)
preferenceScreen.getPreference(i)!!.isIconSpaceReserved = false
}
}
자바
public class BasePreferenceFragment extends PreferenceFragmentCompat {
@Override
public void setPreferenceScreen(PreferenceScreen preferenceScreen) {
super.setPreferenceScreen(preferenceScreen);
if (preferenceScreen != null) {
int count = preferenceScreen.getPreferenceCount();
for (int i = 0; i < count; i++)
preferenceScreen.getPreference(i).setIconSpaceReserved(false);
}
}
}
편집 : Google이 마침내 라이브러리를 수정 한 후 ( 여기 링크 ) 각 환경 설정에 대한 플래그를 설정하거나 모두를 위해이 솔루션을 사용할 수 있습니다.
abstract class BasePreferenceFragment : PreferenceFragmentCompat() {
private fun setAllPreferencesToAvoidHavingExtraSpace(preference: Preference) {
preference.isIconSpaceReserved = false
if (preference is PreferenceGroup)
for (i in 0 until preference.preferenceCount)
setAllPreferencesToAvoidHavingExtraSpace(preference.getPreference(i))
}
override fun setPreferenceScreen(preferenceScreen: PreferenceScreen?) {
if (preferenceScreen != null)
setAllPreferencesToAvoidHavingExtraSpace(preferenceScreen)
super.setPreferenceScreen(preferenceScreen)
}
override fun onCreateAdapter(preferenceScreen: PreferenceScreen?): RecyclerView.Adapter<*> =
object : PreferenceGroupAdapter(preferenceScreen) {
@SuppressLint("RestrictedApi")
override fun onPreferenceHierarchyChange(preference: Preference?) {
if (preference != null)
setAllPreferencesToAvoidHavingExtraSpace(preference)
super.onPreferenceHierarchyChange(preference)
}
}
}
그것에서 확장하면 선호도에 쓸모없는 패딩이 없습니다. 여기에 샘플 프로젝트가 있습니다 . 여기서는 그러한 트릭 대신 공식적인 방법을 요청합니다. 주연을 고려하십시오.