更新:Android 视图绑定 (AVB) 代码生成器,这正是我要说的:|
正则表达式!
我有同样的问题,我试图自己解决它,所以我在搜索和替换中变成了 REGEX Android Studio
。我个人使用ButterKnife进行带有 java 注释的依赖注入,但更重要的部分是如何自动化将 xml 布局中的 id 转换为 java 对象的过程。它有点像Android Layout Finder | Buzzing Android(该网站具有更多功能,但旧 :( ) 答案但带有注释结果。
- 转到您的xml并使用此正则表达式 ( ) 选择所有 id
\+id/.*
。为此,请先按Ctrl + F
打开搜索面板,然后确保选中该Regex
复选框。然后在框中输入正则表达式 ( \+id/.*
),然后按Ctrl + Alt + Shift + J
选择所有匹配项。现在Ctrl + C
复制它们(你知道快捷方式)。
例如我有这样的布局:
<?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>
很多文本视图要填充,是吧?
转到您的java类并粘贴复制的 ids( Ctrl + V
)。所以我们有一堆 id,我们想将它们更改为 java 对象。在我们的示例中,我的 id 将是这样的:
+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"
...
是时候寻找和更换了!所以首先我们点击Ctrl + R
打开查找和替换面板。(确保REGEX
选中复选框)现在我要做一些查找和替换以获得理想的结果:
Find : \+id/(.*)"
Replace with:@BindView(R.id.$1)
所以我们会有这个:
@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)
...
现在是时候定义每个变量类型并命名它们了。我的 xml 命名有WHERE_DESCRIPTION_WHAT
模式,(像这样)。所以对于变量名,我想删除该WHERE
部分。然后定义对象类型。所以我们开始:
查找:(@BindView\(R\.id\.return_entrance_(.*)_text_view\))
替换为:$1 TextView $2TextView;
结果将是:
@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;
...
(只需点击 aCtrl + Alt + L
重新格式化您的代码)名称是 ulgy :( 。所以我们对 camelCase 这样做!:
查找:TextView \b(.*)_(.*)
替换为:TextView $1\u$2
结果将是:
@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;
如果您重复最后一部分,任何具有多个下划线的名称,每个_
都将替换为下一个字符的大写。所以在这个例子中,如果我再次执行查找:TextView \b(.*)_(.*)
替换为:TextView $1\u$2
我TextView kind_ofOrderTextView;
将是TextView kindOfOrderTextView;
它可能看起来有点复杂,但是当你习惯它时,它会变得如此之快,并且变得如此有用!例如想象在一个中MVP
,你有一个Model
与 同名String
的TextViews
,所以你可以这样做以Model
用类似的方法设置他们所有的文本......