如何检测内部PreferenceScreen何时关闭

 陈可不能哭 发布于 2023-02-06 11:45

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

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

1 个回答
  • 非常有趣的问题!我终于想通了.

    关键是要设置DialogInterface.OnCancelListenerPreferenceScreen 子菜单(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>
    

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

    首先,我们还需要一个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

    我希望,这有帮助

    2023-02-06 11:48 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有