УВЕДОМЛЕНИЕ. Пожалуйста, спасите себя некоторое время и обратитесь к принятому ответу, не нужно читать все quesiton.
Вы можете прочитать остальную часть вопроса и ответ, который я дал для альтернативного (хотя и менее сложного) метода.
Кроме того, вы можете воспользоваться исправлением для фонового сбоя в Android 2.X, добавив связанный фрагмент кода в ваш класс активности предпочтений.
Фон
Будучи новичком в Android-кодировании, но несколько опытным в других языках программирования/фреймворках, я ожидал, что моя прогулка по кодированию приложений Android будет довольно приятной. Это было так, пока я не наткнулся на эту проблему:
Мастер Eclipse для проектов Android предложил, чтобы я смог достичь 95% устройств, если бы установил минимальный API до 8 (Android 2.2). Мне все равно не нужно было делать какие-либо причудливые вещи с моим приложением, поэтому я подумал: "Конечно, почему бы и нет?". Все было в порядке, за исключением того, что иногда я нахожу несколько методов/классов, которые были устаревшими в самых последних версиях API, поэтому мне пришлось разработать способы продолжать использовать старые способы для старых устройств и стараться максимально использовать новые способы для новых версий Android. Это один из таких случаев.
После использования мастера Eclipse для создания активности предпочтений я понял, что предварительный компилятор Eclipse/parser/checker (или что-то, что он назвал) Lint, будет жаловаться на то, что не сможет использовать новые способы создания/управления предпочтениями в более ранних версиях API. Поэтому я подумал: "Хорошо, примените новые способы. Старайтесь делать это по-старому, и поскольку новые версии API должны быть обратно совместимы, все должно быть в порядке", но это не так. Старый способ использования методов/классов, отмеченных как устаревшие; что, по моему мнению, даже если они будут работать в текущем API, они перестанут работать в какой-то момент в будущих выпусках.
Итак, я начал искать правильный способ сделать это, и, наконец, ударил эту страницу: Что использовать вместо" addPreferencesFromResource " в PreferenceActivity?, где Гаррет Уилсон объясняет способ использования старых ресурсов экрана предпочтений таким образом, который совместим с новыми способами. Это было здорово, и, наконец, я почувствовал, что могу двигаться дальше с помощью своего приложения, за исключением того, что он не будет работать при использовании более старых API-интерфейсов, поскольку он использует новый API-код. Поэтому мне пришлось разработать способ заставить его работать как с старыми API, так и с новыми. После того, как я немного поработал с ним, мне удалось найти способ, используя прекомпилятор (или как он его называл) аннотации и отличный getClass(). GetMethod() вместе с исключениями.
Казалось, что все работает безупречно, пока я не создал дополнительный экран предпочтений. Он корректно отображался в новых версиях Android, но когда я пытался в старых, я мог просто видеть черный экран. После долгих поисков я нашел эту страницу, которая объясняет проблему: http://code.google.com/p/android/issues/detail?id=4611 Это, по-видимому, известный глюк, который был вокруг нескольких версий Android для хорошо. Я прочитал весь поток и нашел несколько предлагаемых решений проблемы, но мне действительно не понравилось полностью их. Я, например, предпочитаю избегать столько статического материала, сколько могу, и делать что-то программно. Я предпочитаю автоматизацию по повторяющейся работе. В некоторых решениях предлагалось создать подэлементы в качестве родительских экранов, затем добавить их в файл манифеста и вызвать их с родительского экрана с помощью намерения. Мне бы очень не хотелось отслеживать эти вещи: записи в манифесте, отдельный файл ресурсов экрана, намерения... Так что это было не-нет для меня. Я продолжал искать и находил программный подход, который мне очень понравился... только чтобы найти, что он не работает. Он состоял из повторения всего дерева представлений экрана предпочтений и назначения правильного фона для предпочтений субэкранов, но он просто не работал, потому что, как я позже узнал после большой отладки, представления подэлементов предпочтений не являются образ экрана предпочтений. Я должен был найти способ добиться этого сам. Я пробовал столько, о чем мог думать, исследовать и исследовать безрезультатно. Я был на пороге отказа от нескольких случаев, но после двух недель продолжительных усилий и много отладки я нашел обходное решение, которое я опубликовал в комментарии № 35.
Мнение
Это действительно не идеальное решение/подход, и я знаю несколько его недостатков, но это тот, который работает, поэтому я решил поделиться им. Надеюсь, я не слишком смехотворен в своем энтузиазме, чтобы поделиться тем, что взяло на себя то, что я считаю довольно много, поскольку я знаю, что это не такая уж большая проблема, которую мог бы решить любой опытный кодер. Но эй, я думаю, что обмен знаниями помогает мне немного лучше, независимо от того, насколько я похвастаюсь, чем опытный кодер, который держит все в себе. Просто поделитесь своим мнением, потому что я не могу поверить, что никто никогда не сталкивался с этой проблемой раньше, но я уверен, что у многих это было, и не поделились своими знаниями.
Представляю вам ответ с предлагаемым классом для использования в нескольких версиях Android и некоторые предложения по его использованию. Я открыт для обсуждения и вклада, чтобы сделать его лучшим классом.
Известные проблемы:
- Родительский экран Фон декорированного изображения клонируется на дочерний экран. Декоративный фон, который, по-видимому, не является нормальным поведением.
Статус: уволен, пока кто-нибудь не придет с серьезными основаниями исправить это. - Сбой при повороте экрана
Статус: Исправлено.
Вероятно, связано с видимостью ресурсов с помощью новой реализации API (внутренний класс PF)
По-видимому, унаследованные классы из preferenceFragment должны иметь все свои члены static. Я думаю, это имеет смысл, если вы должны наследовать каждый раз, когда вам нужно использовать новый фрагмент