답변:
예, Preference및 부모 (a PreferenceCategory또는 or PreferenceScreen) 모두에 대한 참조가있는 경우
myPreferenceScreen.removePreference(myPreference);
setEnabled()
귀하의 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);
PreferenceCategory.
기본 설정이 기본 설정 화면의 직접적인 자식 인 경우 독립형 코드는 다음과 같습니다.
PreferenceScreen screen = getPreferenceScreen();
Preference pref = getPreferenceManager().findPreference("mypreference");
screen.removePreference(pref);
findPreference카테고리 를 위해, 카테고리에서 선호도를 제거해야합니다
예를 들어 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에 설명되어 있습니다.
추가 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();
}
}
v7 환경 설정을 사용하는 것이 좋으며 setVisible()방법이 있습니다. 그러나 아직 시도하지 않았습니다. 따라서 PreferenceFragment대신에 사용해야 합니다 PreferenceActivity.
환경 설정이 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;
}
Android API 26 getParent()메소드를 사용할 수 있으므로 https://developer.android.com/reference/android/preference/Preference.html#getParent ()
다음을 수행 할 수 있지만
preference.getParent().removePreference(preference);
두 가지 방법으로이 작업을 수행 할 수 있습니다.
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;
}
setVisibile() 에서 메소드를 사용할 수 있는 것처럼 읽습니다 . 불쾌하지 마십시오.
해당 마스크를 기준으로 평가하고 싶다면 대안이 될 수 있습니다.
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);