我在另一个PreferenceScreen中有一个内部PreferenceScreen(称之为Users
)(称之为Main
)。
当我点击Users
时,会打开一个新屏幕,我可以在那里更改我的首选项(很多CheckBoxes)
当我关闭此屏幕并回到Main
PreferenceScreen时,我想检测(触发回调)。
我找到的唯一方法是创建一个继承PreferenceScreen并重载onPrepareForRemoval
我想知道是否有更简单的方法可以做到这一点。
答案 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
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);
}
}
}
活动
我希望,这有帮助