Acabei de notar o fato de que o método addPreferencesFromResource(int preferencesResId)
está marcado como obsoleto na documentação do Android ( entrada de referência ).
Infelizmente, nenhum método alternativo é fornecido na descrição do método.
Qual método deve ser usado para conectar um preferênciaScreen.xml à PreferenceActivity correspondente?
addPreferencesFromResource(int preferencesResId)
. Estou esquecendo de algo ?Respostas:
Nenhum método alternativo é fornecido na descrição do método porque a abordagem preferida (no nível 11 da API) é instanciar objetos PreferenceFragment para carregar suas preferências em um arquivo de recurso. Veja o código de exemplo aqui: PreferenceActivity
fonte
Para adicionar mais informações à resposta correta acima, depois de ler um exemplo do Android-er , descobri que você pode converter facilmente sua atividade preferencial em um fragmento de preferência. Se você tem a seguinte atividade:
As únicas alterações que você precisa fazer é criar uma classe de fragmento interno, mover
addPreferencesFromResources()
o fragmento para o fragmento e chamar o fragmento da atividade, assim:Pode haver outras sutilezas para fazer preferências mais complexas a partir de fragmentos; se assim for, espero que alguém as anote aqui.
fonte
addPreferencesFromResources()
comércio pelo PreferenceFragment? Parece desnecessário do ponto de vista de iniciantes.@ Garret Wilson Muito obrigado! Como um noob para a codificação do Android, eu fiquei preso com o problema de incompatibilidade de preferências por tantas horas, e acho tão decepcionante que eles tenham depreciado o uso de alguns métodos / abordagens para novos que não são suportados pelas APIs mais antigas. ter que recorrer a todos os tipos de soluções alternativas para fazer seu aplicativo funcionar em uma ampla variedade de dispositivos. É realmente frustrante!
Sua classe é ótima, pois permite que você continue trabalhando em novas APIs com preferências do jeito que costumava ser, mas não é compatível com versões anteriores. Como estou tentando alcançar uma ampla variedade de dispositivos, trabalhei um pouco com ele para fazê-lo funcionar em dispositivos anteriores à API 11 e em APIs mais recentes:
Testado em dois emuladores (2.2 e 4.2) com sucesso.
Por que meu código parece tão ruim?
Sou iniciante em codificação Android e não sou o maior fã de java.
Para evitar o aviso preterido e forçar o Eclipse a me permitir compilar, tive que recorrer a anotações, mas elas parecem afetar apenas classes ou métodos; portanto, tive que mover o código para dois novos métodos para tirar vantagem disso.
Eu não gostaria de escrever meu ID de recurso xml duas vezes sempre que copiar e colar a classe para uma nova PreferenceActivity, então criei uma nova variável para armazenar esse valor.
Espero que isso seja útil para outra pessoa.
PS: Desculpe pelas minhas opiniões opinativas, mas quando você se torna novo e encontra essas desvantagens, não pode evitar ficar frustrado!
fonte
Minha abordagem está muito próxima da de Garret Wilson (obrigado, votei em você;)
Além disso, fornece compatibilidade com o Android <3.
Acabei de reconhecer que minha solução é ainda mais próxima da de Kevin Remo . É apenas um pouquinho mais limpo (pois não depende do antipadrão de "expecção" ).
Para um exemplo "real" (mas mais complexo), consulte NusicPreferencesActivity e NusicPreferencesFragment .
fonte
@SuppressLint("NewApi")
- evite - seja mais preciso. Você o executou para APIs baixas? Ele vai jogarVerifyError
@SuppressLint("NewApi")
estilo é apenas ruim@SuppressLint("NewApi")
nesta situação específica?@TargetApi(Build.VERSION_CODES.HONEYCOMB)
- nem todos os avisos para qualquer api :)Em vez de exceções, basta usar:
E use
suprimir os avisos.
fonte
Em vez de usar um
PreferenceActivity
para carregar diretamente as preferências, use umAppCompatActivity
ou equivalente que carregue umPreferenceFragmentCompat
que carrega suas preferências. Faz parte da biblioteca de suporte (agora Android Jetpack) e fornece compatibilidade com a API 14.No seu
build.gradle
, adicione uma dependência para a biblioteca de suporte de preferências:Nota: Vamos assumir que você já tem suas preferências XML criadas.
Para sua atividade, crie uma nova classe de atividade. Se você estiver usando temas materiais, estenda um
AppCompatActivity
, mas poderá ser flexível com isso:Agora, a parte importante: crie um fragmento que carregue suas preferências do XML:
Para obter mais informações, leia os documentos para desenvolvedores do Android
PreferenceFragmentCompat
.fonte