如何检测内部PreferenceScreen何时closures

我有一个内部PreferenceScreen(称为Users )在另一个PreferenceScreen(称为Main )。
当我点击Users一个新的屏幕打开,我可以改变我的选项(很多CheckBoxes)。
我想检测(触发callback)当这个屏幕被解散,当我回到Main PreferenceScreen。
我发现的唯一方法是创build一个inheritancePreferenceScreen并重载onPrepareForRemoval的新类

我想知道是否有一个更简单的方法来做到这一点。

Solutions Collecting From Web of "如何检测内部PreferenceScreen何时closures"

非常有趣的问题! 我终于想通了。

诀窍是为PreferenceScreen子菜单( Users ,在我们的例子中)设置DialogInterface.OnCancelListener ,你可以在onPreferenceTreeClick (因为这里的内部Dialog已经初始化)。 所以void onCancel(DialogInterface dialog)是你一直在寻找的callback。

这里是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> 

这里是我使用的PreferenceActivityPreferenceFragment

 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解决scheme:

首先,我们还需要一个xml: xml\subpreference.xml (主preference.xml xml\subpreference.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> 

然后,我们的托pipe活动应该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); } } } 

在这种情况下,你可以只听正常的Activity的onBackPressed()

我希望,这有帮助