Android : 기본 설정 화면에서 여백 / 패딩을 제거하는 방법


83

환경 설정 화면을 디자인하는 데 매우 이상한 문제가 있습니다. 레이아웃에 여백을주지 않지만 왼쪽에 약간의 공간이 남습니다.

아래 이미지에서 볼 수 있듯이 : 여기에 이미지 설명 입력

XML :

   <PreferenceScreen android:title="demo" >
       <CheckBoxPreference
           android:defaultValue="false"
            android:key="prefSync"`
            android:title="Auto Sync" />
    </PreferenceScreen>

화면에 체크 박스 기본 설정을 추가하는 데 문제가 있습니까?



Miral, 답장을 부탁드립니다. 하지만 환경 설정 화면에 대한 사용자 지정 레이아웃을 만들지 않습니다
Dory

레이아웃 파일을 보여줄 수 있습니까?
Robin Dijkhof 2013-08-29

<PreferenceScreen xmlns : android = " schemas.android.com/apk/res/android "> <CheckBoxPreference android : defaultValue = "false"android : key = "prefSync"android : title = "자동 동기화"/> </ PreferenceScreen> 여기에 코드가 있습니다
Dory

[이 답변] ( stackoverflow.com/a/41101859/1785516 )을보십시오. 귀하의 사례를 해결하는 데 도움이 될 수 있습니다.
KLM

답변:


153

androidx 용으로 업데이트 중입니다.

많은 실험을 거친 후 과도한 들여 쓰기가있는 각 기본 설정에 다음 추가하여이 문제를 해결했습니다 .

app:iconSpaceReserved="false"

물론 xml 맨 위에있는 PreferenceScreen 선언 자체에도 이것을 추가해야합니다.

xmlns:app="http://schemas.android.com/apk/res-auto"

사용자 지정 기본 설정에 대한 후속 조치

사용자 지정 기본 설정의 경우, 특히 오래된 장치에서이 솔루션이 항상 작동하는 것은 아니라는 것을 알았습니다. 예를 들어 다음과 같은 기본 설정은 여전히 ​​들여 쓰기 될 수 있습니다.

com.example.preference.SomeCustomPreference
    android:id="@+id/some_custom_preference"
    android:name="Custom Preference"
    android:key="@string/custom_pref_key"
    android:summary="@string/custom_pref_summary"
    android:title="@string/preference_custom_title"
    app:iconSpaceReserved="false"

이 문제는 사용자 지정 기본 설정 클래스에서 세 번째 생성자 매개 변수의 사용을 추적합니다. 세 번째 매개 변수를 전달하면 목록 항목이 들여 쓰기됩니다. 생략하면 목록이 올바르게 정렬됩니다.

class SomeCustomPreference
@JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyle: Int = android.R.attr.someCustomPreferenceStyle
) : DialogPreference(context, attrs, defStyle) {

    override fun getDialogLayoutResource(): Int {
        return R.layout.my_layout
    }
}

그 대신 다음을 사용하십시오.

class SomeCustomPreference
@JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null
) : DialogPreference(context, attrs) {

    override fun getDialogLayoutResource(): Int {
        return R.layout.my_layout
    }
}

이것에 대한 크레딧은이 아주 오래된 포스트의 @CommonsWare로 이동합니다 .


11
나는 당신이 누군지 모르지만 당신을 찾아서 감사합니다! :)
David

이것이 올바른 방법입니다. 사용자 정의 클래스가 필요하지 않습니다. Android는 기본적으로 아이콘 공간을 예약하고 있습니다.
Blogger

1
이것은 PreferenceFragmentCompat지원 lib 에서도 작동합니다 28.0.0. 큰!
jayeffkay

7
선호도 카테고리는 어떻습니까? 기본 설정 범주는 작동하지 않는 것
jknair

1
androidx.preference에서 환경 설정 카테고리 작업을 잘 : 설정 : 1.1.0
kalandar

53

여기 에서이 문제에 대해보고 했지만 (거기에서 내 해결 방법 프로젝트를 확인할 수도 있습니다), 지금은 약간 해킹이되었지만이를 극복 할 수있는 쉬운 방법을 찾았습니다.

  • 의 경우 PreferenceCategory레이아웃의 시작 / 왼쪽 패딩을 0으로 설정했습니다.

  • 다른 유형의 환경 설정의 icon_frame경우 아이콘이없는 경우 숨기기를 선택 합니다.

여기에 코드가 있습니다. 이 클래스에서 확장하면 나머지는 자동입니다.

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)
                }
            }
}

그것에서 확장하면 선호도에 쓸모없는 패딩이 없습니다. 여기에 샘플 프로젝트가 있습니다 . 여기서는 그러한 트릭 대신 공식적인 방법을 요청합니다. 주연을 고려하십시오.


이것이 작동하는 유일한 솔루션입니다. v7 및 androidx 라이브러리 모두. 잘하셨습니다!
리 오르 Iluz

2
나는 이것이 왜 문제인지 이해조차하지 못한다. 대체가 없거나 고장난 API가 없을 때 Google에서 API를 지원 중단 / 제거 / 차단하는 것은 무엇입니까?
TheWanderer

1
@androiddeveloper PreferenceCategories를 제외하고는 이해할 수 있습니다. 그것들은 정렬되어서는 안됩니다.
TheWanderer

@TheWanderer 글쎄, 나는 각자가 정말로 필요한 공간을 차지하고 어떤 경우에도 사용할 동작을 선택할 수 있다면 선호합니다.
안드로이드 개발자

PreferenceCategory 버그는 2018 년 11 월 5 일 AndroidX에서 수정되었습니다. 마이그레이션 후 테스트했으며 이제 예상대로 작동합니다. developer.android.com/jetpack/androidx/…를 참조하세요 . 마이그레이션을 원하지 않고 사용자 지정 레이아웃을 사용하는 경우 간격을 제거하기 위해 약 120의 음수 패딩을 사용하는 것이 좋습니다.
ET

32

여기 에서 간단한 작업 솔루션 .
모든 기본 설정에 쓸 필요없이 모든 기본 설정에서 작동합니다.app:iconSpaceReserved="false"

만들기 res/values-sw360dp/values-preference.xml:

<resources xmlns:tools="http://schemas.android.com/tools">
    <bool name="config_materialPreferenceIconSpaceReserved" tools:ignore="MissingDefaultResource,PrivateResource">false</bool>
    <dimen name="preference_category_padding_start" tools:ignore="MissingDefaultResource,PrivateResource">0dp</dimen>
</resources>

<bool>수정의 기본 값 iconSpacePreserved모든 Preference; 는 <dimen>PreferenceCategory를 해결.

편집 : 사용하는 경우 androidx.preference:preference:1.1.1치수가 필요하지 않습니다 preference_category_padding_start. Android 6-10에서 테스트되었습니다.


나에게도 효과적입니다. 대단히 감사합니다. 그러나 "values"대신 "values-sw360dp-v13"이라는 디렉토리에 있어야하는 이유를 이해할 수 없습니다. ( "값"에 넣어도 효과가 없습니다.) 누군가 이유를 압니까?
Gereon99

전체 화면을위한 완벽한 솔루션. 모든 것이 자동으로 수정되었지만 방법을 모르십니까?
Md Mohsin 19

7

이 시도:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = super.onCreateView(inflater, container, savedInstanceState);
    if(v != null) {
        ListView lv = (ListView) v.findViewById(android.R.id.list);
        lv.setPadding(10, 10, 10, 10);
    }
    return v;
}

다음을 사용하여 패딩을 설정할 수 있습니다. setPadding();


1
안녕하세요 @David, 답장을 주셔서 감사합니다. 하지만 환경 설정 화면에 대한 사용자 정의보기를 만들지 않습니다. 기본을 사용하고 있습니다.
Dory

나도 사용자 정의보기가 없다는 데 동의했습니다. 안드로이드 뷰에 이것을 설정하는 것이 좋을 것입니다.
lostintranslation

@lostintranslation 나는 그 목적을 위해 사용자 정의보기를 만드는 것이 논리적이지 않다는 데 동의하지만 테스트했으며 훌륭하게 작동합니다.
defhlt

슬프게도을 사용할 때 PreferenceFragmentCompat더 이상 이유가 아닙니다. 패딩 (또는 아이콘 프레임)은 이제 환경 설정보기의 일부입니다.
안드로이드 개발자

5

com.android.support:preference-v7라이브러리를 사용하는 경우 환경 설정을 호스팅하는 활동의 테마 preferenceTheme가 v14 Material 환경 설정 테마 오버레이 로 설정되어 있는지 확인하십시오 .

<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>


1
PreferenceFragmentCompat클래스 를 사용할 때 유사한 솔루션이 있습니까?
안드로이드 개발자

1
시도해 보지 않았습니다. 죄송합니다 ... PreferenceFragmentCompat지금도 사용 하고 있지만, 이후 설정 화면의 스타일을 변경했으며 아이콘이 포함되어있어이 패딩이 현재 나에게 바람직합니다 (왼쪽 정렬을 일관되게 유지하는 데 도움이 됨).
mtrewartha

@mtrewartha에게 감사합니다. 저는 각 설정 필드에 대해 약간의 적절한 머티리얼 아이콘을 선택하여이를 제거하는 방법을 찾는 대신이 왼쪽 간격을 사용할 수 있도록했습니다
gregdev

문제가 없습니다. @gregdev를 도울 수있어 기쁩니다!
mtrewartha

4

불행히도 위의 아무것도 나를 위해 일하지 않았습니다.

짧은 대답 :

사용자 지정 기본 설정 레이아웃의 맨 위 컨테이너에 음수 여백 을 사용하여이 문제를 해결했습니다 .

단계 :

  • 기본 설정에 대한 사용자 지정 레이아웃 만들기 (예 : preferences_category.xml)
  • XML의 환경 설정 태그에 android : layout param을 추가하여 환경 설정이 사용자 정의 레이아웃을 사용하도록 지정
  • 마이너스 여백 적용

자세한 답변 :

기본 설정 XML :

    <android.support.v7.preference.PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:title="@string/settings_title" >

    <android.support.v7.preference.PreferenceCategory
        android:layout="@layout/preference_category"
        android:key="settings_list"
        android:title="@string/pref_category_settings" />
    <android.support.v7.preference.SwitchPreferenceCompat
        android:layout="@layout/preference_row"
        android:icon="@drawable/ic_nav_switch"
        android:key="pref_switch"
        android:title="@string/pref_switch_title" />

    </android.support.v7.preference.PreferenceScreen>

불필요한 왼쪽 및 오른쪽 여백을 제거하는 기본 설정 행의 사용자 지정 레이아웃 :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginStart="-12dp"
    android:layout_marginEnd="-8dp"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:gravity="center_vertical">

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@android:id/icon"
            android:layout_width="58dp"
            android:layout_height="58dp"
            android:padding="8dp"
            android:layout_gravity="center"
            android:visibility="visible" />

    </RelativeLayout>

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="15dp"
        android:layout_marginEnd="6dp"
        android:layout_marginTop="6dp"
        android:layout_marginBottom="6dp"
        android:layout_weight="1">

        <TextView
            android:id="@android:id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:textAppearance="?android:attr/textAppearanceListItem"
            android:ellipsize="marquee"
            android:fadingEdge="horizontal" />

        <TextView
            android:id="@android:id/summary"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@android:id/title"
            android:layout_alignStart="@android:id/title"
            android:textAppearance="?android:attr/textAppearanceListItemSecondary"
            android:textColor="?android:attr/textColorSecondary"
            android:maxLines="2"/>

    </RelativeLayout>

    <LinearLayout
        android:id="@android:id/widget_frame"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="end|center_vertical"
        android:orientation="vertical">

    </LinearLayout>
</LinearLayout>

불필요한 왼쪽 및 오른쪽 여백을 제거하는 기본 설정 범주에 대한 사용자 지정 레이아웃 :

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColor="@color/colorAccent"
    android:textStyle="bold"
    android:textSize="12sp"
    android:gravity="center_vertical"
    android:textAllCaps="true"
    android:layout_marginStart="-4dp"
    android:layout_marginEnd="-8dp"
    android:id="@+android:id/title" />

좋아요, 당신은 내 생명을 구했습니다! : D
K. Kempski

이를 위해서는 모든 유형의 기본 설정에 대한 레이아웃이 있어야합니다. 어디에서 찾았습니까? 이것에 대한 도서관이 있습니까? 여기에 해킹 해결 방법을 만들었습니다. stackoverflow.com/a/51568782/878126 이지만 솔루션이 더 안전하다고 생각합니다. 복사 작업이 많이 필요합니다 ...
android developer

AOSP의 GitHub 미러에서 찾을 수 있습니다. preferences_ 접두사가있는 xml 파일을 확인하세요. github.com/aosp-mirror/platform_frameworks_base/tree/...
고드

3

패딩은 설정을 포함 하는 부모 ListView에 의해 발생 PreferenceScreen합니다. PreferenceFragment를 사용하여 환경 설정을 만드는 경우 의 onActivityCreated기능으로 이동 PreferenceFragement하여 다음을 수행하여 패딩을 제거하십시오.

public void onActivityCreated(Bundle savedInstanceState) {
  super.onActivityCreated(savedInstanceState);

  View lv = getView().findViewById(android.R.id.list);
  if (lv != null) lv.setPadding(0, 0, 0, 0);
}

를 사용할 때 PreferenceFragmentCompat더 이상 이유가 아닙니다. 패딩 (또는 아이콘 프레임)은 이제 환경 설정보기의 일부입니다.
안드로이드 개발자

3

이와 같이 환경 설정 테마를 변경하십시오. 최신 버전의 환경 설정 라이브러리를 사용해야합니다.androidx.preference 1.1.0-alpha01

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="preferenceTheme">@style/CustomPreferenceTheme</item>
</style>

<style name="CustomPreferenceTheme" parent="@style/PreferenceThemeOverlay">
    <item name="preferenceFragmentCompatStyle">@style/CustomPreferenceFragmentCompatStyle</item>
    <item name="preferenceCategoryStyle">@style/CustomPreferenceCategory</item>
    <item name="preferenceStyle">@style/CustomPreference</item>
    <item name="checkBoxPreferenceStyle">@style/CustomCheckBoxPreference</item>
    <item name="dialogPreferenceStyle">@style/CustomDialogPreference</item>
    <item name="switchPreferenceCompatStyle">@style/CustomSwitchPreferenceCompat</item>  <!-- for pre lollipop(v21) -->
    <item name="switchPreferenceStyle">@style/CustomSwitchPreference</item>
</style>

 <style name="CustomPreferenceFragmentCompatStyle" parent="@style/PreferenceFragment.Material">
    <item name="android:layout">@layout/fragment_settings</item>
</style>

<style name="CustomPreferenceCategory" parent="Preference.Category.Material">
    <item name="iconSpaceReserved">false</item>
</style>

<style name="CustomPreference" parent="Preference.Material">
    <item name="iconSpaceReserved">false</item>
</style>

<style name="CustomCheckBoxPreference" parent="Preference.CheckBoxPreference.Material">
    <item name="iconSpaceReserved">false</item>
</style>

<style name="CustomDialogPreference" parent="Preference.DialogPreference.Material">
    <item name="iconSpaceReserved">false</item>
</style>

<style name="CustomSwitchPreferenceCompat" parent="Preference.SwitchPreferenceCompat.Material">
    <item name="iconSpaceReserved">false</item>
</style>

<style name="CustomSwitchPreference" parent="Preference.SwitchPreference.Material">
    <item name="iconSpaceReserved">false</item>
</style>

2
안타깝게도 androidx.preference:preference:1.1.0-alpha01. 앱의 두 번째 조각 스택에서 장치를 회전하면 충돌이 발생합니다. 이후 버전에서 수정되기를 바랍니다. 로 돌아갑니다 androidx.preference:preference:1.0.0.
Joonsoo

2
@ 준수 : 확인할 수 있습니다. 모호한 "조각 저장 상태 실패"오류가 발생했습니다. 따라서 수정 될 때까지 버전 1.0.0을 유지 하고 그 동안 이 솔루션 을 따라 여백을 처리합니다.
Ganesh Mohan

iconSpaceReserved는 버전 26 이상에서만 사용할 수 있습니다.
realpranav

2

'com.android.support:preference-v7:24.2.1'컴파일

PreferenceFragmentCompat를 사용하면 다음과 같이 할 수 있습니다.

1. PreferenceGroupAdapter를 정의합니다.

    static class CustomAdapter extends PreferenceGroupAdapter {

    public CustomAdapter(PreferenceGroup preferenceGroup) {
      super(preferenceGroup);
    }

    @Override
    public PreferenceViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
      PreferenceViewHolder preferenceViewHolder = super.onCreateViewHolder(parent, viewType);
      parent.setPadding(0, 0, 0, 0);
      preferenceViewHolder.itemView.setPadding(20, 5, 20, 5);
      return preferenceViewHolder;
    }
  }

2. PreferenceFragmentCompat의 onCreateAdapter 메서드를 재정의합니다.

   @Override
   protected Adapter onCreateAdapter(PreferenceScreen preferenceScreen) {

      return new CustomAdapter(preferenceScreen);
   }

style.xml을 사용하면 다음과 같이 할 수 있습니다.

1. 값 /styles.xml :

  <style name="customPreferenceThemeOverlay" parent="@style/PreferenceThemeOverlay">
    <item name="preferenceFragmentListStyle">@style/customPreferenceFragmentList</item>
  </style>
  <style name="customPreferenceFragmentList">
    <item name="android:paddingLeft">0dp</item>
    <item name="android:paddingRight">0dp</item>
  </style>

2.values-v17 / styles.xml :

  <style name="customPreferenceFragmentList">
    <item name="android:paddingLeft">0dp</item>
    <item name="android:paddingRight">0dp</item>
    <item name="android:paddingStart">0dp</item>
    <item name="android:paddingEnd">0dp</item>
  </style>

3.value / styles.xml :

  <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    ... ...
    <item name="preferenceTheme">@style/customPreferenceThemeOverlay</item>
  </style>

모든 환경 설정에 적용됩니까? 이것에 대한 도서관이 있습니까?
안드로이드 개발자

1

위의 답변 중 어느 것도 작동하지 않았으므로 기본 설정 레이아웃 을 복사하고 custom_preference.xml과 같은 새 레이아웃 파일을 만들고 아이콘 프레임가시성을 GONE 으로 설정하여 레이아웃 콘텐츠를 재정의해야했습니다 . 그런 다음 pref.xml에서이 사용자 지정 레이아웃을 사용하도록 기본 설정의 레이아웃을 설정합니다.

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <android.support.v7.preference.EditTextPreference
        android:title="@string/pref_label"
        android:hint="@string/pref_hint"
        android:key="@string/pref_key"
        android:inputType="text"
        android:singleLine="true"
        android:layout="@layout/custom_preference_layout"
        />
</PreferenceScreen>

0

'패딩'은 다음에서 시작됩니다 PreferenceFrameLayout.java.

public PreferenceFrameLayout(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    TypedArray a = context.obtainStyledAttributes(attrs,
            com.android.internal.R.styleable.PreferenceFrameLayout, defStyle, 0);

    float density = context.getResources().getDisplayMetrics().density;
    int defaultBorderTop = (int) (density * DEFAULT_BORDER_TOP + 0.5f);
    int defaultBottomPadding = (int) (density * DEFAULT_BORDER_BOTTOM + 0.5f);
    int defaultLeftPadding = (int) (density * DEFAULT_BORDER_LEFT + 0.5f);
    int defaultRightPadding = (int) (density * DEFAULT_BORDER_RIGHT + 0.5f);

    mBorderTop = a.getDimensionPixelSize(
            com.android.internal.R.styleable.PreferenceFrameLayout_borderTop,
            defaultBorderTop);
    mBorderBottom = a.getDimensionPixelSize(
            com.android.internal.R.styleable.PreferenceFrameLayout_borderBottom,
            defaultBottomPadding);
    mBorderLeft = a.getDimensionPixelSize(
            com.android.internal.R.styleable.PreferenceFrameLayout_borderLeft,
            defaultLeftPadding);
    mBorderRight = a.getDimensionPixelSize(
            com.android.internal.R.styleable.PreferenceFrameLayout_borderRight,
            defaultRightPadding);

    a.recycle();
}

Android에서 정의한 스타일을 재정의하는 방법을 알고 있다면이 문제를 해결할 수 있습니다. 그러나 그것은 매우 간단하지 않습니다.


이것은 끔찍한 대답입니다. '여기에 코드가 있지만 어떻게해야할지 모르겠습니다.'는 대답이 아닙니다.
lostintranslation

답변이 아님에 동의하지만이 관련 정보를 어떻게 공유해야할지 잘 모르겠습니다. 질문에서 보이는 공간은 위에서 본 것처럼 프레임 워크에 의해 추가되며 분명히 제거 할 수있는 옵션이 없습니다. 예를 들어 "com.android.internal.R.styleable.PreferenceFrameLayout"을 재정의 할 수없는 경우입니다. 그리고 나는 방법을 모른다.
jayeffkay 2014 년

더 나은 답변을 제공해 주시겠습니까? Github에서 모든 환경 설정에 사용하는 방법을 보여줄 수 있습니까?
안드로이드 개발자

0

나는 사용해 본다

android:icon="@null"

CheckBoxPreference안드로이드 4.4이지만 왼쪽에서 패딩 수 없습니다. 나는 작은 투명 아이콘을 사용하고 추가

android:icon="@drawable/transparent_icon" 

그리고 그것은 나를 위해 일하는 것 같습니다. 도움이 되길 바랍니다. 감사.


"transparent_icon"에 무엇이 있습니까? 빈 드로어 블을 시도했지만 도움이되지 않았습니다 ...
android developer

0

대답하기에는 너무 늦었는지 모르겠지만 오늘은 같은 문제가 있었고이 대답 중 아무것도 도움이되지 않았습니다.

그래서이 솔루션을 사용했습니다.

내에서 DisclaimerPreferenceextends Preference필자는 ovveride onBindView(View view)이런 식으로 방법을 :

    @Override protected void onBindView(View view) {
        super.onBindView(view);
        if(view instanceof ViewGroup){
            ViewGroup vg = (ViewGroup)view;
            View currView;
            for(int i=0; i<vg.getChildCount(); i++){
               currView = vg.getChildAt(i);
               if (currView instanceof RelativeLayout)
                   currView.setVisibility(View.GONE);
            }
         }
    }

핵심은 RelativeLayout메인 뷰 내부를 GONE. 뭔가 잘못되면 알려주세요 :)


1
안타깝게도 onBindView새 버전에서는 더 이상 사용할 수 없습니다 PreferenceFragmentCompat. 대신 사용할 수 있습니다 onCreateAdapteronBindViewHolder: 내가 여기에 쓴, stackoverflow.com/a/51568782/878126
안드로이드 개발자를

0

분명히 android:layout="@null"xml에서 기본 설정을 추가 하면 트릭을 수행 할 수 있습니다. 그러나 결과적으로 제목 크기도 커집니다.


쉬운이를 사용하지만, 당신이 쓴, 그것은 :( ... 모든 환경 설정의 스타일 유적 어쩌면 내 해킹 - y를 해결보십시오. stackoverflow.com/a/51568782/878126
안드로이드 개발자


-1

꽤 오래 전에 질문했지만이 문제를 해결하는 데 도움이 된 것은 사용자 정의 파일이 필요없는 마이너스 여백이었습니다.

SettingsActivity 클래스 (PreferenceFragment가 내부에 있음)를 만들 때 레이아웃을 조각으로 설정하고 음수 여백을 추가하기 만하면됩니다.

settings_activity :

<?xml version="1.0" encoding="utf-8"?>
<fragment
    android:layout_marginLeft="-40dp"
    android:name="com.example.USER.APPNAME.SettingsActivity$PrefsFragment"
    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"
    tools:context="com.example.USER.APPNAME.SettingsActivity">
</fragment>

-5

추가 android:defaultValue="false"귀하에 <PreferenceScreen [...]태그 :

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:defaultValue="false">

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.