6

I habe eine Aktivität, die eine Scroll mit einem vertikalen Linearlayout aufweist, die zwei Fragmente haben, die PreferenceFragment Fälle sind wie in der folgenden Layout-Datei dargestellt:Scroll> Linearlayout> PreferenceFragment Null Höhe

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

Das Problem besteht darin, dass die beiden Fragmente nur mit ihrem PreferenceCategory-Titel angezeigt werden und das tatsächliche Fragment-UI null Höhe hat und nicht sichtbar ist. Seltsamerweise ist es möglich, jedes Fragment einzeln zu scrollen und das UI des fehlenden Fragments zu sehen. Es ist, als ob jedes Fragment in einer ScrollView ist.

Ich erwartete, dass die beiden Fragmente so groß waren, dass sie ihren Inhalt umschlossen, und es gab einen einzigen vertikalen Schieberegler, um das LinearLayout zu scrollen, das beide Fragmente enthielt.

Falls relevant, erweitern die beiden Fragmente android.preference.PreferenceFragment und definieren ihr Layout nicht in einer Layoutdatei. Stattdessen laden sie ihre Präferenz-UI wie folgt:

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

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

TIA für Ihre Hilfe.

+0

eine Lösung gefunden? – Ewoks

Antwort

6

Entfernen Sie die äußere ScrollView. Ich hatte das gleiche Problem und das hat es für mich gelöst.

Ich habe es in der Dokumentation noch nicht gefunden, aber anscheinend PreferenceFragment liefert seine eigene ScrollView um den PreferenceScreen. Irgendwie führt dies zu einer Höhe von wrap_content, die gerade groß genug ist, um das erste Element (z. B. einen Kategorie-Header) anzuzeigen.

+3

Ich habe mehrere Fragmente, die eine benutzerdefinierte SettingsActivity bilden. Wenn ich die äußere ScrollView entferne, bekomme ich einzelne vertikale Scrollbalken in jedem meiner benutzerdefinierten Einstellungsfragmente. Dies ist unerwünscht, da ich nur einen einzigen vertikalen SCroll-Balken haben möchte. Also über Lösung spricht nicht mein Bedürfnis an. Danke für Ihre Hilfe. –

+1

jede Lösung? Ich bin in einer ähnlichen Situation, in der ich normale Aktivität habe, die in ihrem Layout einige Bilder, Knöpfe, oben und unten sowie ein Fragment oder zwei in der Mitte hat. Wenn die Größe dieser Fragmente wie empfohlen 0dp ist, brauchen sie nicht so viel Platz, wie sie benötigen, aber sie sind scrollbar (einzeln). Was ich erreichen möchte, ist eigentlich den gesamten Bildschirm auf einmal zu scrollen und diese Fragmente nehmen so viel Platz ein, wie sie brauchen (so dass sie nicht separat vom gesamten Bildschirm scrollbar sind). Im Moment habe ich nur die Höhe dieser Fragmente festgelegt, um die Größe zu fixieren (zum Beispiel 300 dpi). Überhaupt nicht elegant; ( – Ewoks

5

Die Frage ist ziemlich alt, aber für den Fall, dass jemand darüber stolpert, habe ich eine Lösung gefunden. Wie bei @Ewoks erwähnt, musste ich mich auch mit einer festen Höhe begnügen (was bei variierenden dpi der Geräte nicht immer gut lief).

Aber mit Hilfe von this code gelang es mir, die Höhe Dynamik, die den Inhalt schön verpackt.

In Ihrem PreferenceFragment Klasse wie folgt vorgehen:

@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); 
     } 
    } 

} 

hoffe, das hilft jemand!

+0

Arbeitete perfekt, rettete mir Stunden des Debuggens bin ich mir sicher!Ich habe dynamisch hinzugefügte Fragmente anstelle von definierten verwendet, also können Sie für jeden, der das tut, 'LinearLayout frame = (LinearLayout) getActivity() verwenden. GetFragmentManager(). FindFragmentByTag (getPrefTag()). GetView(); Ansicht Ihres dynamischen Fragments nach Tag, wobei #getPrefTag eine benutzerdefinierte Methode ist, die einfach das definierte Tag zurückgibt, das zum Hinzufügen Ihres Fragments verwendet wurde. – JCricket

0

Versuchen Sie, den android: layout_weight in jedem Fragment auf ungefähr die Größe jeder Einstellungsliste einzustellen. Z.B.

<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"/> 
Verwandte Themen