ScrollView> LinearLayout> PreferenceFragment es altura cero
Tengo una actividad que tiene un ScrollView con un LinearLayout vertical que tiene dos fragmentos que son instancias de PreferenceFragment como se muestra en el siguiente archivo de diseño:
<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>
El problema es que los dos fragmentos se muestran con sólo su título PreferenceCategory y el fragmento real UI es altura cero y no visible. Curiosamente, es posible desplazar cada fragmento individualmente y ver la interfaz de fragmento faltante. Es como si cada Fragmento estuviera dentro de un ScrollView.
- LinearLayout achartengine El gráfico no se muestra en ScrollView
- Recylerview no visible dentro de scrollview o nestedScrollview
- ¿Cómo mostrar una imagen que es más grande que las dimensiones de la pantalla del teléfono?
- ScrollView distrubing ListView dentro de LinearLayout
- Cómo agregar ScrollView a GLSurfaceview en Opengl ES2.0 en Android
Lo que esperaba era que los dos fragmentos fueran dimensionados para envolver su contenido y que hubiera un único deslizador vertical para desplazar el LinearLayout que contenía ambos fragmentos.
En caso de que sea relevante, los dos fragmentos extiende android.preference.PreferenceFragment y no definen su diseño en un archivo de diseño. En su lugar, cargan su interfaz de usuario de preferencia de la siguiente manera:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Load the preferences from an XML resource addPreferencesFromResource(R.xml.pref_notification); }
TIA por su ayuda.
- Problema con webview y scrollview
- ScrollView salta a EditText
- Android: elimina sólo el efecto FadingEdge inferior de la barra de desplazamiento
- EditText, adjustPan, ScrollView problema en android
- OnScrollChanged encender varias veces para desplazarse final en scrollView
- Android No se puede eliminar el color en la parte superior e inferior
- Ver dentro de ScrollView no ocupa todo el lugar
- Android: EditText no rellenar ScrollView y RelativeLayout
Quite el ScrollView externo. Tuve el mismo problema y eso lo solucionó para mí.
No lo he encontrado en la documentación todavía, pero aparentemente el PreferenceFragment suministra su propio ScrollView alrededor de la PreferenceScreen. De alguna manera eso conduce a una altura wrap_content lo suficientemente grande para mostrar el primer elemento (por ejemplo, un encabezado de categoría).
La pregunta es bastante antigua, pero en caso de que alguien tropiece con esto, he logrado encontrar una solución. Al igual que @Ewoks mencionado, tuve que conformarme con una altura fija también (que no siempre jugaba bien con varios dpi de los dispositivos).
Pero con la ayuda de este código me las arreglé para hacer la dinámica altura, que envuelve el contenido bien.
En su clase PreferenceFragment
, haga lo siguiente:
@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); } } }
Espero que esto ayude a alguien!
Prueba a configurar el android: layout_weight en cada fragmento para que tenga aproximadamente el tamaño de cada lista de configuraciones. P.ej
<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"/>