Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cómo inflar una vista en expansión con una vista de relación de aspecto fija

En mi aplicación tengo una vista de desplazamiento. Durante la vida de mi aplicación agrego dinámicamente nuevas vistas a la vista de desplazamiento. Puedo añadir las vistas con poco problema, sin embargo no puedo obtener las dimensiones de la derecha. Aquí está un bosquejo de mi disposición deseada:

Introduzca aquí la descripción de la imagen

En la imagen tengo una pantalla con dimensiones Width por Height . Contiene un HorizontalScrollView (o quizás un RecyclerView pero no estoy seguro cómo usar éste) que crecerá cuando las opiniónes se agreguen a él. Quiero que cada elemento que se agrega a la vista tenga un ancho igual a la quinta parte de la altura de la pantalla y que tenga las alturas correspondientes. Puedo hacer este trabajo si hardcode el ancho de la vista inflada, sin embargo, mi vista no será la misma relación de aspecto en todos los teléfonos.

Nota: He intentado usar un PercentRelativeLayout, pero no pude conseguir que funcione. ¿No está seguro de cómo resolver este problema … alguna idea?


Nota sobre la recompensa : Voy a aceptar las respuestas que están en Java o C # (Xamarin)! Mi proyecto está en Xamarin por lo que sería bueno si funciona para eso, o si se puede adaptar fácilmente a trabajar en C #

  • Xamarin Forms Navegación de página MasterDetail causando un accidente en android , Funciona en iOS y UWP
  • Microsoft OData Client Xamarin no funciona
  • Monodroid Google Maps v2 - La tarea "LinkAssemblies" falló inesperadamente
  • Si se crea un vínculo con un dispositivo Bluetooth LE
  • La tarea "GenerateJavaStubs" falló inesperadamente
  • Mono para Android - Arquitectura soportada - Drop x86?
  • Los puntos de interrupción y las excepciones dejaron de funcionar correctamente, xamarin android
  • Vinculación de OxyPlot a través de MVVMCross en Xamarin.Android
  • 3 Solutions collect form web for “Cómo inflar una vista en expansión con una vista de relación de aspecto fija”

    No desea que su vista quinto de la altura de la pantalla, desea que sea un quinto de la altura de la vista padre. O para ser perfectamente exacto que desea que su ancho sea un quinto de la altura de las vistas.

    La diferencia es que el uso de ancho de pantalla / altura podría funcionar en su dispositivo, pero romper en otros. ¿Qué harías si alguien abriera tu aplicación con pantalla dividida?

    Sin embargo, la definición de sus dimensiones de vista, el enfoque es el mismo: Si desea una vista que sigue algunas reglas tendrá que crear su propia y medir su vista en consecuencia.

     @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int availableHeight = MeasureSpec.getSize(heightMeasureSpec); int wantedWidth = availableHeight / 5; setMeasuredDimension(wantedWidth, availableHeight); } 

    Y eso es básicamente. Es posible que desee leer la documentación adecuada sobre MeasureSpec y medir las vistas en general. También escribí una entrada en el blog sobre las vistas personalizadas que cubren algunos conceptos básicos.

    A continuación, sólo puede agregar sus vistas personalizadas a la LinearLayout respaldo de la ScrollView y que está establecido.

    Aquí está la muestra completa que trabajará básicamente , usted puede ser que desee utilizar algo diferente que una disposición del marco.

     public class FifthWidthView extends FrameLayout { public FifthWidthView(Context context) { super(context); } public FifthWidthView(Context context, AttributeSet attrs) { super(context, attrs); } public FifthWidthView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int availableHeight = MeasureSpec.getSize(heightMeasureSpec); int wantedWidth = availableHeight / 5; setMeasuredDimension(wantedWidth, availableHeight); } } 

    Supongamos que puedes usar un ViewPager. Si es así, necesitará anular el método getPageWidth (). Este método le dice al viewpager cuán amplio debe ser cada vista dentro de él, de 0 (nada) a 1 (use all).

    Vamos a calcular un tamaño dinámico si es posible, teniendo en cuenta que queremos utilizar un poco más de un tercio de la pantalla. Supongamos que desea utilizar toda la pantalla para colecciones con un solo elemento, la mitad de la pantalla para las colecciones con dos elementos y el cálculo dinámico para todos los demás.

     @Override public float getPageWidth(int position) { try{ Paint paint = new Paint(); return 0.3f+paint.measureText(data.get(position).getSize())/ DeviceFunctions.giveScreenResolution((Activity) context).x; } catch(Exception e){ int size = data.getValues().size(); switch(size){ case 1: return 1.f; case 2: return 0.5f; case 3: return 0.33f; default: return 0.33f; } } } 

    asumimos :

    -la recopilación de datos le permite detectar el ancho deseado de su vista. Usted puede cambiar esto con cualquier referencia que usted quiera. O puede dar un tamaño fijo basado en la posición de la vista:

     @Override public float getPageWidth(int position) { int size = data.getValues().size(); switch(size){ case 1: return 0.35f; case 2: return 0.35f; case 3: return 0.30f; default: return 0.33f; } } 

    Y para obtener la resolución de pantalla:

     @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) public static Point giveScreenResolution(Activity activity){ Display display = activity.getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); return size; } 

    En uno de mi aplicación utiliza este código y funciona perfectamente bien.

      public static int getScreenHeight(Activity context) { Display display = context.getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int height = size.y; return height; } 

    En mi actividad estoy usando el código de abajo

     //Container layout may be child of HorizontalScrollView LinearLayout parent = (LinearLayout)findViewById(R.id.splash_screen_logo); //Child layout to be added View mychildview = getLayoutInflater().inflate((R.layout.childView); mychildview.getLayoutParams().width = Utils.getScreenHeight(this)/5; mychildview.getLayoutParams().height = Utils.getScreenHeight(this); parent.addview(mychildview) 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.