Estoy tratando de crear un fragmento en el que se establecen una serie de vistas personalizadas de forma dinámica. El contenido principal de este diseño es un RelativeLayout anidada en un LinearLayout (al centro horizontal), anidado en un ScrollView.

El RelativeLayout tiene un par de TextViews y un 9 parche ImageView que está destinado a escala con el agregado dinámicamente vistas personalizadas. Sin embargo, la imagen (achievements_bgImageView abajo) es terminar como el tamaño de la pantalla, y no está respetando el tamaño de su padre RelativeLayout incluso después he añadido la cantidad apropiada de las vistas personalizadas. La imagen de las escalas de bien, cuando yo manualmente el tamaño de achievements_mainLayout (ver el comentado líneas más abajo), pero no hace nada, si trato de dejar que RelativeLayout del wrap_content manejar su propio tamaño.

El ScrollView ESTÁ respetando el tamaño de la RelativeLayout, como todo el contenido está presente, es simplemente el imageView que no es de estiramiento para que coincida con el contenido en este punto.

Se agradece cualquier ayuda… Mi manual de cálculos, no parecen ser lo suficientemente bueno como para dar cuenta de los diferentes dispositivos, a pesar del hecho de que estoy de contabilidad para la densidad de pantalla y estoy forzar manualmente el RelativeLayout para un ancho constante.

Vale la pena señalar que la medida de tamaño de la RelativeLayout es siempre igual a la altura de la pantalla, independientemente de si o no a la suma de su contenido es mayor o menor que la altura. Así que, básicamente, WRAP_CONTENT simplemente no está haciendo lo que se supone debe hacer. Yo no tengo nada con referencia a cualquier borde de la RelativeLayout, por lo que las dependencias circulares no debería ser un problema.

fragment_achievements.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal">
<RelativeLayout
android:layout_width="320dp"
android:layout_height="wrap_content"
android:id="@+id/achievements_mainLayout">
<ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/achievements_bgImageView"
android:src="@drawable/bkg_achievements9"
android:adjustViewBounds="true"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_marginRight="8dp"
android:layout_centerHorizontal="true"
android:scaleType="fitXY"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Name Field"
android:id="@+id/achievements_nameTextView"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_marginLeft="28dp"
android:layout_marginTop="30dp"/>
<ImageView
android:layout_width="52dp"
android:layout_height="52dp"
android:id="@+id/achievements_avatarImageView"
android:layout_below="@+id/achievements_nameTextView"
android:layout_alignLeft="@+id/achievements_nameTextView"
android:src="@drawable/achieve_avatar"
android:layout_marginTop="5dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="Top Moment:"
android:id="@+id/textView2"
android:layout_alignBottom="@+id/achievements_avatarImageView"
android:layout_toRightOf="@+id/achievements_avatarImageView"
android:layout_marginBottom="16dp"
android:layout_marginLeft="4dp"
android:textSize="12dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="Me Overall:"
android:id="@+id/textView3"
android:layout_alignTop="@+id/textView2"
android:layout_alignLeft="@+id/textView2"
android:layout_marginTop="16dp"
android:textSize="12dp"/>
<TextView
android:layout_width="52dp"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="153"
android:id="@+id/achievements_totalPointsTextView"
android:gravity="center"
android:layout_alignTop="@+id/achievements_avatarImageView"
android:layout_alignRight="@+id/achievements_bgImageView"
android:layout_alignEnd="@+id/achievements_bgImageView"
android:layout_marginRight="31dp"
android:textColor="#f7a033"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Moment"
android:id="@+id/achievements_topMomentTextView"
android:layout_alignTop="@+id/textView2"
android:layout_toRightOf="@+id/textView2"
android:layout_marginLeft="5dp"
android:textSize="12dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="153"
android:id="@+id/achievements_overallTextView"
android:layout_alignTop="@+id/textView3"
android:layout_toRightOf="@+id/textView3"
android:layout_marginLeft="5dp"
android:textSize="12dp"/>
</RelativeLayout>
</LinearLayout>
</ScrollView>

AchievementFragment.java

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View fragmentView = null;
fragmentView = inflater.inflate(R.layout.fragment_achievements, container, false);
ImageView avatarImageView = (ImageView)fragmentView.findViewById(R.id.achievements_avatarImageView);
...
//Basic Achievement List Setup
RelativeLayout mainLayout = (RelativeLayout)fragmentView.findViewById(R.id.achievements_mainLayout);
AchievementRow currentRow = null;
List achievementTypeList = CampaignManager.sharedManager().sortedAchievementTypeList();
int achievementCount = achievementTypeList.size();
for (int i = 0; i < achievementCount; i++) {
AchievementType achievementType = (AchievementType)achievementTypeList.get(i);
//Every third achievement creates a new row.
if ((i % 3) == 0) {
AchievementRow row = (AchievementRow)inflater.inflate(R.layout.widget_achievementrow, null);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
if (currentRow == null) {
layoutParams.addRule(RelativeLayout.BELOW, avatarImageView.getId());
layoutParams.setMargins(10, 70, 10, 0);
} else {
layoutParams.addRule(RelativeLayout.BELOW, currentRow.getId());
layoutParams.setMargins(10, 10, 10, 0);
}
layoutParams.addRule(RelativeLayout.ALIGN_LEFT, backgroundImageView.getId());
layoutParams.addRule(RelativeLayout.ALIGN_RIGHT, backgroundImageView.getId());
row.setLayoutParams(layoutParams);
row.setId(i+1);
mainLayout.addView(row);
currentRow = row;
}
//Now setup the Button
AchievementButton achievementButton = currentRow.buttonForIndex(i % 3);
achievementButton.achievementType = achievementType;
achievementButton.setOnClickListener(achievementButtonListener);
achievementButton.setVisibility(View.VISIBLE);
CacheManager.sharedManager().fetchAchievementThumbnail(getActivity(), achievementButton, achievementType);
}
//This is the manual scaling of mainLayout
//float scale = getResources().getDisplayMetrics().density;
//float headerHeight = scale * 150.0f;
//float rowHeight = scale * 78.0f;
//ViewGroup.LayoutParams mainLayoutParams = mainLayout.getLayoutParams();
//mainLayoutParams.height = (int)(headerHeight + (Math.ceil(achievementCount /3.0) * rowHeight));
return fragmentView;
}
  • Primero de todos, usted probablemente tendrá que usar una vista de lista o vista de cuadrícula para esto. En segundo lugar, los parámetros de diseño no se aplicarán hasta después de la próxima fase de diseño. Has probado a llamar a invalidate() o requestLayout()?
  • invalidate(), requestLayout() y forceLayout() parecen hacer nada… Lo que no entiendo es que esto es todavía en onCreateView, nada ha sido elaborado o construido por el momento todos estos puntos de vista se han añadido.
InformationsquelleAutor brainfree | 2014-01-07

8 Comentarios

  1. 16

    Trate de llamar requestLayout en los niños.

    Recientemente he tenido un problema similar y fue igual de frustrado que cosas como invalida y requestLayout parecía no hacer nada. Lo que yo no entiendo es que requestLayout no se propaguen hacia abajo a sus hijos; se propaga a sus padres. Para volver a medir algo que se midió previamente, tuve que llamar requestLayout en el punto de Vista de que ha cambiado en lugar de la Vista, yo en realidad quería cambiar de tamaño.

    • este no es trabajo para mí 🙁
  2. 12

    Android NO se actualiza el diseño de puntos de vista con «wrap_content» una vez que se ha mostrado.

    Así que si usted agrega un niño ver o modificar el contenido de forma dinámica, estás jodido.
    Estoy de acuerdo en que esto es una pesadilla y un verdadero error en la interfaz de usuario Android!

    Para solucionar esto, he escrito una clase estática que vuelve a calcular los tamaños y las fuerzas de la actualización de la disposición de las vistas con «wrap_content»

    El código y las instrucciones de uso están disponibles aquí:

    https://github.com/ea167/android-layout-wrap-content-updater

    Disfrutar!

    • proporciona código de ejemplo que demuestran el uso de la biblioteca sería ENORMEMENTE útil
  3. 6

    Una forma sencilla de actualizar el tamaño de la Vista con WRAP_CONTENT es cambiar la visibilidad al PASADO y de vuelta a la vieja visibilidad.

    int visibility = view.getVisibility();
    view.setVisibility(View.GONE);
    view.setVisibility(visibility);

    PROBADO EN ANDROID JELLY BEAN EN 2014

    PUEDE NO FUNCIONAR EN LAS NUEVAS VERSIONES DE ANDROID

    • parecía demasiado bueno para ser verdad y no funcionó para mí
    • esto no funciona para mí también.
  4. 0

    Usted está recibiendo este problema porque se establece su diseño primero y luego agregar su contenido de forma dinámica.

    Que están diciendo de que el diseño se ajuste al contenido que todavía no es su. Trate de usar su diseño inflater después de haber agarrado su contenido

    • No necesito inflar el fragmento de la primera con el fin de ser capaz de encontrar el elemento que necesita para agregar a mi costumbre vistas a? O estoy mal entendido su comentario?
    • esta respuesta fue la peor sugerencia alguna vez
  5. 0

    Ok, he resuelto manualmente, la medición de la RelativeLayout inmediatamente después de añadir todos los puntos de vista y la configuración de la mainLayoutParams altura de forma explícita. Ojalá que yo era más inteligente y sabía por qué no estaba haciendo automáticamente esta correctamente en el primer lugar, pero bueno.

        ...
    mainLayout.measure(0, 0);
    ViewGroup.LayoutParams mainLayoutParams = mainLayout.getLayoutParams();
    mainLayoutParams.height = mainLayout.getMeasuredHeight() + 10;
    ...
    • por qué mainLayout.getMeasuredHeight() + 10 ? este costuras como una muy mala solución
  6. 0

    Debe utilizar NestedScrollView en Lugar de simples scrollview.
    aquí está mi muestra de la Actividad de Diseño de código

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#F0ECE6"
    >
    <android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
    <android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    app:layout_scrollFlags="scroll|enterAlways"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
    <android.support.design.widget.TabLayout
    android:id="@+id/tabs"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:tabMode="fixed"
    app:tabIndicatorHeight="6dp"
    android:layout_marginTop="-10dp"
    app:tabGravity="fill"/>
    </android.support.design.widget.AppBarLayout>
    <wsit.rentguru.utility.CustomViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"  />
    </android.support.design.widget.CoordinatorLayout>

    es aquí el código para personalizar viewpager

    public class CustomViewPager extends ViewPager {
    private boolean enabled;
    public CustomViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.enabled = false;
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
    if (this.enabled) {
    return super.onTouchEvent(event);
    }
    return false;
    }
    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
    if (this.enabled) {
    return super.onInterceptTouchEvent(event);
    }
    return false;
    }
    public void setPagingEnabled(boolean enabled) {
    this.enabled = enabled;
    }
    }

    la función de configuración para viewpager en la actividad

    private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new SampleFragment(), " ");
    viewPager.setAdapter(adapter);
    }
    class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();
    public ViewPagerAdapter(FragmentManager manager) {
    super(manager);
    }
    @Override
    public Fragment getItem(int position) {
    return mFragmentList.get(position);
    }
    @Override
    public int getCount() {
    return mFragmentList.size();
    }
    public void addFragment(Fragment fragment, String title) {
    mFragmentList.add(fragment);
    mFragmentTitleList.add(title);
    }
    @Override
    public CharSequence getPageTitle(int position) {
    return mFragmentTitleList.get(position);
    }
    }

    aquí está la muestra SampleFragment diseño de código

    <android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#F0ECE6"
    android:fillViewport="true"
    android:scrollbars="vertical"
    android:animateLayoutChanges="true"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#F0ECE6"
    android:focusableInTouchMode="true"
    >
    <Spinner
    android:id="@+id/product_category"
    android:layout_margin="20dp"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:background="@drawable/edittext_rectangle_box"
    android:gravity="center|left"
    android:textSize="14sp"
    android:paddingLeft="10dp"
    android:drawableRight="@drawable/ic_down_arrow"
    />
    <Spinner
    android:id="@+id/product_sub_category"
    android:layout_below="@+id/product_category"
    android:layout_marginRight="20dp"
    android:layout_marginLeft="20dp"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:gravity="center|left"
    android:visibility="gone"
    android:paddingLeft="10dp"
    android:background="@android:color/white"
    android:drawableRight="@drawable/ic_down_arrow"
    />
    <EditText
    android:id="@+id/product_title"
    android:layout_below="@+id/product_sub_category"
    android:layout_marginLeft="20dp"
    android:layout_marginRight="20dp"
    android:layout_marginTop="15dp"
    android:background="@android:color/white"
    android:hint="PRODUCT TITLE"
    android:singleLine="true"
    android:imeOptions="actionDone"
    android:layout_width="match_parent"
    android:gravity="center|left"
    android:padding="10dp"
    android:textSize="14sp"
    android:textColorHint="#000000"
    android:layout_height="40dp" />
    <LinearLayout
    android:id="@+id/availability_layout"
    android:layout_below="@+id/product_title"
    android:layout_marginRight="20dp"
    android:layout_marginLeft="20dp"
    android:layout_marginTop="20dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    >
    <TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/availability"
    android:textStyle="bold"
    android:paddingBottom="10dp"
    android:textSize="14sp"
    />
    <LinearLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="2">
    <Button
    android:id="@+id/from"
    android:background="@android:color/white"
    android:hint="FROM"
    android:layout_weight="1"
    android:gravity="center|left"
    android:padding="10dp"
    android:textSize="14sp"
    android:textStyle="normal"
    android:textColorHint="#000000"
    android:layout_width="0dp"
    android:layout_height="40dp"
    android:layout_marginRight="10dp"/>
    <Button
    android:id="@+id/to"
    android:background="@android:color/white"
    android:hint="TO"
    android:layout_weight="1"
    android:gravity="center|left"
    android:padding="10dp"
    android:textSize="14sp"
    android:textColorHint="#000000"
    android:layout_width="0dp"
    android:layout_height="40dp"
    android:layout_marginLeft="10dp"/>
    </LinearLayout>
    </LinearLayout>
    <LinearLayout
    android:id="@+id/product_location_layout"
    android:layout_below="@+id/availability_layout"
    android:layout_marginLeft="20dp"
    android:layout_marginRight="20dp"
    android:layout_marginTop="20dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    >
    <TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/product_location"
    android:textStyle="bold"
    android:paddingBottom="10dp"
    android:textSize="14sp"
    />
    <Spinner
    android:id="@+id/state_spinner"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:background="@drawable/edittext_rectangle_box"
    android:gravity="center|left"
    android:textSize="14sp"
    android:layout_marginBottom="10dp"
    android:drawableRight="@drawable/ic_down_arrow"
    android:paddingLeft="10dp"
    />
    <EditText
    android:id="@+id/area"
    android:background="@android:color/white"
    android:hint="Area"
    android:gravity="center|left"
    android:padding="10dp"
    android:textSize="14sp"
    android:textColorHint="#000000"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:singleLine="true"
    android:imeOptions="actionNext"
    android:layout_marginBottom="10dp"
    />
    <LinearLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="2">
    <EditText
    android:id="@+id/zipCode"
    android:background="@android:color/white"
    android:hint="Zip Code"
    android:layout_weight="1"
    android:gravity="center|left"
    android:padding="10dp"
    android:textSize="14sp"
    android:textColorHint="#000000"
    android:layout_width="0dp"
    android:layout_height="40dp"
    android:singleLine="true"
    android:imeOptions="actionNext"
    android:layout_marginRight="10dp"/>
    <EditText
    android:id="@+id/city"
    android:background="@android:color/white"
    android:hint="City"
    android:layout_weight="1"
    android:gravity="center|left"
    android:padding="10dp"
    android:textSize="14sp"
    android:singleLine="true"
    android:imeOptions="actionDone"
    android:textColorHint="#000000"
    android:layout_width="0dp"
    android:layout_height="40dp"
    android:layout_marginLeft="10dp"/>
    </LinearLayout>
    </LinearLayout>
    <Button
    android:id="@+id/tab1_next"
    android:layout_width="150dp"
    android:layout_height="40dp"
    android:text="NEXT"
    android:layout_below="@+id/product_location_layout"
    android:layout_margin="20dp"
    android:layout_alignParentRight="true"
    android:background="@color/next_button"
    android:textColor="@android:color/white"
    android:layout_marginBottom="20dp"
    />
    </RelativeLayout>
    </android.support.v4.widget.NestedScrollView>
  7. 0

    Establecer los parámetros de diseño de nuevo(anchura y altura), justo después de la adición de la vista. Esto funcionó para mí.

    si el padre de la Vista es un FrameLayout, a continuación, hacer algo como esto:

        ImageView view = (ImageView) LayoutInflater.from(activity).inflate(R.layout.image_object_view, null);
    imageObjectsHolder.addView(view);
    FrameLayout.LayoutParams param = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    view.setLayoutParams(param);
  8. 0

    Mi problema fue corregido por reseteando layout_width a algunos específicas de dp.

    Por lo que el cambio de «envoltura de contenido» o «partido de los padres»
    a

    android:layout_width="300dp"

    voluntad de arreglarlo, pero sé que no es la solución para todos los casos. Pero tal vez usted tiene algunas padre de ancho, así que usted puede aplicar el ancho para el textview.
    altura deje con wrap_content, y va a trabajar.

Dejar respuesta

Please enter your comment!
Please enter your name here