화면에서 환경 설정 제거 / 숨기기 환경 설정 중 하나를 완전히 숨겨야합니다. setEnabled

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



답변

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

myPreferenceScreen.removePreference(myPreference);


답변

귀하의 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);


답변

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

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


답변

예를 들어 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();
    }
}

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


답변

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


답변

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


답변

v7 환경 설정을 사용하는 것이 좋으며 setVisible()방법이 있습니다. 그러나 아직 시도하지 않았습니다. 따라서 PreferenceFragment대신에 사용해야 합니다 PreferenceActivity.