Как определить, когда внутренний 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() деятельности

Я надеюсь, что это помогает

Другие вопросы по тегам