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: |
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.
- vaya a su xml y seleccione todas las identificaciones con esta expresión regular (
/+id/.*
). Para hacerlo, primero presioneCtrl + F
para abrir el panel de búsqueda, luego asegúrese de que la casilla de verificaciónRegex
esté marcada. luego ingrese la expresión regular (/+id/.*
) dentro del cuadro y luego presioneCtrl + Alt + Shift + J
para seleccionar todas las ocurrencias. AhoraCtrl + 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?
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:
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:
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!
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 ...