6

У меня есть деятельность, которая имеет Scrollview с вертикальной LinearLayout, который имеет два фрагмента, которые являются PreferenceFragment экземпляры, как показано в следующем файле макета:Scrollview> LinearLayout> PreferenceFragment равна нулю высота

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

Проблема состоит в том, что два фрагмента отображаются только с заголовком PreferenceCategory, а фактический фрагмент UI равен нулю и не отображается. Как ни странно, можно прокручивать каждый фрагмент индивидуально и видеть отсутствующий фрагмент интерфейса. Кажется, что каждый фрагмент находится внутри ScrollView.

Что я ожидал, так это то, что для двух фрагментов, размер которых должен быть размером, чтобы обернуть их содержимое, и есть один вертикальный слайдер для прокрутки LinearLayout, содержащего оба фрагмента.

В случае, если это важно, два фрагмента расширяют андроид.preference.PreferenceFragment и не определяют их расположение в файле макета. Вместо этого они загружают свой предпочтительный пользовательский интерфейс следующим образом:

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

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

TIA за вашу помощь.

+0

нашел какое-то решение? – Ewoks

ответ

6

Снимите внешний ScrollView. У меня была такая же проблема, и я решил это для меня.

Я еще не нашел его в документации, но, по-видимому, PreferenceFragment предоставляет собственный ScrollView вокруг PreferenceScreen. Так или иначе, это приводит к тому, что высота wrap_content достаточно велика, чтобы показать первый элемент (например, заголовок категории).

+3

У меня есть несколько фрагментов, которые составляют пользовательскую функцию SettingsActivity. Если я удалю внешний ScrollView, я получаю отдельные вертикальные полосы прокрутки в каждом из моих пользовательских фрагментов настроек. Это нежелательно, так как я просто хочу одну вертикальную панель прокрутки. Поэтому решение выше не касается моей потребности. Спасибо за вашу помощь. –

+1

любое решение? Я вхожу в аналогичную ситуацию, когда у меня нормальная активность, в которой в макете есть несколько картин, кнопок, сверху и снизу, а также фрагментов или двух посередине. Если размер этих фрагментов 0dp, как рекомендовано, они не занимают столько места, сколько им нужно, но они прокручиваются (индивидуально). То, что я хочу достичь, - это на самом деле прокрутить весь экран сразу, и эти фрагменты занимают столько места, сколько им нужно (поэтому они не прокручиваются отдельно от всего экрана). На данный момент я просто установил высоты этих фрагментов, чтобы зафиксировать размер (например, 300 дБ). Не очень элегантный ( – Ewoks

5

Вопрос довольно старый, но в случае, если кто-то другой наткнулся на это, мне удалось найти решение. Точно так же, как упоминалось @Ewoks, мне приходилось довольствоваться и фиксированной высотой (что не всегда хорошо воспроизводилось при использовании разных dpi).

Но с помощью this code Мне удалось сделать динамическую высоту, которая красиво обертывает контент.

В вашем PreferenceFragment классе сделать следующий образом:

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

} 

Надеется, что это помогает кто-то!

+0

Работал отлично, спасал мне часы отладки, я уверен!Я использовал динамически добавленные фрагменты вместо определенных, поэтому для тех, кто это делает, вы можете использовать getActivity (LinearLayout frame = (LinearLayout)) getFragmentManager(). FindFragmentByTag (getPrefTag()). GetView(); 'для получения представление вашего динамического фрагмента по тегу, где #getPrefTag - это настраиваемый метод, который просто возвращает определенный тег, который использовался для добавления вашего фрагмента. – JCricket

0

Попробуйте настроить андроид: layout_weight в каждом фрагменте примерно до размера каждого списка настроек. Например.

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