setOnClickListener не работает для PreferenceFragment

Что у меня есть CheckBoxPreference и EditTextPreference в меню настроек Android. Что я хочу сделать, это снять флажок CheckBox когда EditTextPreference нажата. Все работает нормально, если я не пытаюсь добавить слушателя. Похоже, проблема начинается с нулевого "custFragment". Приложение просто вылетает. Вот код:

XML

<?xml version="1.0" encoding="utf-8"?>

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <PreferenceCategory
        android:title="@string/pref_search_method"
        android:key="prefSearchMethodSettings"
        android:layout="@layout/preferences_header_category">

        <CheckBoxPreference
            android:title="@string/use_menu"
            android:key="SHOWMENU"
            android:defaultValue="1">
        </CheckBoxPreference>

        <EditTextPreference
            android:title="@string/use_keyword"
            android:key="KEYWORD"
            android:summary="@string/use_keyword_summary"
            android:defaultValue="@string/settings_keyword_default">
        </EditTextPreference>

    </PreferenceCategory>

</PreferenceScreen>

Джава

package com.triunedev.foodeze;

import android.app.Activity;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.Preference;
import android.util.Log;

public class SettingsActivity extends Activity {

    SettingsFragment custFragment;
    EditTextPreference textPref;
    CheckBoxPreference checkPref;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Display the fragment as the main content.
        getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment(), "fragTag").commit();

        custFragment = (SettingsFragment) getFragmentManager().findFragmentByTag("fragTag");
        textPref = (EditTextPreference) custFragment.findPreference("KEYWORD");
        checkPref = (CheckBoxPreference) custFragment.findPreference("SHOWMENU");

        textPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            public boolean onPreferenceClick(Preference preference) {
                checkPref.setChecked(false);
                return false;
            }
        });
    }

}

а также...

package com.triunedev.foodeze;

import android.os.Bundle;
import android.preference.PreferenceFragment;

public class SettingsFragment extends PreferenceFragment {

    public SettingsFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.preferences);
    }

}

Пожалуйста, где я иду не так? Спасибо!

1 ответ

Решение

Ваш custFragment нулевой.

вам нужно добавить fragment к backstack также во время транзакции.

Замените свой код на:

FragmentManager fm = getFragmentManager();
Fragment fragment = new SettingsFragment();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(android.R.id.content, fragment, "fragTag");
ft.addToBackStack("fragTag");
ft.commit();
fm.executePendingTransactions();

Теперь повторно используйте фрагмент, используя:

custFragment = (SettingsFragment) getFragmentManager().findFragmentByTag("fragTag");

РЕДАКТИРОВАТЬ

Чтобы решить проблему с помощью кнопки "Назад": переопределить onBackPressed() в вашем SettingsActivity и добавьте следующий код:

 @Override
public void onBackPressed() {
    if (getFragmentManager.getBackStackEntryCount() > 0)
       getFragmentManager.popBackStackImmediate();
    else super.onBackPressed();
}
Другие вопросы по тегам