2017-01-17 12 views
9

Mam ekran preferencji przy pomocy „niestandardowy układ”:Preferencje Ekran klienta Układ działa tylko z drugiego kliknięcia

android:layout="@layout/currencycodes" 

Kwestia ta jest nie powiedzie się wychować układ w pierwszej próbie. Jak widzisz z animowanego gifa poniżej, muszę się wycofać i spróbować ponownie po raz drugi, aby pojawił się układ. Dlaczego tak jest?

enter image description here

preferences.xml

<?xml version="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:summary="@string/summary_url_settings"> 
     </PreferenceScreen> 

     <PreferenceScreen 
       android:key="currency_codes" 
       android:title="@string/left_handed" 
       android:summary="@string/summary_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:summary="@string/summary_url_exchange_rate" 
       android:enabled = "false"/> 
    </PreferenceCategory> 
</PreferenceScreen> 

Poniżej jest układ niestandardowy używany. Zawiera GridView.

currencycodes.xml

<?xml version="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_parent" 
     android:layout_height="match_parent" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     tools:context=".MainActivity"> 

    <GridView 
      android:layout_width="328dp" 
      android:layout_height="479dp" 
      android:layout_marginTop="16dp" 
      app:layout_constraintTop_toTopOf="parent" android:layout_marginStart="16dp" 
      app:layout_constraintLeft_toLeftOf="parent" android:layout_marginEnd="16dp" 
      app:layout_constraintRight_toRightOf="parent" 
      app:layout_constraintBottom_toBottomOf="parent" android:layout_marginBottom="16dp" 
      android:id="@+id/grdExchanges" android:scrollbars="horizontal|vertical" 
      android:smoothScrollbar="true" tools:textAlignment="center" 
      android:verticalScrollbarPosition="defaultPosition"/> 
</android.support.constraint.ConstraintLayout> 
+0

proszę dodać Java jako well –

Odpowiedz

1

Wymyśliłem obejście. Zauważyłam, gdy układ pompowania w LayoutInflater.java statyczny HashMap służy do zbierania oglądać obiekty:

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

Co się dzieje jest to, że pierwsze kliknięcie wywołuje LayoutInflater, ale to pierwsze kliknięcie dodaje tylko GridView w widoku statyczna nieobecność. Zobaczysz, że z pierwszego kliknięcia, polecenie, sConstructorMap.get(name), zwraca tylko wartość null:

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) { 

W LayoutInflater, zmienna, mPrivateFactory, w rzeczywistości jest Twój główny aktywny. To tam mój gridview byłby zainicjalizowany w mPrivateFactory.onCreateView(). Jednak przy pierwszym kliknięciu mPrivateFactory.onCreateView() zwraca wartość null, ponieważ statyczna strategia nie ma widoku gridview ... yet. To poniżej w wierszu poleceń, onCreateView(parent, name, attrs); gdzie jest w końcu dodaje:

if (view == null && mPrivateFactory != null) { 
     view = mPrivateFactory.onCreateView(parent, name, context, attrs); 
    } 

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

Więc dopóki nie wymyślił bardziej eleganckie rozwiązanie, ja po prostu wywołać metodę, onCreateView(parent), dwa razy po raz pierwszy, że szczególnie korzystne jest kliknięty na. Pierwsze połączenie dodaje GridView do statycznej hashmap, drugie wezwanie następnie wystąpienie widok układu (znowu), ale tym razem, inicjuje GridView w moim własnym Przebieg ćwiczenia za onCreateView, mPrivateFactory.onCreateView():

protected View onCreateView(ViewGroup parent) { 

View layout = super.onCreateView(parent); 

if(firstCall){ 

    firstCall = false; 

    layout = super.onCreateView(parent); 
} 

return layout; 
} 
1

spróbować zmienić swoje oświadczenie if z

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

do

(mFragMngr.findFragmentByTag(fragName) == null) 
+0

To tylko określa, czy przycisk Setting gear został już wciśnięty, czy fragment już jest wyświetlony. Nie ma to nic wspólnego z tą kwestią. – Drawn

2

Więc przede wszystkim trzeba zrozumieć, jak PreferenceScreen Works ??

Z [Android dokumentacji] [1]:

Gdy okaże się wewnątrz innej hierarchii korzystniej, jest przedstawiony i służy (przez jako brama innym ekranie preferencji pokazujący inny ekran preferencji jako okno dialogowe lub przez startActivity (android.content.Intent) z getIntent()). Dzieci z tego ekranu preferencji NIE są wyświetlane na ekranie, na którym wyświetlane jest to okno PreferenceScreen. Zamiast tego po kliknięciu tej preferencji zostanie wyświetlony oddzielny ekran .

w prostych słowach,

Ramy preferencji uchwyty pokazano także inne ekrany z hierarchią preferencji. Ten znacznik PreferenceScreen służy jako podział ekranu (podobnie jak podział strony w edytorze tekstu). Podobnie jak w przypadku innych typów preferencji, przypisujemy tutaj klucz, aby można było zapisać i przywrócić jego stan instancji.

W twoim przypadku, co faktycznie dzieje się to „application_preferences” będzie używany jako główny hierarchii i podane do pierwszego ekranu PreferenceActivity.The pokaże preferencje „Url_Setting” i "kodów waluty ". W „Kody walutowe” jest „second_preferencescreen” i po kliknięciu pokaże kolejny ekran preferencji która jest „Wymiana walut” (jak preferencje go jako dzieci z „second_preferencescreen” tag tj kodów waluty).

Tak, to dlaczego jej nie widać na pierwszy kliknij .... ale na drugim kliknięciem nadzieję masz jak działa preferencji ekranu ...

Jeśli nadal masz jakieś wątpliwości ... daj mi znać. .. https://developer.android.com/reference/android/preference/PreferenceScreen.html

+0

Recytuję dokumentację PreferenceScreen bez uwzględniania tego konkretnego problemu. "Więc, dlaczego nie jest wyświetlany po pierwszym kliknięciu ..." - Nie stwierdzono nic, co tłumaczy, dlaczego nie jest wyświetlane po pierwszym kliknięciu. "Kody walutowe" to nie "drugi ekran referencyjny", ale trzeci. Drugi to "ustawienia url" i działa dobrze. – Drawn

+0

@ kod waluty gotówki jest drugim ekranem preferencji. Zgodnie z kodem, który ma inny klucz preferencji w nim, to jest wymiana walut, o której wspomniałeś. Odmiana ich nie jest ekranem preferencji Do wymiany walut. Cytowałem to z dokumentów, więc wiesz, co oficjalne dokumenty mówią o hierarchii preferencji. Zawsze dotyczy to hierarchii preferencji i ekranu. Hierarchia hierarchii nie jest liczona jako pierwsza, która jest twoją aplikacją application_preference.given do preferencji. Mam nadzieję, że rozumiem. Chodzi o hierarchię preferencji. Indeksowanie. Wewnętrznie w Androidzie. Gdzie leży twój problem ??? – PN10

+0

Ustawienia adresu URL będą działały bez zarzutu, ponieważ jest to pierwszy ekran preferencji, ale kody walut są drugim ekranem preferencji, które mają inną preferencję. Do tego ekranu. Przeglądanie preferencji ... Zobacz kolejność ekranu preferencji ... Tutaj ... – PN10

Powiązane problemy