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