studio programacion para edición desarrollo desarrollar aprende aplicaciones android xml layout convenience-methods

programacion - Android: crea automáticamente variables para todas las ID en xml



programacion android pdf 2018 (4)

Noté que una de las partes más tediosas del desarrollo de Android es el diseño del diseño, incluso con el diseñador de diseños.

Después de configurar los gráficos, luego el diseño, hacer asociaciones variables con los elementos del diseño es muy tedioso, como ImageButton myButton = (ImageButton)findViewById(R.id.myButton);

en diseños más grandes, estos pueden ser tediosos de seguir (recordando los nombres de los elementos) y luego la necesidad de agregar más variables en cualquier tipo de orden se vuelve frustrante.

Para mitigar un poco esto, sería muy conveniente si todos los ID que declaré en el XML se asociaran automáticamente con sus variables adecuadas, y todos esos tipos de datos ya estuvieran incluidos en esa clase

¿Hay algo que ya hace esto?

por ejemplo si escribo

<ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/myButton" android:id="@+id/myButton"></ImageButton>

Entonces me gustaría que las clases que incluyen este diseño ya tengan

import android.ImageButton; ImageButton myButton; myButton = (ImageButton)findViewById(R.id.myButton);

¿Es este un ajuste o una característica para solicitar? Estoy usando el IDE de Eclipse y sería muy conveniente


Esa es una solicitud de función. Es muy bueno y creo que sería bastante útil; por otro lado, hay casos en los que no funcionaría muy bien, por ejemplo, si está inflando las vistas dinámicamente y no sabe, en el momento de la compilación, la vista de una Actividad en particular se inflará. Sin embargo, tiendo a pensar que este caso sería la excepción y no la regla.

La forma más sencilla de hacerlo sería codificar un script que analice los archivos XML de diseño en busca de componentes con ID y cree archivos .java con las definiciones adecuadas. Entonces, sus actividades podrían derivar de esas clases generadas automáticamente. Algo como esto:

Cuando es procesado por su script, eso genera una clase:

class FooBarLayoutActivityBase extends Activity ... { protected ImageButton myButton; FooBarLayoutActivityBase() { myButton = (ImageButton)findViewById(R.id.myButton); } }

Entonces, simplemente puede heredar de esa clase base para usar los componentes ...

El enfoque de script es simple y no requiere que profundice en el código de la cadena de herramientas, pero también puede hacerlo directamente en el complemento ADT.


Hice una herramienta para generar automáticamente el código Java para unir el diseño de XML y la lógica del programa.

Básicamente, toma un diseño XML y genera todo el código Java necesario para ti en un instante. Hay soporte para variables de miembro básicas, patrón de ViewHolder, ArrayAdapter, CursorAdapter y RoboGuice.

Puedes encontrarlo aquí: Android Layout Finder | Zumbido de android


Trate de usar las anotaciones de Android . Proporciona anotaciones útiles para reemplazar el código repetitivo.

Por ejemplo, vea la documentation @ViewById : simplemente declare los campos anotados

@ViewById EditText myEditText; @ViewById(R.id.myTextView) TextView textView;

Reemplaza

EditText myEditText; TextView textView; @Override public void onCreate(Bundle savedInstanceState) { [...] myEditText = (EditText) findViewById(R.id.myEditText); textView = (TextView) findViewById(R.id.myTextView); }


ACTUALIZACIÓN : Generador de código de enlace de vista de Android (AVB) , esto hace exactamente lo que voy a decir: |

REGEX!

Tuve el mismo problema y traté de resolverlo yo mismo, así que me convertí en REGEX dentro de la búsqueda y reemplazo de Android Studio . Personalmente, utilizo ButterKnife para la inyección de dependencias con anotación java, pero la parte más importante es cómo automatizar el procedimiento de convertir las identificaciones en diseño xml a objetos java. Es como el buscador de diseño de Android | Zumbido de Android (el sitio web tiene más características pero la respuesta anterior :() pero con el resultado de la anotación.

  1. vaya a su xml y seleccione todas las identificaciones con esta expresión regular ( /+id/.* ). Para hacerlo, primero presione Ctrl + F para abrir el panel de búsqueda, luego asegúrese de que la casilla de verificación Regex esté marcada. luego ingrese la expresión regular ( /+id/.* ) dentro del cuadro y luego presione Ctrl + Alt + Shift + J para seleccionar todas las ocurrencias. Ahora Ctrl + C para copiarlos (conoces el atajo).

por ejemplo tuve este diseño:

<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:layoutDirection="rtl" tools:context=".jobs.return_from_entrance.ReturnFromEntranceActivity" tools:ignore="HardcodedText"> <android.support.constraint.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent"> <GridLayout android:id="@+id/return_entrance_grid_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:columnCount="2" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="شماره برگشت" /> <TextView android:id="@+id/return_entrance_return_entrance_number_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="123123123" android:textColor="@android:color/black" android:textSize="18sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="@string/owner_of_cargo" /> <TextView android:id="@+id/return_entrance_owner_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="الجی" android:textColor="@android:color/black" android:textSize="18sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="تاریخ و زمان" /> <TextView android:id="@+id/return_entrance_time_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="12/12/12/ 12:12" android:textColor="@android:color/black" android:textSize="18sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="نوع حواله" /> <TextView android:id="@+id/return_entrance_kind_of_order_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="حواله" android:textColor="@android:color/black" android:textSize="18sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="خریدار" /> <TextView android:id="@+id/return_entrance_buyer_name_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="علی امیدی" android:textColor="@android:color/black" android:textSize="18sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="مقصد" /> <TextView android:id="@+id/return_entrance_destination_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="آزادی" android:textColor="@android:color/black" android:textSize="18sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="وزن ناخالص" /> <TextView android:id="@+id/return_entrance_gross_weight_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="123" android:textColor="@android:color/black" android:textSize="18sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="شماره جواز" /> <TextView android:id="@+id/return_entrance_permission_number_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="126545643" android:textColor="@android:color/black" android:textSize="18sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="شماره بارنامه" /> <TextView android:id="@+id/return_entrance_waybill_number_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="654" android:textColor="@android:color/black" android:textSize="18sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="زمان ورود" /> <TextView android:id="@+id/return_entrance_enter_time_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="21/12/12 22:22" android:textColor="@android:color/black" android:textSize="18sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="زمان خروج" /> <TextView android:id="@+id/return_entrance_exit_time_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="21/12/12 22:22" android:textColor="@android:color/black" android:textSize="18sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="محوطه بارگیری" /> <TextView android:id="@+id/return_entrance_load_location_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="حیاط" android:textColor="@android:color/black" android:textSize="18sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="نیاز به جرثقیل" /> <TextView android:id="@+id/return_entrance_is_crane_needed_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="ندارد" android:textColor="@android:color/black" android:textSize="18sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="نیاز به لیفتراک" /> <TextView android:id="@+id/return_entrance_is_forklift_needed_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="ندارد" android:textColor="@android:color/black" android:textSize="18sp" /> <CheckBox android:id="@+id/return_entrance_internal_return_entrance_checkbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/margin_large" android:layout_marginStart="@dimen/margin_medium" android:layout_marginTop="@dimen/margin_large" android:text="خروج داخلی" /> <View android:layout_width="0dp" android:layout_height="0dp" /> <CheckBox android:id="@+id/return_entrance_warehouse_delivery_checkbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/margin_large" android:layout_marginStart="@dimen/margin_medium" android:layout_marginTop="@dimen/margin_large" android:text="تحویل در انبار" /> <View android:layout_width="0dp" android:layout_height="0dp" /> <Button android:id="@+id/return_entrance_location_delivery_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/margin_large" android:text="تحویل در محل" /> <View android:layout_width="0dp" android:layout_height="0dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="عکس راننده" /> <ImageView android:id="@+id/return_entrance_driver_image_view" android:layout_width="120dp" android:layout_height="120dp" android:layout_gravity="center" android:layout_marginTop="@dimen/item_margin" android:src="@drawable/ic_account_circle_black_24dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="@string/name_of_driver" /> <TextView android:id="@+id/return_entrance_name_of_driver_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="علی امیدی" android:textColor="@android:color/black" android:textSize="18sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="@string/kind_of_car" /> <TextView android:id="@+id/return_entrance_kind_of_car_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="وانت مزدا" android:textColor="@android:color/black" android:textSize="18sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="@string/plaque" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/margin_large" android:orientation="horizontal"> <TextView android:id="@+id/return_entrance_plaque_2digit_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/plaque_background" android:padding="10dp" android:text="11" android:textColor="@android:color/black" android:textSize="10pt" android:textStyle="bold" /> <TextView android:id="@+id/return_entrance_plaque_6digit_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/plaque_background" android:padding="10dp" android:text="999ج77" android:textColor="@android:color/black" android:textSize="10pt" android:textStyle="bold" /> </LinearLayout> </GridLayout> <Button android:id="@+id/return_entrance_barcode_scan_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_margin="@dimen/margin_small" android:drawableStart="@drawable/ic_barcode" android:padding="@dimen/margin_medium" android:text="@string/scan_barcode" android:textSize="18sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/return_entrance_grid_layout" /> <android.support.v7.widget.RecyclerView android:id="@+id/return_entrance_cargo_list_recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/return_entrance_barcode_scan_button" /> <GridLayout android:id="@+id/return_entrance_bottom_grid_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:columnCount="2" android:layoutDirection="rtl" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/return_entrance_cargo_list_recycler_view"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="میزان موجودی کالای قابل تحویل" /> <TextView android:id="@+id/return_entrance_deliverable_availability_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/text_margin" android:text="50" android:textColor="@android:color/black" android:textSize="18sp" /> </GridLayout> <LinearLayout android:id="@+id/return_entrance_bottom_linear_2" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:orientation="vertical" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/return_entrance_bottom_grid_layout"> <Button android:id="@+id/return_entrance_cost_report_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/margin_medium" android:text="گزارش هزینه" /> <Button android:id="@+id/return_entrance_confirm_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/margin_medium" android:text="تایید برگشت" /> </LinearLayout> </android.support.constraint.ConstraintLayout> </android.support.v4.widget.NestedScrollView>

Un montón de vistas de texto para llenar, ¿eh?

  1. vaya a su clase java y pegue los ID copiados ( Ctrl + V ). así que tenemos un montón de identificadores que queremos convertirlos en objetos java. en nuestro ejemplo, mis identificaciones serían así:

    +id/return_entrance_grid_layout" +id/return_entrance_return_entrance_number_text_view" +id/return_entrance_owner_text_view" +id/return_entrance_time_text_view" ...

¡Es hora de encontrar y reemplazar! así que primero presionamos Ctrl + R para abrir el panel de búsqueda y reemplazo. (Asegúrese de que la casilla de verificación REGEX esté marcada) ahora voy a buscar y reemplazar para obtener el resultado ideal:

  1. Encuentre: /+id/(.*)" Reemplace con: @BindView(R.id.$1) así tendremos esto:

    @BindView(R.id.return_entrance_grid_layout) @BindView(R.id.return_entrance_return_entrance_number_text_view) @BindView(R.id.return_entrance_owner_text_view) @BindView(R.id.return_entrance_time_text_view) ...

ahora es el momento de definir cada tipo de variable y nombrarlos. mi nombre xml tiene el patrón WHERE_DESCRIPTION_WHAT , ( algo como esto ). así que para el nombre de la variable quiero eliminar la parte WHERE . y luego definir el tipo de objeto. así que, aquí vamos:

  1. Encuentre: (@BindView/(R/.id/.return_entrance_(.*)_text_view/)) Reemplace con: $1 TextView $2TextView; El resultado será:

    @BindView(R.id.return_entrance_grid_layout) @BindView(R.id.return_entrance_return_entrance_number_text_view) TextView return_entrance_numberTextView; @BindView(R.id.return_entrance_owner_text_view) TextView ownerTextView; @BindView(R.id.return_entrance_time_text_view) TextView timeTextView; @BindView(R.id.return_entrance_kind_of_order_text_view) TextView kind_of_orderTextView; ...

(solo presiona Ctrl + Alt + L para reformatear tu código) los nombres son ulgy :(. ¡Así que hacemos esto a camelCase!

  1. Buscar: TextView /b(.*)_(.*) Reemplazar con: TextView $1/u$2 y el resultado será:

    @BindView(R.id.return_entrance_owner_text_view) TextView ownerTextView; @BindView(R.id.return_entrance_time_text_view) TextView timeTextView; @BindView(R.id.return_entrance_kind_of_order_text_view) TextView kind_ofOrderTextView; @BindView(R.id.return_entrance_buyer_name_text_view) TextView buyerNameTextView; @BindView(R.id.return_entrance_destination_text_view) TextView destinationTextView;

Si repite la última parte, cualquier nombre que tenga más de un subrayado, cada _ será reemplazado con la letra mayúscula del siguiente carácter. así que en este ejemplo si hago Buscar: TextView /b(.*)_(.*) Reemplace con: TextView $1/u$2 otra vez, mi TextView kind_ofOrderTextView; será TextView kindOfOrderTextView;

Puede parecer un poco complicado, pero cuando te acostumbras, se vuelve tan rápido y se vuelve más útil. por ejemplo, imagine en un MVP , tiene un Model con los mismos nombres de String de las TextViews , por lo que puede hacer esto para configurar todos sus textos desde el Model con un enfoque similar ...