9

Users在另一个 PreferenceScreen(调用它)中有一个内部 PreferenceScreen(调用它Main)。
当我点击Users一个新屏幕时,我可以在那里更改我的首选项(很多复选框)。
我想检测(触发回调)何时关闭此屏幕以及何时返回MainPreferenceScreen。
我发现的唯一方法是创建一个继承 PreferenceScreen 并重载的新类onPrepareForRemoval

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

4

1 回答 1

7

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

诀窍是设置DialogInterface.OnCancelListenerPreferenceScreen 菜单(Users在我们的例子中是 ),您可以在其中进行设置onPreferenceTreeClick(因为这里 internalDialog已经初始化)。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);
        }
    }
}

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 作为包的参数):

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

我希望,它有帮助

于 2015-12-22T21:43:54.007 回答