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


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에 설명되어 있습니다.

추가 PreferenceFragmentCompathttps://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.