gpt4 book ai didi

android - 如何检测内部 PreferenceScreen 何时关闭

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:37:14 24 4
gpt4 key购买 nike

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

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

最佳答案

很有意思的问题!我终于明白了。

诀窍是为 PreferenceScreen 子菜单(Users,在我们的例子中)设置 DialogInterface.OnCancelListener,您可以在 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(主 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>

然后,我们的托管 Activity 应该实现 PreferenceFragmentCompat.OnPreferenceStartScreenCallback。最后一步 - 我们需要一个新的子 fragment (或传递您需要作为 bundle 参数扩展的确切 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);
}
}
}

在这种情况下,您可以只听取 Activity 的普通 onBackPressed()

希望对你有帮助

关于android - 如何检测内部 PreferenceScreen 何时关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20953214/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com