6

że posiadają aktywność, która ma Scrollview z pionowym LinearLayout który ma dwa fragmenty, które są PreferenceFragment przypadki, jak pokazano w następującym pliku układ:Scrollview> LinearLayout> PreferenceFragment jest zerowa wysokość

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

Problem polega na tym, że dwa fragmenty pojawiają się z tytułem PreferenceCategory, a rzeczywisty fragment UI jest zerowy i niewidoczny. Co dziwne, możliwe jest przewijanie każdego fragmentu indywidualnie i wyświetlanie brakującego fragmentu interfejsu. To tak, jakby każdy Fragment był wewnątrz ScrollView.

Spodziewałem się, że oba fragmenty mają rozmiar pozwalający na zawinięcie ich zawartości i istnieje jeden pionowy suwak do przewijania LinearLayout zawierającego oba fragmenty.

W przypadku, gdy jest to istotne, dwa fragmenty rozszerzają układ android.preference.PreferenceFragment i nie definiują ich układu w pliku układu. Zamiast tego ładują swój Preferencyjny interfejs użytkownika w następujący sposób:

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

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

TIA za pomoc.

+0

znalazł rozwiązanie? – Ewoks

Odpowiedz

6

Usuń zewnętrzny ScrollView. Miałem ten sam problem i to rozwiązało go dla mnie.

Nie znalazłem tego jeszcze w dokumentacji, ale najwyraźniej PreferenceFragment dostarcza własny ScrollView wokół PreferenceScreen. W pewien sposób prowadzi to do wysokości wrap_content, wystarczająco dużej, aby pokazać pierwszy element (np. Nagłówek kategorii).

+3

Mam wiele fragmentów, które tworzą niestandardową UstawieńAktywność. Jeśli usuniemy zewnętrzny ScrollView, otrzymam pojedyncze pionowe paski przewijania w każdym z moich niestandardowych fragmentów ustawień. Jest to niepożądane, ponieważ chcę tylko jednego pionowego paska przewijania. Więc powyższe rozwiązanie nie zaspokaja mojej potrzeby. Dziękuję za pomoc. –

+1

jakieś rozwiązanie? Znajduję się w podobnej sytuacji, w której mam normalną aktywność, która w swoim układzie ma kilka zdjęć, przycisków, u góry i na dole oraz fragment lub dwa w środku. Jeśli rozmiar tych fragmentów wynosi 0 dp zgodnie z zaleceniami, nie zajmują one tyle miejsca, ile potrzebują, ale są przewijane (pojedynczo). To, co chcę osiągnąć, to przewinąć cały ekran naraz, a te fragmenty zajmują tyle miejsca, ile potrzebują (więc nie można ich przewijać oddzielnie od całego ekranu). W tej chwili ustawiam tylko wysokość tych fragmentów, aby naprawić rozmiar (na przykład 300pb). Niezupełnie elegancki ( – Ewoks

5

Pytanie jest dość stare, ale na wypadek, gdyby ktoś inny natknął się na to, udało mi się znaleźć rozwiązanie. Tak jak wspomniałem @Ewoks, musiałem również zadowolić się stałą wysokością (która nie zawsze grała dobrze z różną rozdzielczością urządzeń).

Ale z pomocą this code udało mi się uzyskać dynamikę wysokości, która ładnie otula zawartość.

W swojej klasie PreferenceFragment zrobić w następujący sposób:

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

} 

Nadzieja to pomaga ktoś!

+0

Działał idealnie, zaoszczędziło mi godziny debugowania, jestem tego pewien!Używałem dynamicznie dodanych fragmentów zamiast zdefiniowanych, więc dla każdego, kto to robi, można użyć 'LinearLayout frame = (LinearLayout) getActivity(). GetFragmentManager(). FindFragmentByTag (getPrefTag()). GetView();', aby uzyskać widok twojego dynamicznego fragmentu według znacznika, gdzie #getPrefTag jest niestandardową metodą, która zwraca po prostu zdefiniowany znacznik, który został użyty do dodania twojego fragmentu. – JCricket

0

Spróbuj ustawić androida: layout_weight w każdym fragmencie z grubsza na rozmiar każdej listy ustawień. Na przykład.

<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"/> 
Powiązane problemy