Java 单击首选项时如何启动片段
我想在单击首选项时开始一个片段。请参阅下文:Java 单击首选项时如何启动片段,java,android,Java,Android,我想在单击首选项时开始一个片段。请参阅下文: <PreferenceSreen android:key="zd_pref" android:summary="@string/zd_summary_no" android:title="@string/zd_platform" > <intent android:action="com.example.prefs.PREFS_ONE"
<PreferenceSreen
android:key="zd_pref"
android:summary="@string/zd_summary_no"
android:title="@string/zd_platform" >
<intent
android:action="com.example.prefs.PREFS_ONE"
android:targetClass="com.android.settings.bussiness.AuthCertifyConfirm"
android:targetPackage="com.example.settings" />
</PreferenceSreen>
<PreferenceSreen
android:key="hw_pref"
android:summary="@string/hw_summary"
android:title="@string/hw_platform" >
<intent
android:action="com.example.prefs.PREFS_ONE"
android:targetClass="com.android.settings.bussiness.AuthCertifyConfirm"
android:targetPackage="com.example.settings" />
</PreferenceSreen>
但是,当单击首选项时,此方法会导致错误。错误:
E/AndroidRuntime(28027): FATAL EXCEPTION: main
E/AndroidRuntime(28027): android.view.InflateException: Binary XML file line #21: Error inflating class PreferenceSreen
E/AndroidRuntime(28027): at android.preference.GenericInflater.createItemFromTag(GenericInflater.java:441)
E/AndroidRuntime(28027): at android.preference.GenericInflater.rInflate(GenericInflater.java:481)
E/AndroidRuntime(28027): at android.preference.GenericInflater.inflate(GenericInflater.java:326)
E/AndroidRuntime(28027): at android.preference.GenericInflater.inflate(GenericInflater.java:263)
E/AndroidRuntime(28027): at android.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:269)
E/AndroidRuntime(28027): at android.preference.PreferenceFragment.addPreferencesFromResource(PreferenceFragment.java:285)
E/AndroidRuntime(28027): at com.android.settings.bussiness.BussinessSettings.onCreate(BussinessSettings.java:78)
E/AndroidRuntime(28027): at android.app.Fragment.performCreate(Fragment.java:1673)
E/AndroidRuntime(28027): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:854)
E/AndroidRuntime(28027): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)
E/AndroidRuntime(28027): at android.app.BackStackRecord.run(BackStackRecord.java:682)
E/AndroidRuntime(28027): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)
E/AndroidRuntime(28027): at android.app.FragmentManagerImpl$1.run(FragmentManager.java:441)
E/AndroidRuntime(28027): at android.os.Handler.handleCallback(Handler.java:725)
E/AndroidRuntime(28027): at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(28027): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(28027): at android.app.ActivityThread.main(ActivityThread.java:5041)
E/AndroidRuntime(28027): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(28027): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(28027): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
E/AndroidRuntime(28027): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
E/AndroidRuntime(28027): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(28027): Caused by: java.lang.ClassNotFoundException: Didn't find class "android.preference.PreferenceSreen" on path: /data/app/com.android.settings-1.apk
为什么此方法无法启动片段?意图用于启动活动、服务、内容提供商和广播接收器。因此,如果您要添加的片段与首选项片段位于同一活动中,那么它就不是理想的意图用例。也许你可以尝试一下:
public class MyPreferenceFragment extends PreferenceFragmentCompat{
OpenFragmentListener openFragmentListener;
public interface OpenFragmentListener{
void openFragment();
}
@Override
public void onAttach(Activity activity){
super.onAttach(activity);
openFragmentListener = (OpenFragmentListener)activity;
}
@Override
public void onCreatePreferences(Bundle bundle, String s) {
getPreferenceManager().setSharedPreferencesName(Constants.PREFERENCES);
addPreferencesFromResource(R.xml.preferences);
preference = this.findPreference("key");
preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener(){
@Override
public boolean onPreferenceClick(Preference preference){
openFragmentListener.openFragment();
return true;
}
});
}
}
然后在“活动”中实现MyPreferenceFragment.OpenFragmentListener并重写该方法,如下所示:
@Override
public void openFragment(){
getSupportFragmentManager()
.beginTransaction()
.remove(myPreferenceFragment)
.add(R.id.placeHolderForTheFragmentYouWant, theFragmentYouWant)
.addToBackStack("setting")
.commit();
}
如果您是在2021年来到这里的,那么您很可能正在使用Kotlin和导航组件 因此,您可以执行以下操作: 在settings.xml中:
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<Preference
app:key="@string/fragment_settings_key"
app:title="Go to Fragment!"/>
</PreferenceScreen>
请参阅[此][1]可能对您的代码有所帮助。。。。。[1] :正在哪里定义R.id.MyFragment?@Slion R.id.MyFragment是目标的id,它在导航图中定义。在下面的链接中,您可以看到更多信息:谢谢,原来我使用的是一个不使用导航组件的旧代码库。而且迁移似乎不是一件小事。
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<Preference
app:key="@string/fragment_settings_key"
app:title="Go to Fragment!"/>
</PreferenceScreen>
class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.settings, rootKey)
val preferenceFragment: Preference? = findPreference(getString(R.string.fragment_settings_key))
preferenceFragment?.onPreferenceClickListener = Preference.OnPreferenceClickListener {
view?.findNavController()?.navigate(R.id.MyFragment)
true
}
}
}