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();
}