Eu estava tendo problemas para usar a nova barra de ferramentas do Material Design na biblioteca de suporte em uma tela de preferência.
Eu tenho um arquivo settings.xml conforme abaixo:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="@string/AddingItems"
android:key="pref_key_storage_settings">
<ListPreference
android:key="pref_key_new_items"
android:title="@string/LocationOfNewItems"
android:summary="@string/LocationOfNewItemsSummary"
android:entries="@array/new_items_entry"
android:entryValues="@array/new_item_entry_value"
android:defaultValue="1"/>
</PreferenceCategory>
</PreferenceScreen>
As strings são definidas em outro lugar.
android
android-actionbar
android-5.0-lollipop
android-actionbar-compat
android-toolbar
James Cross
fonte
fonte
Respostas:
Encontre o Repo GitHub: Aqui
Um pouco tarde para a festa, mas esta é a minha solução que estou usando como uma alternativa para continuar usando
PreferenceActivity
:settings_toolbar.xml :
SettingsActivity.java :
Result :
ATUALIZAÇÃO (compatibilidade com pão de mel):
De acordo com os comentários, os dispositivos Gingerbread estão retornando NullPointerException nesta linha:
CONSERTAR:
SettingsActivity.java :
Qualquer problema com o acima me avise!
ATUALIZAÇÃO 2: CORREÇÃO DE TINTURA
Como apontado em muitas notas de desenvolvimento
PreferenceActivity
, não suporta a coloração de elementos, no entanto, utilizando algumas classes internas, você PODE conseguir isso. Isso até que essas classes sejam removidas. (Funciona usando appCompat support-v7 v21.0.3).Adicione as seguintes importações:
Em seguida, substitua o
onCreateView
método:Result:
AppCompat 22.1
O AppCompat 22.1 introduziu novos elementos coloridos, o que significa que não há mais necessidade de utilizar as classes internas para obter o mesmo efeito da última atualização. Em vez disso, siga isto (ainda substituindo
onCreateView
):TELAS DE PREFERÊNCIA ANINHADAS
Muitas pessoas estão tendo problemas para incluir a barra de ferramentas em um aninhado
<PreferenceScreen />
, entretanto, eu encontrei uma solução !! - Depois de muita tentativa e erro!Adicione o seguinte ao seu
SettingsActivity
:O motivo disso
PreferenceScreen
ser tão chato é porque eles são baseados em uma caixa de diálogo de invólucro, então precisamos capturar o layout da caixa de diálogo para adicionar a barra de ferramentas a ela.Sombra da Barra de Ferramentas
Por design, a importação de
Toolbar
não permite elevação e sombreamento em dispositivos anteriores à v21, então, se você quiser ter elevação em seu,Toolbar
precisa envolvê-lo emAppBarLayout
:settings_toolbar.xml
:Não esquecendo de adicionar o add a biblioteca Design Support como uma dependência no
build.gradle
arquivo:Android 6.0
Eu investiguei o problema de sobreposição relatado e não consigo reproduzi-lo.
O código completo em uso conforme acima produz o seguinte:
Se algo estiver faltando, entre em contato por meio deste repositório e investigarei.
fonte
Você pode usar um
PreferenceFragment
, como alternativa aPreferenceActivity
. Então, aqui está oActivity
exemplo de embalagem :E aqui está o arquivo de layout (pref_with_actionbar):
E finalmente
PreferenceFragment
:Espero que isso ajude alguém.
fonte
ActionBarActivity
para obter a barra de ferramentas e funções relacionadas, não haverá nenhumonBuildHeaders()
para substituir e nenhum suporte de preferência real na atividade. Se você usa o antigoPreferenceActivity
, não tem a barra de ferramentas e funções relacionadas (sim, você pode ter umToolbar
layout e, mas não pode chamarsetSupportActionBar()
. Então, seja com cabeçalhos de preferência ou telas de preferência aninhadas, parecemos presos.Atualização completamente nova.
Com alguma experimentação, parece que encontrei a solução AppCompat 22.1+ funcional para telas de preferência aninhadas.
Primeiro, como é mencionado em muitas respostas (incluindo uma aqui), você precisará usar o novo
AppCompatDelegate
. Use oAppCompatPreferenceActivity.java
arquivo das demos de suporte ( https://android.googlesource.com/platform/development/+/58bf5b99e6132332afb8b44b4c8cedf5756ad464/samples/Support7Demos/src/com/example/android/supportv7/app/ApptivityPersonalize . a partir dele ou copie as funções relevantes para vocêPreferenceActivity
. Vou mostrar a primeira abordagem aqui:O layout que acompanha é bastante simples e usual (
layout/settings_page.xml
):As próprias preferências são definidas como de costume (
xml/settings.xml
):Nenhuma diferença real para soluções na rede até este ponto. Na verdade, você pode usar isso mesmo se não tiver telas aninhadas, sem cabeçalhos, apenas uma única tela.
Usamos um comum
PreferenceFragment
para todas as páginas mais profundas, diferenciadas pelosextra
parâmetros nos cabeçalhos. Cada página terá um XML separado com umPreferenceScreen
interior comum (xml/settings_page1.xml
et al.). O fragmento usa o mesmo layout da atividade, incluindo a barra de ferramentas.Finalmente, um breve resumo de como isso realmente funciona. O novo
AppCompatDelegate
nos permite usar qualquer atividade com recursos do AppCompat, não apenas aquelas que se estendem das atividades realmente no AppCompat. Isso significa que podemos transformar o bom e velhoPreferenceActivity
em um novo e adicionar a barra de ferramentas como de costume. A partir daí, podemos nos ater às antigas soluções de telas de preferência e cabeçalhos, sem nenhum desvio da documentação existente. Só há um ponto importante: não useonCreate()
na atividade porque isso levará a erros. UseonBuildHeaders()
para todas as operações, como adicionar a barra de ferramentas.A única diferença real é, e isso é o que o faz funcionar com telas aninhadas, é que você pode usar a mesma abordagem com os fragmentos. Você pode usá-los
onCreateView()
da mesma forma, inflando seu próprio layout em vez do do sistema, adicionando a barra de ferramentas da mesma forma que na atividade.fonte
R.drawable.abc_ic_ab_back_mtrl_am_alpha
PreferenceFragmentCompat
vez dePreferenceFragment
. Configurar umpreference-header
comxmlns:app="http://schemas.android.com/apk/res-auto"
e emapp:fragment
vez deandroid:fragment
não carrega nenhuma nova tela de preferências. Então, tendo problemas com a compatibilidade com versões anteriores ... sugestões?Se você deseja usar PreferenceHeaders, pode usar a seguinte abordagem:
layout / activity_settings.xml
Você pode usar qualquer layout de sua preferência aqui, apenas certifique-se de ajustá-lo no código Java também.
E, finalmente, seu arquivo com cabeçalhos (xml / pref_headers.xml)
fonte
android.R.id.content
, considerando que costumávamos passar umListView
withandroid.R.id.list
para a própria lista de preferências (e ainda fazemos se usarmos a forma fragment-less, headerless).Com o lançamento da Android Support Library 22.1.0 e o novo AppCompatDelegate, aqui você pode encontrar um bom exemplo de uma implementação de PreferenceActivity com suporte de material com compatibilidade com versões anteriores.
Atualizar funciona em telas aninhadas também.
https://android.googlesource.com/platform/development/+/marshmallow-mr3-release/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatPreferenceActivity.java
fonte
Embora as respostas acima pareçam elaboradas, se você quiser uma solução rápida para usar a Barra de Ferramentas com suporte API 7 e superior enquanto a amplia
PreferenceActivity
, recebi ajuda neste projeto abaixo.https://github.com/AndroidDeveloperLB/ActionBarPreferenceActivity
activity_settings.xml
SettingsActivity.java
fonte
Eu também estou procurando uma solução para adicionar a barra de ferramentas de suporte v7 ( API 25 ) à AppCompatPreferenceActivity (que é criada automaticamente pelo AndroidStudio ao adicionar uma SettingsActivity). Depois de ler várias soluções e experimentar cada uma delas, tive dificuldade em fazer com que os exemplos de PreferenceFragment gerados também fossem exibidos com uma barra de ferramentas.
Uma solução modificada que deu certo veio do " Gabor ".
Uma das advertências que enfrentei foi 'onBuildHeaders' dispara apenas uma vez. Se você virar um dispositivo (como um telefone) de lado, a visualização é recriada e PreferenceActivity fica sem uma barra de ferramentas novamente, no entanto, os PreferenceFragments manteriam a sua.
Tentei usar 'onPostCreate' para chamar 'setContentView', enquanto isso funcionava para recriar a barra de ferramentas quando a orientação mudava, PreferenceFragments seria então renderizado em branco.
O que descobri aproveita quase todas as dicas e respostas que pude ler sobre esse assunto. Espero que outros também o considerem útil.
Vamos começar com o Java
Primeiro em AppCompatPreferenceActivity.java (gerado) , modifiquei 'setSupportActionBar' assim:
Em segundo lugar , criei uma nova classe chamada AppCompatPreferenceFragment.java (atualmente é um nome não utilizado, embora possa não permanecer assim!):
Esta é a parte da resposta de Gabor que funcionou.
Por último , para obter consistência, precisamos fazer algumas alterações em SettingsActivity.java :
Algum código foi deixado de fora da atividade por questões de brevidade. Os principais componentes aqui são ' onAttachedFragment ', ' onPostCreate ' e o 'GeneralPreferenceFragment' agora estende o ' AppCompatPreferenceFragment ' personalizado em vez de PreferenceFragment.
Resumo do código : se um fragmento estiver presente, o fragmento injeta o novo layout e chama a função modificada 'setSupportActionBar'. Se o fragmento não estiver presente, SettingsActivity injeta o novo layout em 'onPostCreate'
Agora vamos ao XML (muito simples):
activity_settings.xml :
app_bar_settings.xml :
content_settings.xml :
Resultado final :
fonte
Eu tenho uma solução nova (possivelmente mais limpa), que usa as
AppCompatPreferenceActivity
amostras do Suporte v7. Com este código em mãos, criei meu próprio layout que inclui uma barra de ferramentas:Então, no meu
AppCompatPreferenceActivity
, altereisetContentView
para criar um meu novo layout e coloquei o layout fornecido dentro do meuFrameLayout
:Então eu apenas estendo
AppCompatPreferenceActivity
, permitindo que eu chamesetSupportActionBar((Toolbar) findViewById(R.id.toolbar))
, e aumentei os itens de menu na barra de ferramentas também. Tudo isso mantendo os benefícios de aPreferenceActivity
.fonte
Vamos mantê-lo simples e limpo aqui, sem quebrar nenhum layout embutido
fonte
root.getChildAt(0);
retornanull
.Eu encontrei esta solução simples enquanto trabalhava nisso. Primeiro, precisamos criar um layout para a atividade de configurações.
activity_settings.xml
Certifique-se de adicionar uma visualização de lista com
android:id="@android:id/list"
, caso contrário, ele irá lançarNullPointerException
O próximo passo é adicionar o
onCreate
método (substituir) na sua atividade de configuraçõesSettings.java
Certifique-se de importar
android.suppoer.v7.widget.Toolbar
. Isso deve funcionar muito bem em todas as APIs acima de 16 (Jelly Bean e superior)fonte
Gostaria de continuar a solução marcada de James Cross, pois depois disso há um problema de fechar apenas a tela aninhada ativa (PreferenceFragment) no sentido de não fechar também o SettingsActivity.
Na verdade funciona em todas as telas aninhadas (então não entendo a solução do Gábor que tentei sem sucesso, bem funciona até certo ponto mas é uma bagunça de várias barras de ferramentas), porque quando o usuário clica em uma tela de subprefeituras , apenas o fragmento é alterado (consulte
<FrameLayout android:id="@+id/content_frame" .../>
), não a barra de ferramentas que permanece sempre ativa e visível, mas um comportamento personalizado deve ser implementado para fechar cada fragmento de acordo.Na classe principal
SettingsActivity
que se estende,ActionBarActivity
os seguintes métodos devem ser implementados. Observe que privadosetupActionBar()
é chamado deonCreate()
Para o título da tela aninhada escolhida, você deve obter a referência de sua barra de ferramentas e definir o título apropriado com
toolbar.setTitle(R.string.pref_title_general);
(por exemplo).Não há necessidade de implementar
getSupportActionBar()
em todos os PreferenceFragment, uma vez que apenas a visualização do fragmento é alterada a cada commit, não a barra de ferramentas;Não há necessidade de criar uma classe ToolbarPreference falsa para adicionar em cada preferência.xml (veja a resposta de Gábor).
fonte
Aqui está uma biblioteca que fiz baseada no código AOSP, que adiciona tonalidade às preferências e aos diálogos, adiciona uma barra de ação e oferece suporte a todas as versões da API 7:
https://github.com/AndroidDeveloperLB/MaterialPreferenceLibrary
fonte
PreferenceScreen
interiorPreferenceScreen
como esteBem, isso ainda é um problema para mim hoje (18 de novembro de 2015). Eu tentei todas as soluções deste tópico, mas havia duas coisas principais que não consegui resolver:
Então acabei criando uma biblioteca com uma solução mais complicada. Basicamente, eu tive que aplicar estilos internamente às preferências se estivermos usando um dispositivo pré-Lollipop e também manipulei as telas aninhadas usando um fragmento personalizado (restaurando toda a hierarquia aninhada aproveitando a chave PreferenceScreen ).
A biblioteca é esta: https://github.com/ferrannp/material-preferences
E se você estiver interessado no código-fonte (muito longo para postá-lo aqui), este é basicamente o núcleo dele: https://github.com/ferrannp/material-preferences/blob/master/library/src/main/ java / com / fnp / materialpreferences / PreferenceFragment.java
fonte