如何检测内部PreferenceScreen何时关闭

时间:2014-01-06 15:25:11

标签: android preferences preferenceactivity preferencefragment

我在另一个PreferenceScreen中有一个内部PreferenceScreen(称之为Users)(称之为Main)。
当我点击Users时,会打开一个新屏幕,我可以在那里更改我的首选项(很多CheckBoxes) 当我关闭此屏幕并回到Main PreferenceScreen时,我想检测(触发回调)。
我找到的唯一方法是创建一个继承PreferenceScreen并重载onPrepareForRemoval

的新类

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

1 个答案:

答案 0 :(得分:6)

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

诀窍是为DialogInterface.OnCancelListener子菜单设置PreferenceScreen(在我们的例子中为Users),你可以在onPreferenceTreeClick中进行设置(如此内部{{1}已初始化)。所以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

UPD: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); } } }

的解决方案

首先,我们还需要一个xml:PreferenceFragmentCompat(来自主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> 。最后一步 - 我们需要一个新的子片段(或传递确切的XML,你需要作为一个包的参数进行膨胀):

implements PreferenceFragmentCompat.OnPreferenceStartScreenCallback

在这种情况下,您可以只听正常的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); } } } 活动

我希望,这有帮助