توی اندروید استودیوی 4 به بعد باتن پیش فرض باتن متریال دیزاین هست. بنابراین اگر برای کاستوم کردن باتن از روش قبلی استفاده کنیم یعنی shape بسازیم و با اتریبیوت background بدیم باتن تغییری نمیکنه. این روش برای باتن هایی که غیر متریال هستن جواب میده.
برای حل این مشکل دو راه هست:
1. استفاده از باتن غیر متریال و shape
این باتن توی XML اینجوری فراخونی میشه:
android.widget.Button
2. استفاده از باتن متریال و کاستوم کردن باتن به صورت زیر:
app:rippleColor
: The colour to be used for the button ripple effectapp:backgroundTint
: Used to apply a tint to the background of the button. If you wish to change the background color of the button, use this attribute instead of background.
app:strokeColor
: The color to be used for the button stroke
app:strokeWidth
: The width to be used for the button strokeapp:cornerRadius
: Used to define the radius used for the corners of the button
توی معماری MVP، لایه های Model و Presenter نباید Context داشته باشن.
توی لایه Model دیتا رو از API یا دیتابیس میگیریم و ممکنه به Context نیاز پیدا کنیم.
راه حل این مشکل اینه که کلاسی که به Context نیاز داره رو توی یک لایه دیگه abstract کنیم.
اینجا بیشتر توضیح داده.
برای اینکه آیتم های ریسایکلر ویو از هم فاصله داشته باشن (معمولا آیتم ها کارد ویو هستن) در rootکه همون کارد ویو هست اتریبیوت زیر را اضافه میکنیم:
app:cardUseCompatPadding="true"
فرمت تاریخ هایی که از سروی دریافت میکنیم معمولا به صورت زیر است:
2020-03-23T13:58:53Z
T جدا کننده بوده و بیانگر اینه که در ادامه مقدار زمان آمده است. احتمالا مخفف time هست.
Z بیانگر UTC timezone هست.
این نوع بیان تاریخ استاندارد ISO 8601 است.
دو نوع BottomSheet داریم:
Persistent Bottom Sheet و Modal Bottom Sheet
Persistent Bottom Sheet
این جزئی از لیوت هست.
برای تعریف شی ای از جنس BottomSheetBehavior تعریف کرده و به صورت زیر مقدار دهی میکنیم:
برای اینکه یک فیلد سریالایز و دیسریالایز نشود، دو روش وجود دارد:
1. اون فیلد رو transient تعریف کنیم. اینجوری:
private transient Boolean isDeveloper;
در این صورت این فیلد در سریالایز وجود نخواهد داشت و در دیسریالایز حتا اگر در جیسون مقدار داشته باشد اما نال خواهد گرفت.
2. روش بهتر که استفاده از انوتیشن Expose است.
@Expose(serialize = true, deserialize = false)
private String email;
اینجا میگیم سریالایز بشه ولی دیسریالایز نشه. البته میشه آرگومان این انوتیشن رو خالی گذاشت. در این صورت هر دو کار انجام میشه.
هنگام استفاده از این انوتیشن Gson باید اینجوری تعریف شه:
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
نکته: با این روش تعریف Gson، اگر فیلدی انوتیشن Expose رو نداشته باشه، سریالایز و دیسریالایز نخواهد شد.