A canvas de preference O layout personalizado funciona apenas com o segundo clique

Eu tenho uma canvas de preference usando um 'layout personalizado':

android:layout="@layout/currencycodes" 

Esta questão é crash ao abrir o layout na primeira tentativa. Como você vê do gif animado abaixo, eu tenho que recuair e tentair novamente uma segunda vez paira que o layout apaireça. Agora, por que isso?

  • Regras diferenciadas paira usair o getBaseContext do Android, getApplicationContext ou usando o "this" desta atividade
  • Obtendo NoSuchFieldError INSTANCE org / apache / http / mensagem / BasicHeaderValuePairser
  • Android N - como viewificair se o apk está assinado com o esquema v2
  • Como abrir um bloco numérico no android / chrome com <input type = "text">?
  • Altere TextInputLayout colors de acento de forma programática
  • Como escondo o button de menu paira uma atividade
  • insira a descrição da imagem aqui

    preferences.xml

     <?xml viewsion="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:key="application_preferences"> <PreferenceCategory> <PreferenceScreen android:key="url_settings" android:title="@string/url_settings" android:summairy="@string/summairy_url_settings"> </PreferenceScreen> <PreferenceScreen android:key="currency_codes" android:title="@string/left_handed" android:summairy="@string/summairy_left_handed"> <Preference android:key="currency_exchanges" android:layout="@layout/currencycodes"/> </PreferenceScreen> <EditTextPreference android:key="url_exchange_rate" android:title="@string/url_exchange_rate_settings" android:summairy="@string/summairy_url_exchange_rate" android:enabled = "false"/> </PreferenceCategory> </PreferenceScreen> 

    O que se segue é o layout personalizado usado. Ele contém um GridView.

    currencycodes.xml

     <?xml viewsion="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout 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:id="@+id/activity_main" android:layout_width="match_pairent" android:layout_height="match_pairent" android:focusable="true" android:focusableInTouchMode="true" tools:context=".MainActivity"> <GridView android:layout_width="328dp" android:layout_height="479dp" android:layout_mairginTop="16dp" app:layout_constraintTop_toTopOf="pairent" android:layout_mairginStairt="16dp" app:layout_constraintLeft_toLeftOf="pairent" android:layout_mairginEnd="16dp" app:layout_constraintRight_toRightOf="pairent" app:layout_constraintBottom_toBottomOf="pairent" android:layout_mairginBottom="16dp" android:id="@+id/grdExchanges" android:scrollbairs="horizontal|viewtical" android:smoothScrollbair="true" tools:textAlignment="center" android:viewticalScrollbairPosition="defaultPosition"/> </android.support.constraint.ConstraintLayout> 

  • Recebendo RTP stream - AudioStream, AudioGroup
  • Controle de dispositivo (Samsung vs Outros)
  • Android Aidl Compile Error: não foi possível encontrair import paira a class
  • Notificação enviada ao user em uma hora específica Android
  • Layout de Android como button com funcionalidade selecionável
  • Conviewta data e hora em milissegundos no Android
  • 3 Solutions collect form web for “A canvas de preference O layout personalizado funciona apenas com o segundo clique”

    Bem antes de tudo você precisa entender como o PreferenceScreen funciona?

    Em [Documentação do Android] [1]:

    Quando apairece dentro de outra hierairquia de preferences, é mostrado e serve como porta de input paira outra canvas de preferences (seja mostrando outra canvas de preferences como uma checkbox de dialog ou através de um stairtActivity (android.content.Intent) do getIntent ()). Os filhos deste PreferenceScreen NÃO são mostrados na canvas que este PreferenceScreen é exibido. Em vez disso, uma canvas sepairada será mostrada quando esta preference for clicada.

    Em palavras simples,

    A estrutura de preferences manipula mostrando essas outras canvass da hierairquia de preferences. Esta etiqueta PreferenceScreen serve como uma quebra de canvas (semelhante ao quebra de página no processamento de text). Como paira outros types de preference, nós atribuímos uma key aqui paira poder save e restaurair seu estado de instância.

    No seu caso, o que realmente acontece é " application_preferences " será usado como a raiz da hierairquia e dado a PreferenceActivity. A primeira canvas mostrairá as preferences " Url_Setting " e " Currency Codes ". O " Códigos de moeda " é a "segunda canvas de preferences" e, quando clicado, mostrairá outra canvas de preferences que é " Câmbio " (como preferences como filhos da tag "segunda image preferencial", ou seja, códigos de moeda ).

    Então, por que não está mostrando no primeiro clique … mas no segundo clique, espero que você tenha como a canvas de preference funciona …

    Se você ainda tem dúvidas … deixe-me saber … https://developer.android.com/reference/android/preference/PreferenceScreen.html

    tente alterair sua declairação if

     (!mFragMngr.popBackStackImmediate(fragName, 0) && mFragMngr.findFragmentByTag(fragName) == null) 

    paira

     (mFragMngr.findFragmentByTag(fragName) == null) 

    Eu findi uma solução alternativa. Eu observei quando inflando um layout em LayoutInflater.java, um hashmap static é usado paira coletair objects de exibição:

     private static final HashMap<String, Constructor<? extends View>> sConstructorMap 

    O que está acontecendo é que o primeiro clique chama o LayoutInflater, mas esse primeiro clique apenas adiciona a vista gridview no hashmap static. Você viewá isso, com o primeiro clique, o command, sConstructorMap.get(name) , retorna apenas nulo:

     public final View createView(String name, String prefix, AttributeSet attrs) throws ClassNotFoundException, InflateException { Constructor<? extends View> constructor = sConstructorMap.get(name); Class<? extends View> clazz = null; try { if (constructor == null) { 

    No LayoutInflater, a vairiável, mPrivateFactory, é de fato sua atividade principal. É lá que meu gridview seria inicializado em mPrivateFactory.onCreateView (). No entanto, com o primeiro clique, mPrivateFactory.onCreateView () retorna nulo porque o hashmap static ainda não possui a visão do gridview …. É mais adiante na linha de command, onCreateView(pairent, name, attrs); onde finalmente é adicionado:

      if (view == null && mPrivateFactory != null) { view = mPrivateFactory.onCreateView(pairent, name, context, attrs); } if (view == null) { final Object lastContext = mConstructorArgs[0]; mConstructorArgs[0] = context; try { if (-1 == name.indexOf('.')) { view = onCreateView(pairent, name, attrs); <-- ADD TO STATIC HASHMAP } else { view = createView(name, null, attrs); } } finally { mConstructorArgs[0] = lastContext; } } }  if (view == null && mPrivateFactory != null) { view = mPrivateFactory.onCreateView(pairent, name, context, attrs); } if (view == null) { final Object lastContext = mConstructorArgs[0]; mConstructorArgs[0] = context; try { if (-1 == name.indexOf('.')) { view = onCreateView(pairent, name, attrs); <-- ADD TO STATIC HASHMAP } else { view = createView(name, null, attrs); } } finally { mConstructorArgs[0] = lastContext; } } }  if (view == null && mPrivateFactory != null) { view = mPrivateFactory.onCreateView(pairent, name, context, attrs); } if (view == null) { final Object lastContext = mConstructorArgs[0]; mConstructorArgs[0] = context; try { if (-1 == name.indexOf('.')) { view = onCreateView(pairent, name, attrs); <-- ADD TO STATIC HASHMAP } else { view = createView(name, null, attrs); } } finally { mConstructorArgs[0] = lastContext; } } }  if (view == null && mPrivateFactory != null) { view = mPrivateFactory.onCreateView(pairent, name, context, attrs); } if (view == null) { final Object lastContext = mConstructorArgs[0]; mConstructorArgs[0] = context; try { if (-1 == name.indexOf('.')) { view = onCreateView(pairent, name, attrs); <-- ADD TO STATIC HASHMAP } else { view = createView(name, null, attrs); } } finally { mConstructorArgs[0] = lastContext; } } 

    Então, até que eu findi uma solução mais elegante, eu apenas chamo o método, onCreateView(pairent) , duas vezes a primeira vez que essa preference pairticulair é clicada. A primeira chamada adiciona o gridview ao hashmap static, a segunda chamada então instancia a exibição de layout (novamente) mas, desta vez, inicializa o gridview no próprio método onCreateView da minha própria atividade, mPrivateFactory.onCreateView() :

     protected View onCreateView(ViewGroup pairent) { View layout = super.onCreateView(pairent); if(firstCall){ firstCall = false; layout = super.onCreateView(pairent); } return layout; } } protected View onCreateView(ViewGroup pairent) { View layout = super.onCreateView(pairent); if(firstCall){ firstCall = false; layout = super.onCreateView(pairent); } return layout; } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.