화면에서 환경 설정 제거 / 숨기기


134

PreferenceActivity를 확장하는 활동이 있습니다. xml 파일에서 환경 설정을로드하고 있습니다. 그러나 경우에 따라 내 앱 상태에 따라 화면에서 환경 설정 중 하나를 완전히 숨겨야합니다. setEnabled 메소드가 있지만 정확히 내가 원하는 것은 아닙니다. 화면에서 해당 환경 설정을 완전히 제거하고 싶습니다. 가능합니까?

답변:


171

예, Preference및 부모 (a PreferenceCategory또는 or PreferenceScreen) 모두에 대한 참조가있는 경우

myPreferenceScreen.removePreference(myPreference);

큰! 감사! 작동 및 완벽한 의미
— Bostone

이것을 통해 내 자신의 질문에 대답했을 수도 있습니까? stackoverflow.com/a/4704360/956975
— marienke 2013

2
불행히도 환경 설정을 영구적으로 제거합니다. 숨기는 것이 가능합니까?
— Dmitry

그것은 또한 나를 위해 작동하지 않습니다. 선호도는 남아 있습니다!
— Dmitry

@Dmitry 당신은 그것을 회색으로 만들 수 있습니다setEnabled()
— JakeD

212

귀하의 Preference내에있는 경우 다음 PreferenceCategory을 수행해야합니다.

XML :

<PreferenceCategory
    android:key="category_foo"
    android:title="foo">

    <CheckBoxPreference
        android:key="checkPref" />

자바:

CheckBoxPreference mCheckBoxPref = (CheckBoxPreference) findPreference("checkPref");
PreferenceCategory mCategory = (PreferenceCategory) findPreference("category_foo");
mCategory.removePreference(mCheckBoxPref);

5
공정하게, 위의 답변은 부모가 필요하다고 말합니다 PreferenceCategory.
— matt

49

기본 설정이 기본 설정 화면의 직접적인 자식 인 경우 독립형 코드는 다음과 같습니다.

PreferenceScreen screen = getPreferenceScreen();
Preference pref = getPreferenceManager().findPreference("mypreference");
screen.removePreference(pref);

4
환경 설정이 범주 안에 있으면 작동하지 않습니다. 당신은 findPreference카테고리 를 위해, 카테고리에서 선호도를 제거해야합니다
— MBH

1
@MBH : 그 경고에 대해 언급 해 주셔서 감사합니다!
— 1 ''

9

예를 들어 SwitchPreference와 같이 환경 설정을 동적으로 변경하는 것을 원한다면 가장 좋은 방법은 모든 하위 옵션을 두 개의 범주 컨테이너에 넣는 것입니다. 처음에는 모든 것을 표시 한 다음 원하지 않는 비트 만 제거하면됩니다. 영리한 점은 무언가가 변경 될 때 다시 재생을 트리거 한 다음 수동으로 무언가를 만들거나 올바른 순서로 물건을 다시 넣을 염려가 없다는 것입니다.

protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  addPreferencesFromResource(R.xml.preferences);
  PreferenceCategory prefCatOne= (PreferenceCategory)findPreference("prefCatOne");
  PreferenceCategory prefCatTwo= (PreferenceCategory)findPreference("prefCatTwo");
  SwitchPreference mySwitchPref= (SwitchPreference)findPreference("mySwitchPref");
  PreferenceScreen screen = getPreferenceScreen();
  if (mySwitchPref.isChecked()) {
    screen.removePreference(prefCatOne);
  } else {
    screen.removePreference(prefCatTwo);
  }
}

public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
    if (key.equals("mySwitchPref")) {
        this.recreate();
    }
}

내가 볼 수있는 유일한 단점은 화면을 처음부터 다시 만들 때 플래시가 있다는 것입니다.


이 사례는 22 세 이상에서는 효과가 없습니다. 그러나 우선 순위 그룹으로 설정하더라도 선호 사항으로 변경하면 효과가 있습니다.
— Rob

Rob, API22 AVD에서 위의 코드를 테스트했으며 정상적으로 작동합니다. 선호하는 XML 컨텐츠가 코드와 일치하는지 확인하십시오. 위의 예에서 SwitchPreference는 어디에나있을 수 있지만 PreferenceCategorys가 PreferenceScreen의 직접적인 자식이되어야합니다.
— James

방금 범주를 기본 설정으로 사용하고 캐스트하지 않고 제거했습니다. 일했다.
— Rob

8

XML 파일에서 :

<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:key="preferenceScreen">

    <PreferenceCategory
        android:key="personalisation"
        android:title="your title here">

        <ThemedPreference
            android:key="animation" />

</PreferenceScreen>

귀하의 코드에서 :

PreferenceScreen pPreferenceScreen = (PreferenceScreen) findPreference("preferenceScreen");

PreferenceCategory pCategory = (PreferenceCategory) findPreference("personalisation");
ThemedPreference pThemePref = (ThemedPreference) findPreference("animation");

pPreferenceScreen.removePreference(pCategory); //remove category
pCategory.removePreference(pThemePref);   // remove preference

8

PreferenceFragmentCompat 를 사용하는 경우 xml에서 가시성을 설정할 수 있습니다.

xml의 ​​환경 설정이 AppCompat 버전으로 자동 변환됩니다. 그런 다음 XML에서 ' app : isPreferenceVisible '속성 을 사용할 수 있습니다

preferences.xml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <CheckBoxPreference
        android:defaultValue="false"
        android:key="show.navigation"
        android:title="Show navigation"
        app:isPreferenceVisible="false" />

...

이 속성은 https://developer.android.com/guide/topics/ui/settings/components-and-attributes에 설명되어 있습니다.

추가 PreferenceFragmentCompat는 https://developer.android.com/guide/topics/ui/settings/#inflate_the_hierarchy에 설명되어 있습니다.

예:

public class MySettingsActivity extends AppCompatActivity {

    public static class MySettingsFragment extends PreferenceFragmentCompat {
        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            setPreferencesFromResource(R.xml.preferences, rootKey);
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.settings_container, new MySettingsFragment())
                .commit();
    }
} 


3

XML 파일에서 제목 및 요약 태그를 비워두면 숨겨진 환경 설정을 만들 수 있습니다.

<EditTextPreference
    android:defaultValue="toddlerCam"
    android:key="save_photo_dir"
/>

이것은 나에게 완벽한 답변입니다. 나는 이것을 찾고 있었다. 감사합니다!
— 夏 期 劇場

2

환경 설정이 PreferenceCategory또는 아래에 있는지 여부에 관계없이 작동하는 일반적인 방법은 다음과 같습니다 PreferenceScreen.

private void removePreference(Preference preference) {
    PreferenceGroup parent = getParent(getPreferenceScreen(), preference);
    if (parent == null)
        throw new RuntimeException("Couldn't find preference");

    parent.removePreference(preference);
}

private PreferenceGroup getParent(PreferenceGroup groupToSearchIn, Preference preference) {
    for (int i = 0; i < groupToSearchIn.getPreferenceCount(); ++i) {
        Preference child = groupToSearchIn.getPreference(i);

        if (child == preference)
            return groupToSearchIn;

        if (child instanceof PreferenceGroup) {
            PreferenceGroup childGroup = (PreferenceGroup)child;
            PreferenceGroup result = getParent(childGroup, preference);
            if (result != null)
                return result;
        }
    }

    return null;
}


0

두 가지 방법으로이 작업을 수행 할 수 있습니다.

1. 지원 라이브러리를 사용하는 경우 기본 설정 트리 및 해당 상위의 맵을 작성한 다음 상위를 사용하여 기본 설정을 제거 할 수 있습니다. 이러한 맵을 생성하는 함수는 다음과 같습니다.

public static Map<Preference, PreferenceGroup> buildPreferenceParentTree(@NonNull final PreferenceScreen preferenceScreen) {
    final Map<Preference, PreferenceGroup> result = new HashMap<>();
    final Stack<PreferenceGroup> curParents = new Stack<>();
    curParents.add(preferenceScreen);
    while (!curParents.isEmpty()) {
        final PreferenceGroup parent = curParents.pop();
        final int childCount = parent.getPreferenceCount();
        for (int i = 0; i < childCount; ++i) {
            final Preference child = parent.getPreference(i);
            result.put(child, parent);
            if (child instanceof PreferenceGroup)
                curParents.push((PreferenceGroup) child);
        }
    }
    return result;
}
  1. 새로운 android-x preference API를 사용하는 경우 setVisible 함수를 사용하여 가시성을 설정할 수 있습니다 .

에 따르면 문서 와 차의 대답은 setVisible() 지원 라이브러리의 버전 24.1.0 이후 사용할 수 있습니다.
— JJD

내가 쓴 것을 보셨습니까? 나는 구체적으로 지금 가능하다는 것을 썼습니다 ... 또한, 첫 번째 솔루션은 제거에 도움이됩니다. 숨기기와는 조금 다릅니다 ..
— android developer

예, 당신의 대답을 읽었습니다. 나는 당신의 두 번째 요점을 언급하고있었습니다. 내가 설명하려고 시도한 android-xsetVisibile() 에서 메소드를 사용할 수 있는 것처럼 읽습니다 . 불쾌하지 마십시오.
— JJD

Android-X는 모든 지원 라이브러리를 대체하는 것입니다. 우리가 알고있는 새로운 버전의 지원 라이브러리는 없습니다.
— 안드로이드 개발자

옳은. 나는 이것을 알고있다 . 여전히 이전 버전을 고수 한 사람들은이 방법을 사용할 수 있습니다.
— JJD

0

해당 마스크를 기준으로 평가하고 싶다면 대안이 될 수 있습니다.

SwitchPreference autenticacionUsuario = 
    (SwitchPreference) findPreference("key_autenticacion_usuario");

final EditTextPreference Username = 
    (EditTextPreference) findPreference("key_username_mqtt");
final EditTextPreference Password = 
    (EditTextPreference) findPreference("key_password_mqtt");

if (!autenticacionUsuario.isChecked()) {
    PreferenceCategory preferenceCategory = 
        (PreferenceCategory) findPreference("category_mqtt");
    preferenceCategory.removePreference(Username);
    preferenceCategory.removePreference(Password);
}

이 모든 것이 안에 있어야합니다

public static class PrefsFragment extends PreferenceFragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

1
죄송하지만이 사이트는 영어 사이트입니다. 영어로 대답 할 수 있습니까?
— Dave Schweisguth

물론 저의 의도는 영어를 못하는 사람들에게도 제공하는 것이 었습니다
— Gustavo Eduardo Belduma

3
@GustavoEduardoBelduma 다음이 읽어 들일 필요가 있습니다 meta.stackoverflow.com/a/297680/545026을
— 레오 모니카 Cellio에게 지원

0

내가 생각하는 일을하고 있다면 (지금 시도하고 있기 때문에) 환경 설정을 활성화 / 비활성화하는 것이 좋습니다. 제거하면 기본 설정 화면에서 제거되고 프로그래밍 방식으로 화면을 만든 경우 원하는 위치에 다시 추가하지 못할 수 있습니다.

pref.setEnabled (false); pref.setEnabled (true);

더 이상 사용되지 않을 수 있습니다. 그것은 내가 지금 겪고있는 유스 케이스에서 작동합니다.

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