getActivity() 在 PreferenceFragment 中返回 null

发布于 2024-12-27 17:02:52 字数 2323 浏览 3 评论 0原文

在我的应用程序中,我使用 PreferenceFragment 在平板电脑和智能手机上创建了一个不错的应用程序。

因此,在我的主要活动中,我使用:

@Override
public void onBuildHeaders(List<Header> target) {
    loadHeadersFromResource(R.xml.preference_headers, target);
}

我的 xml 文件如下所示:

<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
    <header android:fragment="tof.cv.mpp.view.StockPreferenceFragment"
        android:title="@string/btn_home_settings" android:summary="">
        <extra android:name="resource" android:value="activity_preferences" />
    </header>
    <header android:fragment="tof.cv.mpp.view.StockPreferenceFragment"
        android:title="@string/btn_home_planner" android:summary="">
        <extra android:name="resource" android:value="activity_planner_preferences" />
    </header>
    <header android:fragment="tof.cv.mpp.view.StockPreferenceFragment"
        android:title="@string/btn_home_twitter" android:summary="">
        <extra android:name="resource" android:value="activity_twitter_preferences" />
    </header>
</preference-headers>

现在的问题是我想使用 OnSharedPreferenceChangeListener 来更新我的一些首选项的摘要。

我使用:

@Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
            String key) {
        Log.i("", "PREFChanged "+getActivity());
        if (key.contentEquals("prefPseudo")) {
            Log.i("", "PseudoChanged");
            Preference pref = findPreference("prefPseudo");
            pref.setSummary(((EditTextPreference) pref).getText());
        }
        if (key.contentEquals(getString(R.string.key_activity))) {
            Log.i("", "FirstChanged");
            Preference pref = findPreference(getString(R.string.key_activity));
            pref.setSummary(((ListPreference) pref).getEntry());
        }
        if (key.contentEquals(getString(R.string.key_planner_da))) {
            Preference pref = findPreference(getString(R.string.key_planner_da));
            Log.i("", "PlannerChanged"+pref);
            pref.setSummary(((ListPreference) pref).getEntry());
        }

    }

我面临的大问题是,当我的 xml 标头中有多个类别时,getActivity() 为 null! 我打开的第一个总是正确且非空,但是当我按返回时,我回到自动生成的首选项列表,我单击第二个,然后活动为空!

In my application, I used PreferenceFragment to create a nice application on Tablets and smartphones.

So, in my main activity, I use:

@Override
public void onBuildHeaders(List<Header> target) {
    loadHeadersFromResource(R.xml.preference_headers, target);
}

My xml file looks like this:

<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
    <header android:fragment="tof.cv.mpp.view.StockPreferenceFragment"
        android:title="@string/btn_home_settings" android:summary="">
        <extra android:name="resource" android:value="activity_preferences" />
    </header>
    <header android:fragment="tof.cv.mpp.view.StockPreferenceFragment"
        android:title="@string/btn_home_planner" android:summary="">
        <extra android:name="resource" android:value="activity_planner_preferences" />
    </header>
    <header android:fragment="tof.cv.mpp.view.StockPreferenceFragment"
        android:title="@string/btn_home_twitter" android:summary="">
        <extra android:name="resource" android:value="activity_twitter_preferences" />
    </header>
</preference-headers>

The problem is now shen I want to use a OnSharedPreferenceChangeListener in order to update the summary of some of my preferences.

I use:

@Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
            String key) {
        Log.i("", "PREFChanged "+getActivity());
        if (key.contentEquals("prefPseudo")) {
            Log.i("", "PseudoChanged");
            Preference pref = findPreference("prefPseudo");
            pref.setSummary(((EditTextPreference) pref).getText());
        }
        if (key.contentEquals(getString(R.string.key_activity))) {
            Log.i("", "FirstChanged");
            Preference pref = findPreference(getString(R.string.key_activity));
            pref.setSummary(((ListPreference) pref).getEntry());
        }
        if (key.contentEquals(getString(R.string.key_planner_da))) {
            Preference pref = findPreference(getString(R.string.key_planner_da));
            Log.i("", "PlannerChanged"+pref);
            pref.setSummary(((ListPreference) pref).getEntry());
        }

    }

The big problem I am facing is that getActivity() is null when I have multiple categories in my xml header!
The first one I open is always correct and non null, but when I press back, I come back to the Preference list automatically generated, I click on a second one and there, activity is null!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

可是我不能没有你 2025-01-03 17:02:52

哎哟!那是一件很难的事情。
我成功解决了这个问题。

事实上,Listener 始终属于第一个 Fragment。
因此,当您更改其他类别的首选项时,当您更改第二个片段的首选项时,将调用第一个片段的侦听器!

所以该活动为空。

解决方案是在留下 Fragment 时删除侦听器,以便正确的侦听器可以完成他的工作:

@Override
public void onPause() {
    super.onPause();
    Log.i("", "PAUSE");
    preferences.unregisterOnSharedPreferenceChangeListener(this);
}

OUCH! That was an hard one.
I succeed to fix that.

In fact, the Listener was always belonging to the first Fragment.
So when you change the Preference from an other category, the listener of the first Fragment is called when you change a Preference of the second Fragment!

So the Activity is null.

The solution is to remove the listener when you leave a Fragment, so the correct Listener can do his job:

@Override
public void onPause() {
    super.onPause();
    Log.i("", "PAUSE");
    preferences.unregisterOnSharedPreferenceChangeListener(this);
}
海未深 2025-01-03 17:02:52

如果您的侦听器位于 Fragment MyFragment 中,请使用以下代码获取活动实例。我们需要使用.this.getActivity()

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
        String key) {
    Log.i("", "PREFChanged "+ MyFragment.this.getActivity());
    .....
}

If your Listener is in a Fragment MyFragment use the following code to get the activity instance. We need to use .this.getActivity()

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
        String key) {
    Log.i("", "PREFChanged "+ MyFragment.this.getActivity());
    .....
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文