I have problem with PreferenceFregment. Am I missing something ? Before I had only preference files worked fine. Then I include headers. Seems like I miss something somewhere.
FATAL EXCEPTION: main Process: com.example.tallycounter.tallycounter, PID: 25931 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.tallycounter.tallycounter/com.example.tallycounter.tallycounter.SettingsActivity}: java.lang.RuntimeException: Subclasses of PreferenceActivity must override isValidFragment(String) to verify that the Fragment class is valid! com.example.tallycounter.tallycounter.SettingsActivity has not checked if fragment com.example.tallycounter.tallycounter.SettingsActivity$SettingsFragment is valid. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) Caused by: java.lang.RuntimeException: Subclasses of PreferenceActivity must override isValidFragment(String) to verify that the Fragment class is valid! com.example.tallycounter.tallycounter.SettingsActivity has not checked if fragment com.example.tallycounter.tallycounter.SettingsActivity$SettingsFragment is valid. at android.preference.PreferenceActivity.isValidFragment(PreferenceActivity.java:940) at android.preference.PreferenceActivity.switchToHeaderInner(PreferenceActivity.java:1222) at android.preference.PreferenceActivity.switchToHeader(PreferenceActivity.java:1249) at android.preference.PreferenceActivity.onCreate(PreferenceActivity.java:586) at android.app.Activity.performCreate(Activity.java:6662) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.int ernal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 02-01 09:31:49.509 1506-1991/system_process W/ActivityManager: Force finishing activity com.example.tallycounter.tallycounter/.SettingsActivity 02-01 09:31:49.514 1506-1991/system_process W/ActivityManager: Force finishing activity com.example.tallycounter.tallycounter/.SettingsActivity
My class :
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
import java.util.List;
public class SettingsActivity extends PreferenceActivity {
/*@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
}*/
@Override
public void onBuildHeaders(List<Header> target) {
loadHeadersFromResource(R.xml.pref_headers, target);
}
public class SettingsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// addPreferencesFromResource(R.xml.preferences);
String settings = getArguments().getString("settings");
if ("pref".equals(settings)) {
addPreferencesFromResource(R.xml.preferences);
}
}
}
}
Xml preferenceHeaders
<?xml version="1.0" encoding="utf-8"?>
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
<header
android:fragment="com.example.xxx.xxx.SettingsActivity$SettingsFragment"
android:icon="@mipmap/ic_launcher"
android:title="General">
<extra
android:name="settings"
android:value="pref">
</extra>
</header>
</preference-headers>
Okey Well I find where the problem was. Gona post it in case anyone else will have same problem. I maked preference fragment subclass to preference activity. And isValidFregment didn't work. Hope it will help to someone!
My preference fragment class (SettingsFragment.class) :
public class SettingsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String settings = getArguments().getString("settings");
if ("xxx".equals(settings)) {
addPreferencesFromResource(R.xml.pref_xxx);
} else if ("yyy".equals(settings)) {
addPreferencesFromResource(R.xml.pref_yyy);
}
}
}
My preference activity class (SettingsActivity.class) :
public class SettingsActivity extends PreferenceActivity {
@Override
public void onBuildHeaders(List<Header> target) {
loadHeadersFromResource(R.xml.pref_headers, target);
}
@Override
protected boolean isValidFragment(String fragmentName) {
return SettingsFragment.class.getName().equals(fragmentName);
}
}
And my XML preference headers :
<?xml version="1.0" encoding="utf-8"?>
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
<header
android:fragment="com.example.xxx.xxx.SettingsFragment"
android:icon="@drawable/ic_pref_milestone"
android:title="Xxx">
<extra
android:name="settings"
android:value="xxx">
</extra>
</header>
<header
android:fragment="com.example.xxx.xxx.SettingsFragment"
android:icon="@drawable/ic_pref"
android:title="Yyy">
<extra
android:name="settings"
android:value="yyy">
</extra>
</header>
</preference-headers>
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.