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
            }
        }
  }