답변:
예, 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);