آموزش ButterKnife در برنامه نویسی اندروید
سلام دوستان امیدوارم حالتان خوب باشد در این سری از آموزش های برنامه نویسی اندروید به آموزش ButterKnife در برنامه نویسی اندروید می پردازیم شاید نامی آشنا برای شما نباشد از این کتاب خانه برای FindViewById راحتر استفاده می کنیم یعنی شما به راحتی می توانید آنها را Find کنید این کتاب خانه کارش Injection است view ها در اکتیویتی یا فرگمنت تزریق یا همان Inject می کند در ادامه با ما همراه باشید .
از مزیت های این کتاب خانه Cast نکردن است هرچند در Sdk 27 عمل Cast حذف شد.
ButterKnife چیست ؟
همانطور که در بالا گفتیم کار آن تزریق یا Inject تمامی View ها یا برخی از آنها در آکتیویتی یا فرگمنت است.
ابتدا باید این کتاب خان را به پروژه اضافه کنید برای این کار وارید فایل Build.gradle از نوع Module دهش سپس در بخش dependencies دو خط زیر را اضافه کنید.
1 2 3 4 5 | dependencies { // butter knife compile 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' } |
پروژه را sync کنید قند شکن فراموش نشود.
سپس در بخش بالای فایل گریدل خط زیر را اضافه کنید.
1 2 | apply plugin: 'com.android.library' apply plugin: 'com.jakewharton.butterknife' |
باید دقیقا زیر خط بالا قرار دهید.
ساده ترین نمونه Find کردن آن به شکل زیر است (یک مثال ساده در ادامه بیشتر توضیح خواهیم داد)
1 2 3 4 5 6 | class ExampleActivity extends Activity { @BindView(R2.id.user) EditText username; @BindView(R2.id.pass) EditText password; } |
آموزش Bind کردن در اکتیویتی
ابتدا در layout خود کدهای زیر را قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout 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:gravity="center_horizontal" android:orientation="vertical"> <TextView android:id="@+id/lbl_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Enter your email" android:textAllCaps="true" /> <EditText android:id="@+id/input_name" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/btn_enter" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dimen_20" android:text="@string/enter" /> </LinearLayout> |
در بالا در Linear یکسری آیتم از جمله TextView , EditTex و Button با آیدی های خاصی قرار گرفته است.
حالا بخش اکتیویتی را مشاهده کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class MainActivity extends AppCompatActivity { @BindView(R.id.lbl_title) TextView lblTitle; @BindView(R.id.input_name) EditText inputName; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // bind ButterKnife.bind(this); } @OnClick(R.id.btn_enter) public void onButtonClick(View view) { Toast.makeText(getApplicationContext(), "You have entered: " + inputName.getText().toString(), Toast.LENGTH_SHORT).show(); } } |
در بالا ابتدا با استفاده از ButterKnife تمامی View ها را Bind یا find می کنیم سپس توسط متود bind آنها را initialize می کنیم مثلا برای اینکه یک کلیک برای دکمه تعریف کنیم ابتدا آن را bind می کنیم سپس کلیک را بعد از آن تعریف می کنیم .
آموزش Bind کردن در فرگمنت
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | public class MyFragment extends Fragment { Unbinder unbinder; @BindView(R.id.lbl_name) TextView lblName; @BindView(R.id.btn_enter) Button btnEnter; @BindView(R.id.input_name) EditText inputName; public MyFragment() { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_my, container, false); unbinder = ButterKnife.bind(this, view); return view; } @Override public void onDestroyView() { super.onDestroyView(); unbinder.unbind(); } } |
در صورتی که در بالا this برای شما خطا داد باید از getactivtiy در بخش bind استفاده کنید.
یک نمونه مثال برای Bind کردن رنگ و Drawable به مثال زیر توجه کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class MainActivity extends AppCompatActivity { @BindView(R.id.logo) ImageView imgLogo; @BindView(R.id.lbl_title) TextView lblTitle; @BindDrawable(R.mipmap.ic_launcher) Drawable drawableLogo; @BindColor(R.color.colorPrimaryDark) int colorTitle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); lblTitle.setTextColor(colorTitle); imgLogo.setImageDrawable(drawableLogo); } } |
در بالا به راحتی یک عکس find شده است یا مثلا یک رنگ bind می شود و از آن استفاده می شود.
آموزش تعریف کلیک توسط ButterKnife
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @OnClick(R.id.btn_enter) public void onButtonClick(View view) { Toast.makeText(getApplicationContext(), "You have entered: " + inputName.getText().toString(), Toast.LENGTH_SHORT).show(); } @OnClick(R.id.btn_enter) public void onButtonClick() { Toast.makeText(getApplicationContext(), "You have entered: " + inputName.getText().toString(), Toast.LENGTH_SHORT).show(); } @OnClick(R.id.btn_enter) public void onButtonClick(Button button) { Toast.makeText(getApplicationContext(), "You have entered: " + inputName.getText().toString(), Toast.LENGTH_SHORT).show(); } |
Bind کردن آیتم های موجود در یک آرایه استفاده شده است این کار توسط متود Action انجام می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | public class MainActivity extends AppCompatActivity { @BindColor(R.color.colorPrimaryDark) int colorTitle; @BindViews({R.id.lbl1, R.id.lbl2, R.id.lbl3}) List<TextView> lblArray; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); final String[] lblText = new String[]{"Cat", "Dog", "Rat"}; ButterKnife.Action<TextView> APPLY_TEXT = new ButterKnife.Action<TextView>() { @Override public void apply(TextView view, int index) { view.setText(lblText[index]); } }; ButterKnife.apply(lblArray, APPLY_TEXT); ButterKnife.Action<TextView> APPLY_COLOR = new ButterKnife.Action<TextView>() { @Override public void apply(@NonNull TextView view, int index) { view.setTextColor(colorTitle); } }; ButterKnife.apply(lblArray, APPLY_COLOR); } } |
در بالا دو Action به گروهی از TextView ها اعمال می شود اولی متن از طریق یک array در TextView تنظیم یا ست می شود و دوم رنگ به گروهی از TextView ها اعمال می شود. view های ما در یک List قرار می گیرد و سپس با متود Action به صورت گروهی bind می شود.
حتی با استفاده از این کتاب خانه شما می توانید String های خود را نیز bind کنید مثل زیر
1 2 | @BindString(R.string.app_name) String appName; |
bind کردن یک dimen
1 2 | @BindDimen(R.id.padding_hori) float paddingHorizontal; |
bind کردن به عنوان یک Bitmap از یک drawable بدون حتی چند خط اضافی
1 2 | @BindBitmap(R.mipmap.ic_launcher) Bitmap logo; |
این آموزش هم به پایان رسید.
موفق و پیروز باشید.
آیا این کتاب خونه سرعت رو کاهش نمیده نسبت به خود فایند؟
سلام خیر