#java #android #android-layout #preferences
Вопрос:
Я видел несколько других подобных ссылок на эту проблему, однако еще не нашел решения своей проблемы.
Раньше я пользовался android.предпочтения.Предпочтение, однако, недавно перешло на androidx, чтобы использовать функцию поиска.
Теперь, когда я пытаюсь раздуть экран настроек, я получаю следующую ошибку:
2021-11-17 20:57:20.623 18270-18270/? E/AndroidRuntime: FATAL EXCEPTION: main Process: com.project.test, PID: 18270 android.view.InflateException: Binary XML file line #1: Error inflating class (not found)android.support.v7.preference.PreferenceScreen at androidx.preference.PreferenceInflater.createItemFromTag(PreferenceInflater.java:287) at androidx.preference.PreferenceInflater.inflate(PreferenceInflater.java:151) at androidx.preference.PreferenceInflater.inflate(PreferenceInflater.java:109) at androidx.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:216) at androidx.preference.PreferenceFragmentCompat.setPreferencesFromResource(PreferenceFragmentCompat.java:377) at com.project.test.SettingsFragment.onCreatePreferences(SettingsFragment.java:33) at androidx.preference.PreferenceFragmentCompat.onCreate(PreferenceFragmentCompat.java:160) at com.project.test.SettingsFragment.onCreate(SettingsFragment.java:25) at androidx.fragment.app.Fragment.performCreate(Fragment.java:2684) at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:280) at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1175) at androidx.fragment.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1255) at androidx.fragment.app.FragmentTransition.calculateFragments(FragmentTransition.java:1138) at androidx.fragment.app.FragmentTransition.startTransitions(FragmentTransition.java:136) at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1989) at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1947) at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849) at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7839) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) Caused by: java.lang.ClassNotFoundException: android.support.v7.preference.PreferenceScreen at java.lang.Class.classForName(Native Method) at java.lang.Class.forName(Class.java:454) at androidx.preference.PreferenceInflater.createItem(PreferenceInflater.java:214) at androidx.preference.PreferenceInflater.createItemFromTag(PreferenceInflater.java:277) at androidx.preference.PreferenceInflater.inflate(PreferenceInflater.java:151) at androidx.preference.PreferenceInflater.inflate(PreferenceInflater.java:109) at androidx.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:216) at androidx.preference.PreferenceFragmentCompat.setPreferencesFromResource(PreferenceFragmentCompat.java:377) at com.project.test.SettingsFragment.onCreatePreferences(SettingsFragment.java:33) at androidx.preference.PreferenceFragmentCompat.onCreate(PreferenceFragmentCompat.java:160) at com.project.test.SettingsFragment.onCreate(SettingsFragment.java:25) at androidx.fragment.app.Fragment.performCreate(Fragment.java:2684) at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:280) at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1175) at androidx.fragment.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1255) at androidx.fragment.app.FragmentTransition.calculateFragments(FragmentTransition.java:1138) at androidx.fragment.app.FragmentTransition.startTransitions(FragmentTransition.java:136) at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1989) at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1947) at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849) at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7839) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) Caused by: java.lang.ClassNotFoundException: android.support.v7.preference.PreferenceScreen at java.lang.Class.classForName(Native Method) at java.lang.Class.forName(Class.java:454) at androidx.preference.PreferenceInflater.createItem(PreferenceInflater.java:214) at androidx.preference.PreferenceInflater.createItemFromTag(PreferenceInflater.java:277) at androidx.preference.PreferenceInflater.inflate(PreferenceInflater.java:151) at androidx.preference.PreferenceInflater.inflate(PreferenceInflater.java:109) at androidx.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:216) at androidx.preference.PreferenceFragmentCompat.setPreferencesFromResource(PreferenceFragmentCompat.java:377) at com.project.test.SettingsFragment.onCreatePreferences(SettingsFragment.java:33) at androidx.preference.PreferenceFragmentCompat.onCreate(PreferenceFragmentCompat.java:160) at com.project.test.SettingsFragment.onCreate(SettingsFragment.java:25) at androidx.fragment.app.Fragment.performCreate(Fragment.java:2684) at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:280) at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1175) at androidx.fragment.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1255) at androidx.fragment.app.FragmentTransition.calculateFragments(FragmentTransition.java:1138) at androidx.fragment.app.FragmentTransition.startTransitions(FragmentTransition.java:136) at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1989) at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1947) at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849) at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7839) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
Отрывок из моего SettingsFragment.java файл (сообщение об ошибке в строке setPreferencesFromResource):
public class SettingsFragment extends PreferenceFragmentCompat { Utilities utils = new Utilities(); Context context = ProjectGlobal.getAppContext(); SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences.Editor settingsEditor = settings.edit() @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.pref_general, rootKey); Preference pfPermissionsReset = findPreference("permissionsPrompt"); Preference pfBatterySaving = findPreference("batteryPrompt"); final SeekBarPreference pfVolumeValue = (SeekBarPreference) findPreference("sbVolume"); final SwitchPreference pfGlobalVolume = (SwitchPreference) findPreference("chkUseGlobalVolume"); //init global volume control pfVolumeValue.setMax(100); pfVolumeValue.setMin(0);
From my pref_general.xml preference layout:
lt;android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"gt; lt;android.support.v7.preference.PreferenceCategory android:summary="App Settings" android:title="GENERAL" /gt; lt;android.support.v7.preference.SwitchPreference android:key="chkNotificationListener" android:summary="This option allows you to disable the app without uninstalling the application. [Default: On]" android:title="Notification Listener" android:defaultValue="true" /gt; lt;android.support.v7.preference.SwitchPreference android:key="chkHideBanner" android:summary="This option hides the banner notification at the top of the screen. Please note, this may impact the reliability of the application if disabled! [Default: Off]" android:title="Hide Banner Notification" android:defaultValue="false" /gt; lt;android.support.v7.preference.Preference android:title="Check Battery Saving" android:key="batteryPrompt" android:summary="Tap here to check that the app is allowed to run in the background/during startup on your device" /gt; lt;android.support.v7.preference.PreferenceCategory android:summary="Audio" android:title="AUDIO"/gt; lt;android.support.v7.preference.SwitchPreference android:key="chkOnlyUseSpeaker" android:summary="This option will attempt to play audio alerts from the device loudspeaker only [Default: Off]" android:title="Only Use Speaker" android:defaultValue="false" /gt; lt;android.support.v7.preference.SwitchPreference android:key="chkUseGlobalVolume" android:summary="This option will override any volume settings set in each rule [Default: Off]" android:title="Use Global Volume" android:defaultValue="false" /gt; lt;android.support.v7.preference.SeekBarPreference android:key="sbVolume" android:title="Global Volume" android:dependency="chkUseGlobalVolume" android:max="100" android:defaultValue="50" /gt; /gt; lt;android.support.v7.preference.PreferenceCategory android:summary="Security" android:title="SECURITY"/gt; lt;android.support.v7.preference.Preference android:title="Check Permissions" android:key="@string/permissionsPrompt" android:summary="Tap here to re-check permissions" /gt; lt;/android.support.v7.preference.PreferenceScreengt;
From my Launcher.java:
public class Launcher extends AppCompatActivity implements SettingsFragment.OnFragmentInteractionListener,RuleFragment.OnFragmentInteractionListener,HelpFragment.OnFragmentInteractionListener { RuleFragment ruleFragment = new RuleFragment(); SettingsFragment prefsFragment = new SettingsFragment(); HelpFragment helpFragment = new HelpFragment(); Utilities utils = new Utilities(); private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener = new BottomNavigationView.OnNavigationItemSelectedListener() { public boolean onNavigationItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { case R.id.navigation_home: getSupportFragmentManager().beginTransaction().remove(helpFragment).commit(); getSupportFragmentManager().beginTransaction().remove(prefsFragment).commit(); getSupportFragmentManager().beginTransaction().replace(R.id.contentFrame,ruleFragment).commit(); return true; case R.id.navigation_settings: getSupportFragmentManager().beginTransaction().remove(ruleFragment).commit(); getSupportFragmentManager().beginTransaction().remove(helpFragment).commit(); getSupportFragmentManager().beginTransaction().replace(R.id.contentFrame,prefsFragment).commit(); return true; case R.id.navigation_help: getSupportFragmentManager().beginTransaction().remove(prefsFragment).commit(); getSupportFragmentManager().beginTransaction().remove(ruleFragment).commit(); getSupportFragmentManager().beginTransaction().replace(R.id.contentFrame,helpFragment).commit(); return true; } return false; } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Launcher.context = getApplicationContext(); Utilities utils = new Utilities(); //initiate home screen setContentView(R.layout.main); getSupportFragmentManager().beginTransaction().replace(R.id.contentFrame,ruleFragment).commit(); }
Мой main.xml макет для запуска:
lt;?xml version="1.0" encoding="utf-8"?gt; lt;RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"gt; lt;androidx.coordinatorlayout.widget.CoordinatorLayout android:id="@ id/main_coordinator" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" android:layout_above="@ id/navigation" app:titleTextColor="@color/Black" gt; lt;FrameLayout android:id="@ id/contentFrame" android:layout_width="match_parent" android:layout_height="match_parent" /gt; lt;/androidx.coordinatorlayout.widget.CoordinatorLayoutgt; lt;com.google.android.material.bottomnavigation.BottomNavigationView android:id="@ id/navigation" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="?android:attr/windowBackground" app:menu="@menu/navigation" /gt; lt;/RelativeLayoutgt;
Ответ №1:
Удалось решить эту проблему. Это было потому, что я не обновил android.support.v7.preference в pref_general.xml для androidx.предпочтения.
После этого все сработало отлично!