Intereting Posts
Обратный вызов при завершении создания меню опций Закусочная и другие анимации перестали работать на некоторых устройствах Android @ Font-face не работает в мобильном Webkit FFMPEG для инструментальных цепей Android: arm-linux-armeabi-eabi-pkg-config – существует ли какая-либо инструментальная цепочка, содержащая инструмент pkg-config Как создать привязку пользовательских данных в android? (Андроид-студия) Обнаружение, если был получен ответ на исходящий вызов В чем разница между адаптером и адаптером в Android? Кордова – обновления для Android (версии для замораживания) Одна кнопка – 3 магазина приложений – как перенаправить пользователя в соответствующее приложение? К сожалению приложение прекращается при проверке сети ListFragment OnListItemClick не вызывается Android: полноэкранная активность с панелью заголовка Диаграмма классов API Android Когда вызывается onBindViewHolder и как он работает? Вертикальная линия с использованием XML-drawable

Когда вызываются android'sValidFragment () из PreferenceActivity?

Для некоторых приложений, на которых я работал, для устройств с API уровня 19 я получаю исключение

Caused by: java.lang.RuntimeException: Subclasses of PreferenceActivity must override isValidFragment(String) to verify that the Fragment class is valid! com... has not checked if fragment com...$. is valid. 

Затем я узнал, что для тех приложений, которые поддерживаются фреймворками Android, protected boolean isValidFragment(String fragmentName) получает вызов, у которого есть код

 if (getApplicationInfo().targetSdkVersion >= android.os.Build.VERSION_CODES.KITKAT) { throw new RuntimeException( "Subclasses of PreferenceActivity must override isValidFragment(String)" + " to verify that the Fragment class is valid! " + this.getClass().getName() + " has not checked if fragment " + fragmentName + " is valid."); } else { return true; } 

Затем я попытался воспроизвести ошибку

Я взял код примерного приложения из примера действия Preferences и добавил строку <uses-sdk android:targetSdkVersion="19" /> в манифесте.

Но странно, я не получаю ошибку (isValidFragment () не получает вызов в этом случае).

Поэтому, пожалуйста, скажите мне, как копировать эту ошибку в моем примере приложения.

Solutions Collecting From Web of "Когда вызываются android'sValidFragment () из PreferenceActivity?"

Кажется, это ошибка или ограничение безопасности 4.4. Workaraound должен использовать что-либо ниже 19, которое по-прежнему совместимо с PreferenceActivity и укусить пулю для компиляции с более старой целью.

Я использую «шаблон» заголовков для PreferenceActivity (переопределяя public void onBuildHeaders(List<Header> target) ), и я предполагаю, что OP тоже, скорее всего, является местом, где происходит и происходит что-то происходит.

В моем случае я <uses-sdk android:targetSdkVersion="19" /> это исключение в <uses-sdk android:targetSdkVersion="19" /> , и все, что было в [14-18], будет компилироваться и запускаться без проблем.

Предложение (для Eclipse): я никогда не испортил себя, так что я не ошибался, но я предполагаю, если вы скомпилируете свой PreferenceActivity (и, возможно, фрагменты) в другом проекте, ориентированном на 18 или ниже (каламбур не предназначен: O), а затем используя Этот проект как библиотека для вашего основного проекта, ориентированного на KitKat (19), возможно, вы можете избежать сценария сбоя во время выполнения, все еще используя функции, которые вам нужны из последней сборки (если эти функции не находятся в сборке, 18-привязанная PreferenceActivity ). Если это не удается, попробуйте использовать этот проект в форме jar (предварительно скомпилированный) вместо использования в качестве библиотеки.

ОБНОВЛЕНИЕ : также обратите внимание на ответ Камиллы Севиньи. Если проблема имеет какое-либо отношение к этому другому вопросу (50% -ный шанс IMHO), все приложения, ориентированные на API 18, уязвимы для атак с фрагментацией (см. Его связанный вопрос).

Ответ на ваш вопрос в этом посте. Это повторяющийся вопрос:

IsValidFragment Android API 19

–Updated–

Вот что такое решение:

В основном, какая бы активность не использовала ваш фрагмент «com … $» в приведенной выше ошибке, вы должны обновить ее с помощью исправления ниже. Вы должны обновить все действия в вашем проекте с помощью этого исправления для любой Acitvity, которая использует фрагмент.

В документации указано:

 protected boolean isValidFragment (String fragmentName) Added in API level 19 Subclasses should override this method and verify that the given fragment is a valid type to be attached to this activity. The default implementation returns true for apps built for android:targetSdkVersion older than KITKAT. For later versions, it will throw an exception. 

Вы можете исправить эту ошибку, переопределив этот метод в Activity / FragmentActivity:

 @Override protected boolean isValidFragment (String fragmentName) { return [YOUR_FRAGMENT_NAME_HERE].class.getName().equals(fragmentName); } 

Если вы ленитесь и просто хотите проверить, работает ли это исправление до кодирования всех ваших фрагментов в этот метод, вы можете просто вернуть true без какой-либо проверки:

 @Override protected boolean isValidFragment (String fragmentName) { return true; } 

У меня были те же проблемы при тестировании на эмуляторе, и это было решением.

Ну вот!

Шлепните это там, и вы хороши!

Соберите все внутренние классы, найденные в этой PreferenceActivity. Я решил поместить список в статическую переменную поля:

 public class whatever extends PreferenceActivity { static final Class<?>[] INNER_CLASSES = whatever.class.getDeclaredClasses(); 

Затем переопределите метод ValidFragment и убедитесь, что фрагмент, который будет отображаться, является одним из видов активности «родителя»:

  /** * Google found a 'security vulnerability' and imposed this hack. * Have to check this fragment was actually conceived by this activity. */ @Override protected boolean isValidFragment(String fragmentName) { Boolean knownFrag = false; for (Class<?> cls : INNER_CLASSES) { if ( cls.getName().equals(fragmentName) ){ knownFrag = true; break; } } return knownFrag; }