6

ho un'attività che ha uno ScrollView con LinearLayout verticale che ha due frammenti che sono istanze PreferenceFragment come illustrato nel seguente file di layout:ScrollView> LinearLayout> PreferenceFragment è zero altezza

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_height="wrap_content" 
android:layout_width="match_parent" 
> 

<LinearLayout 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    tools:context="com.foo.app.SettingsActivity"> 

    <fragment 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:name="com.foo.app.SettingsFragment" 
     android:id="@+id/fragment_settings"/> 

    <fragment 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:name="com.foo.app.NotificationSettingsFragment" 
     android:id="@+id/fragment_notification_settings"/> 

</LinearLayout> 

Il problema è che i due frammenti mostrano solo il loro titolo PreferenceCategory e l'effettiva UI del frammento è a altezza zero e non visibile. Stranamente, è possibile scorrere ciascun frammento individualmente e vedere l'interfaccia utente del frammento mancante. È come se ogni frammento si trovasse all'interno di una ScrollView.

Quello che mi aspettavo era che i due frammenti fossero dimensionati per avvolgere il loro contenuto e che ci fosse un unico cursore verticale per scorrere il LinearLayout contenente entrambi i frammenti.

Nel caso in cui sia rilevante, i due frammenti estende android.preference.PreferenceFragment e non definiscono il loro layout in un file di layout. Invece caricano l'interfaccia utente delle preferenze come segue:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // Load the preferences from an XML resource 
    addPreferencesFromResource(R.xml.pref_notification); 
} 

TIA per il vostro aiuto.

+0

trovato qualche soluzione? – Ewoks

risposta

6

Rimuovere l'ScrollView esterno. Ho avuto lo stesso problema e questo lo ha risolto per me.

Non l'ho ancora trovato nella documentazione, ma a quanto pare il PreferenceFragment fornisce il proprio ScrollView attorno al PreferenceScreen. In qualche modo ciò porta ad un'altezza wrap_content che è abbastanza grande da mostrare il primo elemento (ad esempio un'intestazione di categoria).

+3

Ho più frammenti che costituiscono un'Attività Impostazioni personalizzata. Se rimuovo ScrollView esterno, ottengo barre di scorrimento verticali individuali in ognuno dei miei frammenti di impostazioni personalizzate. Questo non è desiderabile in quanto voglio solo una singola barra SCroll verticale. Quindi la soluzione sopra non risponde al mio bisogno. Grazie per il tuo aiuto. –

+1

qualsiasi soluzione? Sono in una situazione simile in cui ho un'attività normale che nel suo layout ha alcune immagini, pulsanti, in alto e in basso e frammento o due nel mezzo. Se la dimensione di questi frammenti è 0dp come raccomandato, essi non occupano tutto lo spazio necessario ma sono scorrevoli (singolarmente). Quello che voglio ottenere è in realtà scorrere l'intero schermo in una sola volta e questo frammenta per prendere tutto lo spazio di cui hanno bisogno (in modo che non siano scorrevoli separatamente sullo schermo intero). Al momento ho impostato l'altezza di questi frammenti per correggere le dimensioni (ad esempio 300 dpi). Non elegante per niente ( – Ewoks

5

La domanda è piuttosto vecchia, ma nel caso in cui qualcun altro si imbattesse in questo, sono riuscito a trovare una soluzione. Proprio come @Ewoks menzionato, ho dovuto accontentarmi anche di un'altezza fissa (che non ha sempre funzionato bene con i dpi diversi dei dispositivi).

Ma con l'aiuto di this code sono riuscito a rendere l'altezza dinamica, che avvolge piacevolmente il contenuto.

Nella classe PreferenceFragment procedere come segue:

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    if (getView() != null) { 

     ListView listView = (ListView) getView().findViewById(android.R.id.list); 
     Adapter adapter = listView.getAdapter(); 

     if (adapter != null) { 
      int height = 0; 
      //int height = listView.getPaddingTop() + listView.getPaddingBottom(); 

      for (int i = 0; i < adapter.getCount(); i++) { 
       View item = adapter.getView(i, null, listView); 

       item.measure(0, 0); 
       height += item.getMeasuredHeight(); 
      } 

      FrameLayout frame = (FrameLayout) getActivity().findViewById(R.id.content_frame); //Modify this for your fragment 

      ViewGroup.LayoutParams param = frame.getLayoutParams(); 
      param.height = height + (listView.getDividerHeight() * adapter.getCount()); 
      frame.setLayoutParams(param); 
     } 
    } 

} 

Spero che questo aiuti qualcuno!

+0

Perfetto, mi ha risparmiato ore di debug, ne sono sicuro!Stavo usando i frammenti aggiunti dinamicamente invece di quelli definiti, quindi per chiunque lo faccia, puoi usare 'LinearLayout frame = (LinearLayout) getActivity(). GetFragmentManager(). FindFragmentByTag (getPrefTag()). GetView();' per ottenere visualizzazione del tuo frammento dinamico per tag, dove #getPrefTag è un metodo personalizzato che restituisce semplicemente il tag definito che è stato utilizzato per aggiungere il tuo frammento. – JCricket

0

Provare a impostare Android: layout_weight in ogni frammento a circa le dimensioni di ciascun elenco di impostazioni. Per esempio.

<fragment 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.3" 
    android:name="com.foo.app.SettingsFragment" 
    android:id="@+id/fragment_settings"/> 

<fragment 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.7" 
    android:name="com.foo.app.NotificationSettingsFragment" 
    android:id="@+id/fragment_notification_settings"/>