Как определить, когда внутренний PreferenceScreen был закрыт
У меня есть внутренний PreferenceScreen (назовите его Users
) внутри другого PreferenceScreen (назовите его Main
).
Когда я нажимаю Users
открывается новый экран, и я могу изменить свои настройки там (много флажков).
Я хочу обнаружить (запустить обратный вызов), когда этот экран закрывается и когда я снова на Main
PreferenceScreen.
Единственный способ, который я нашел, - это создать новый класс, наследующий PreferenceScreen и перегружающий onPrepareForRemoval
Мне было интересно, если есть более простой способ сделать это.
1 ответ
Очень интересный вопрос! Я наконец разобрался.
Хитрость заключается в том, чтобы установить DialogInterface.OnCancelListener
для PreferenceScreen
подменю (Users
в нашем случае) и вы можете сделать это в onPreferenceTreeClick
(как здесь внутренний Dialog
уже инициализирован). Так void onCancel(DialogInterface dialog)
это обратный звонок, который вы искали.
Вот xml\preferences.xml
:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="main">
<EditTextPreference android:title="Your Name"
android:key="username"
android:summary="Please provide your username"/>
<PreferenceScreen
android:key="users"
android:title="Users"
android:summary="Click here to select users">
<CheckBoxPreference
android:title="User 1"
android:defaultValue="false"
android:key="user1CheckBox" />
<CheckBoxPreference
android:title="User 2"
android:defaultValue="false"
android:key="user2CheckBox" />
<CheckBoxPreference
android:title="User 3"
android:defaultValue="false"
android:key="user3CheckBox" />
</PreferenceScreen>
</PreferenceScreen>
Вот PreferenceActivity
а также PreferenceFragment
Я использовал:
public class MyPreferencesActivity extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getFragmentManager().beginTransaction().replace(android.R.id.content, new MainPreferenceFragment()).commit();
}
public static class MainPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
if (preference instanceof PreferenceScreen) {
PreferenceScreen submenu = (PreferenceScreen)preference;
submenu.getDialog().setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
Log.d("MainPreferenceFragment", "Hi! Submenu is closing now!");
}
});
}
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
}
}
UPD: решение для PreferenceFragmentCompat
:
Во-первых, нам нужен еще один xml: xml\subpreference.xml
(копия подменю из основного preference.xml
):
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.preference.PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="users"
android:title="Users"
android:summary="Click here to select users">
<CheckBoxPreference
android:title="User 1"
android:defaultValue="false"
android:key="user1CheckBox" />
<CheckBoxPreference
android:title="User 2"
android:defaultValue="false"
android:key="user2CheckBox" />
<CheckBoxPreference
android:title="User 3"
android:defaultValue="false"
android:key="user3CheckBox" />
</android.support.v7.preference.PreferenceScreen>
Тогда наша хостинговая деятельность должна implements PreferenceFragmentCompat.OnPreferenceStartScreenCallback
, И последний шаг - нам нужен новый субфрагмент (или передать точный XML, который нужно раздувать в качестве параметра пакета):
public class MainActivity extends AppCompatActivity implements PreferenceFragmentCompat.OnPreferenceStartScreenCallback{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getSupportFragmentManager().beginTransaction().replace(R.id.container, new MainPreferenceFragment()).commit();
}
@Override
public boolean onPreferenceStartScreen(PreferenceFragmentCompat preferenceFragmentCompat,
PreferenceScreen preferenceScreen) {
getSupportFragmentManager().beginTransaction().replace(R.id.container, new SubPreferenceFragment()).commit();
return true;
}
@Override
public void onBackPressed() {
super.onBackPressed();
}
public static class MainPreferenceFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle bundle, String s) {
addPreferencesFromResource(R.xml.preferences);
}
}
public static class SubPreferenceFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle bundle, String s) {
addPreferencesFromResource(R.xml.sub_preferences);
}
}
}
В этом случае вы можете просто слушать нормально onBackPressed()
деятельности
Я надеюсь, что это помогает