我Users
在另一个PreferenceScreen(调用它Main
)内部有一个内部PreferenceScreen (调用它).
当我点击Users
一个新屏幕打开,我可以在那里更改我的首选项(很多CheckBoxes).
当我关闭此屏幕并回到Main
PreferenceScreen 时,我想检测(触发回调).
我找到的唯一方法是创建一个继承PreferenceScreen和重载的新类onPrepareForRemoval
我想知道是否有更简单的方法可以做到这一点.
非常有趣的问题!我终于想通了.
关键是要设置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); } } }
PreferenceFragmentCompat
:首先,我们还需要一个xml :( xml\subpreference.xml
来自main的子菜单的副本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,你需要作为一个bundle的参数膨胀):
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()
的Activity
我希望,这有帮助