0% found this document useful (0 votes)
26 views13 pages

Andoid Course Documents

Uploaded by

solgiddev
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
26 views13 pages

Andoid Course Documents

Uploaded by

solgiddev
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 13

‫‪Andoid Course :‬‬

‫فلوچارت ‪ :‬نمایش فرآیند های الگوریتم ‪ ،‬بصورت معنا دار و قابل فهم‬
‫بیضی ‪ :‬شروع و پابان ‪ -‬متوازی اال ضالع ‪ :‬ورودی ها – مستطیل ‪ :‬دستورات ‪ -‬لوزی ‪ :‬دستورات‬
‫نکته ‪ :‬در زبان کاتلین تعریف نوع متغییر چندان اهمیتی نداره و خود زبان کانتلین نوع اش را تشخیص میدهد‪.‬‬

‫دو نوع متغییر در زبان کاتلین داریم که یکی ثابت است و مقدار آن تغییر نخواهد کرد که آن ( ‪ ) Val‬و دیگری که قابل تغییر می باشد‬
‫( ‪ ) Var‬می باشد‪.‬‬

‫نکته ‪ :‬اگر بخواهیم نوع یک متغییر قابل تغییر را که منظور ( ‪ ) var‬زبان کاتلین بصورت اتوماتیک نوع آن را برای خود مشخص‬
‫می کند را مشخص کنیم بصورت زیر میتوان انجام داد ‪:‬‬

‫‪Var temp:Double = 12.3‬‬

‫نکته ‪ :‬در زبان کاتلین میتونیم نتیجه یک شرط را در یک متغییر بریزیم مانند خط زیر ‪:‬‬

‫‪Var age = 30‬‬

‫”‪var yourAge = if ( age < 10 ) “Child‬‬

‫”‪else if ( age in 10..18 ) “Young‬‬

‫”‪else “Old‬‬

‫نکته ‪ :‬ما در زبان کاتلین برای استفاده از یک رنج یا یک بازه از ( ‪ ) IN‬استفاده میکنیم مثال کد باال => ‪varable in 10 ..30‬‬

‫نحوه استفاده از ‪ When‬در زبان کاتلین‬ ‫‪-‬‬

‫‪val dayInWeek = 5‬‬

‫{ )‪val result = when (dayInWeek‬‬

‫”شنبه“ >‪1 -‬‬

‫”یکشنبه“ >‪2 -‬‬

‫”دوشنبه“ >‪3 -‬‬

‫”سه شنبه“ >‪4 -‬‬

‫”چهار شنبه“ >‪5 -‬‬

‫”پنجشنبه“ >‪6 -‬‬

‫”جمعه“ >‪7 -‬‬

‫”روز وارد شده صحیح نیست“ >‪else -‬‬

‫}‬
‫نکته ‪ Nullable :‬بودن متغییرها در زبان کاتلین به اینصورت است که ابتدا باید نوع متغییر معلوم شود و سپس جلوی نوع متغییر‬
‫معلوم شده عالمت سوال گذاشته شود مثل کد زیر‬

‫” ‪var temp : String? = “ Sadegh Solgi‬‬

‫‪temp = null‬‬

‫نکته ‪ :‬وقتی یک متغییر را تعریف میکنیم و نوع آن را اعالم نمیکنیم و مقدار نمیدهیم ولی در جای دیگر یا خط دیگر آن را میخواهیم‬
‫مقدار دهی کنیم کاتلین منیتواند بفهمد این چه نوع متغییر است باید در هنگام اعالن متغییر بدون اینکه مقدار بدهمیم باید نوع آن را‬
‫انتخاب نماییم مثل کد زیر ‪:‬‬

‫‪Var name : String‬‬

‫” ‪name = “ Mohammad Sadegh Solgi‬‬

‫تابع ‪ )( println‬اینتر میزنه میره خط بعدی در کنسولی که داریم متن چاپ میکنیم‪.‬‬ ‫‪-‬‬

‫نکته ‪ :‬ساخت لیست در زبان کاتلین به شرح زیر است ‪:‬‬

‫) ‪Var numbers = arrayOf ( 1 , 45 , 76 , 2342354‬‬

‫‪ .‬نکته ‪ :‬یک رشته لیستی از کاراکترها میباشد‬

‫نکته مهم ‪ :‬به تمامی پارامترهای ورودی یک تابع ‪ ،‬امضای تابع گفته میشودو‬
‫نکته مهم ‪ :‬هنگام تعریف وردی های یک تابع در داخل پرانتز را آرگومان میگویند و هنگام استفاده از تابع مقدار دادن به پرامترها را‬
‫آرگومان میگویند پس به عبارتی جواب هر پارمتر یک آرگومان است ‪ ،‬نام ( ‪ ) name‬یک پرامتر است ولی مقدار محمد که جلوی‬
‫پارامتر نام قرار میگیرد آن مقدار یعنی محمد یک آرگومان است‪.‬‬

‫‪Linear Layout in XML‬‬

‫نکته ‪ :‬واحد اندازه گیری در ‪ XML‬دی پی (‪ )dp‬می باشد‪.‬‬

‫‪Match_parent == double.maxinfinty in dart language‬‬

‫‪Warp_content == fix width or height self with own child‬‬

‫نکته ‪ LinearLayout :‬در ایکس ام ال (‪ )XML‬برای چیدمان آیتم ها بصورت خطی میباشد که یا خطی بصورت عمودی است یا‬
‫افقی که با ‪ Attribute‬درون خودش بنام ‪ ”android:orientation=”vertical‬عمودی و افقی آن مشخص می شود ‪.‬‬

‫نکته مهم ‪ :‬نوشتن متن در اخل فایل (‪ )XML‬اشتباه میباشد زیرا که باید متن ها را در فایل ‪ string.xml‬تعریف کرد و در داخل فایل‬
‫‪”android:text=”@string/call variable name‬‬ ‫اصلی آن ها را صدا زد ‪ .‬نحوه ی صدا زدن در فایل اصلی ‪>-‬‬

‫نکته ‪ :‬اگر میخواهیم از الیه های (‪ )XML‬استفاده کنیم بهتر است از‪ ConstraintLayout‬استفاده کنیم که این پیشنهاد خود گوگل است‬

‫مزایای که داره مانند رسپانسیو بودن و باال بودن سرعت طراحی و بهتر بودن کارایی (‪)Performance‬‬

‫نکته مهم ‪ : ** GuideLine ** :‬برای ریسپانسیو کردن خیلی خوبه و بهتر ازش استفده کنید و هنگام بیلد اپلیکییشن دیده نمی شوند‪.‬‬
SINGLE EXPRESSION FUNCTIONS :

Return In Dart Like : sayMyNameFunction ( ) => “Mohammad Sadegh Solgi”

Return In Kotlin Like : sayMyNameFunction ( ) = “Mohammad Sadegh Solgi”

Void Function In Kotlin : ex : private fun calculateSalery ( ) : Unit { … } Means Void In Kotlin

Extension Function In Kotlin ::

fun String.getAllWords ( ) : Int {

retrun this.split ( “ “ ).size

Infix Function In Kotlin :: Infix Function Kind of Extension Function , Infix should have one argument

private infix fun MyClass.getMyFullName ( family : String ) : String {

return “ ${this.name} $family ”

Other form for use infix function => myClassObject getMyFullName “ Solgi ” family argument

Remember Topics In Kotlin :

Anonymous Function -

Lambda Expression : ex 1 : format Lambda Expression : val variableName : type = { argument -> bodyCode }

Lambda Expression : ex 2 : other format Lambda Expression : val sum : (Int ,Int) -> Int = { a, b -> a + b} better than

Lambda Expression : ex 3 : other format Lambda Expression : val sum2 = { a : Int , b : Int -> a + b}

.‫ استفاده میکنیم‬it ‫ اگر یک ورودی یعنی یک آرگومان داشتیم برای استفاده از آن در هر جای مثل الگ از کلمه کلیدی‬: ‫نکته‬

Kotlin Lambda ::

Val numbers = arrayOf ( 1 , 24 , 30 , -5 , 0 , -324 , 10 , 852)

println ( numbers.filter { it <= 0 }) -> output -> [-5 , 0 , -324]

Higher Order Functions ::

: ‫ خواهیم گفت‬Higher Order ‫ شریط زیر را یک تابع داشته باشد ما به آن تابع‬3 ‫ اگر‬: ‫نکته‬
‫‪ – 1‬یک تابع دیگر را بعنوان ورودی دریافت بکنه‬

‫‪ – 2‬و یگ تابع دیگر را برگرداند یا ( ‪ ) return‬بکند‬

‫‪ – 3‬شرط اول و دوم را بصورت هم زمان انجام بدهد‬

‫‪Ex : Create High Orther Function:‬‬

‫( ‪private fun calculate‬‬

‫‪p1,‬‬

‫‪p2,‬‬

‫‪callback : ( Int , Int ) -> Unit‬‬

‫{)‬ ‫} ) ‪callback ( p1 , p2‬‬

‫‪Ex : Call High Orther Function : that’s mean : trailing lambda‬‬

‫{ ) ‪Calculate ( p1, p2‬‬

‫>‪p1 + p2 -‬‬

‫‪val sum = p1 + p2‬‬

‫) )(‪Log.e ( tag: “1080” , sum.toString‬‬

‫}‬

‫نکته ‪ :‬وراثت در شئ گرایی یکی از مزایای که ایجاد میکند ‪ reuseblity‬تابع ها یا ویژگی های یک کالس را فراهم میکند دیگر‬
‫نیاز نیست شما تابع هایی و ویژگی هایی که نوشتید را دوباره کپی کنید برای کالس دیگر و میتوانید با ارث بردن ویژگی ها و تابع ها‬
‫را داشته باشید و همچنین میتوانید بازتعریف یا بیشترتعریف بکنید‪.‬‬

‫‪ ) In Kotlin :‬سطح دسترسی ( ‪Visibility Modifiers‬‬

‫بیشترین سطح دسترسی را فراهم میکند ‪1 - public :‬‬

‫سطح دسترسی داخل ماژول را میدهد ‪2 - internal :‬‬

‫سطح دسترسی زیر کالس ها را میدهد ‪3 - protected :‬‬

‫حداقل سطح دسترسی را فراهم میکند – درحد خود کالس والغیر ‪4 – private :‬‬
‫سوال ‪ :‬چرا ما از ‪ Abstraction‬استفاده میکنیم ؟ چرا متدها و فیلدها را پیاده سازی نمیکنیم و بعدش از طریق ارث‬
‫بری آن فیلد و متد را باز تعریف کنید چرا میایم انتزاع را انتخاب میکنیم که نباید پیاده سازی اتفاق بیوفتد ؟‬
‫جواب ‪ :‬زمانی که ما یک کالس را ‪ Abstract‬میکنیم در واقع داریم یکسری قوانین را لحاظ میکنیم که تمام زیر کالس ها‬
‫و کالس های فرزند باید از این قانون تبعیت کنند ‪ ،‬یعنی اینکه باید پیاده سازی را خودشان انجام دهند‪.‬‬

‫نکته ‪ Interface :‬کالس نیست در کاتلین بلکه یک چیزی شبیه یک ‪ Listener‬است‪.‬‬

‫نکته ‪ :‬تمامی تابع های بدنه دار ( حتما باید بدنه داشته باشد ) و معمولیه داخل ‪ Interface‬از نوع ‪ public open‬میباشد و از نوع‬
‫معمولی بیرون ‪ interface‬که از نوع ‪ public final‬بودند نیست‪.‬‬

‫نکته ‪ :‬تابع های بدون بدنه در ‪interface‬ها از نوع ‪ abstract‬هستند‪.‬‬

‫نکته ‪ :‬استفاده کردن از ‪ interface‬ها در ارث بری نیاز به گذاشتن پرانتز نیست وفقط کالس ها هستند که هنگام ارث بری از پرانتز‬
‫استفده میکنند‪.‬‬

‫نکته ‪ :‬از ‪ interface‬ها نمیتوان نمونه ساخت مانند کالس های انتزاعی غیر قابل نمونه گیری هستند‪.‬‬

‫نکته ‪ :‬یک کالس فقط میتواند از یک کالس ارث بری کند و امکان ارث بری از دو کالس وجود ندارد باید بجای کالس دوم یک‬
‫‪ Interface‬ساخت و اینطوری مشکل ما حل میشود ‪.‬‬

‫نکته ‪ :‬دلیل استفاده از ‪Interface‬ها این است که ما میتوانیم از چندین ‪ interface‬ارث بری کنیم بصورت هم زمان و همچنین‬
‫میتوانیم از ‪Interface‬ها بصورت ‪Callback‬استفاده بکنیم این ‪ 2‬دلیل خوب برای استفاده از ‪Interface‬هاست‪.‬‬

‫‪Interface Callback Example :‬‬


‫( ‪Class Dowloader‬‬

‫‪var link : String ,‬‬

‫‪var downloadListener : DownloadListener‬‬

‫{)‬

‫{ ‪Init‬‬

‫) ‪downloadFromUrl ( link‬‬

‫}‬

‫{ ) ‪private fun downloadFromUrl ( link : String‬‬

‫‪downloadListener.onDownloadStart ( ) // download is starting‬‬

‫{ ) ‪for ( i in 1..10‬‬

‫) ‪Thread.sleep ( millis : 1000‬‬

‫) ‪downloadListener.onProgressUpdate (progress : i * 10‬‬

‫}‬
downloadListener.onDownloadComplete ( link )

Downloader (

link : “ http ….. … .mp4 “

object : DownloadListner {

override fun onDownloadStart ( ) {

Log.e ( tag : “ 1080 “ , msg : “ Download Started… “ )

override fun onDownloadComplete ( link : String ) {

Log.e ( tag : “ 1080 “ , msg : “ $link Download. “ )

override fun onProgressUpdate ( progress : Int ) {

Log.e ( tag : “ 1080 “ , msg : “ $link Downloading $progress % “ )

})

‫ بیش از یکبار وجود دارد پس در اینجا یک رفتار‬is – a ‫ اگر چندین کالس که از یک کالس ارث برده شده اند یعنی رابطه‬: ‫نکته‬
.‫ دارد استفادده میشود‬Polymorphism ‫چند شکلی اتفاق افتاده پس در اینجا‬

Overload In Kotlin ::

‫ میگوییم‬overload‫ براساس تشخیص زبان کاتلین از تابع زیر استفاده کند که به این‬sayMyName ‫ هنگام استفاده از تابع‬: ‫نکته‬

sayMyName ( name : “ Mohammad “ )

sayMyName ( name : “ Mohammad “ , family : “ Solgi “ )

fun sayMyName (name : String ) : String {

return name

fun sayMyName (name : String , family : String ) : String {

return name + family

}
Companion Object In Kotlin == Static In Class In Dat  companion object { define all filed in this area }

Data Class In Kotlin : its important topic

Destructuring In Kotlin ::

Ex : val ( id , name , country ) = DataClassPerson (id : “11” , name : “ Mohammad “ , country : “ Iran “ )

‫ها است منظور مقدارهای ثابتی که تغییر نمیکنند‬constant ‫ نماینده ی گروهی از‬: enum class : ‫نکته‬

‫ نمی‬const val ‫ میتواند خروجی یک تابع را بگیرد ولی در‬val ‫ این است که‬const val ‫ با‬val ‫ فرق بین متغییر از نوع‬: ‫نکته‬
.‫توان اینکار را انجام داد و فقط یک مقدار ثابت مشخص میگیرد‬

Enum Class and Sealed Class In Kotlin : its very important topic

Sealed Class Example :


sealed class MyServerData {

data class Success ( val data : String ) : MyServerData


Singleton
data class Fail ( val error : String ) : MyServerData

object Loading : MyServerData

private fun getData ( ) {

return MyServerData.Success ( 200.toString ( ) )

‫ را میتوان ازش نمونه‬success ‫ها یک نمونه ساخت ولی کالس های فرزندش یا درونش مثل‬SealedClass ‫ نمیتوان از‬: ‫نکته‬
‫ساخت‬

‫ را در کالس پیاده سازی کرد‬Delegation ‫ می توان دیزاین پترن‬by ‫ از کلمه کلیدی‬: ‫نکته‬

Lazy Delegate  val heavyWork by lazy { DoHeavyWork ( ) Or any type varable like string , int … }

this instance never called when create object from HeavyWork class

‫ یعنی یک چیزی را تحت نظر گرفتن و تغییرات آن را رصد کردن‬Observable : ‫نکته » مهم‬

Observable Delegates  var temp : Int by Delegates.obserable( initialValue: 25)


Scope Functions :
fun context object return value
let ----------> it----------> lambda result ( avoiding crashing when there is null value )
run ----------> this ----------> lambda result (let and with together = run)
with ----------> this ----------> lambda result (can return value in a variable )
apply ----------> this ----------> context object
also ----------> it ----------> context object (use for modifying any object )

lateinit var In Kotlin == late variable in Dart

Jetpack Compose :

Text (
text = buildAnnotatedString {
withStyle (
style = SpanStyle (
color = Color.Black,
fontSize = 50.sp
)
){
append ( “ J ” )
}
append ( “ etpack ” )
},
color = Color ( 0x + 2number Alfa + 2number Red + 2number Green + 2number Blue )
fontSize = 30.sp , fontWeight = FontWeight.Bold ,fontStyle = FontStyle.Italic, textAlign = TextAlign.start,
textDexoration = TextDecoration.LineThrough

jetpack compose ‫ یا همان رابطه کاربری با استفاده از‬UI ‫ یعنی ترسیم مجدد‬Recomposition : ‫نکته‬

State In Kotlin :: change value by state

Var clickState by remember { mutableStateOf ( value: true ) }

onClick = { clickState = !clickState }

‫ () را اضافه میکنیم و برای به یاد‬verticalScroll. ‫ها میایم‬Modifier ‫ در قسمت‬Column ‫ یک‬Scroll ‫ برای فعال کردن‬: ‫نکته‬
: ‫ ( ) را درونش اضافه کنید بدین شکل زیر‬rememberScrollState ‫ باید‬scroll ‫داشتن وضعیت‬
Column ( Modifier.verticalScroll ( rememberScrollState ( ) ) ) { …. }

Image (
painter = painterResource (
id = R.drawable.imageName ,contentDescription = “” , contentScale = ContentScale.FillBounds,
)

Create Controller For TextFiled In Kotlin ::

var textController by remember { mutableStateOf (TextFieldValue (text : “ Sadegh Solgi ”))}

: ‫ استفاده میکنیم به نام‬activity ‫ برای باال نگه داشتن اسنک بار وقتی که کیبورد باالست از ویژگی در‬: ‫نکته‬

Android : windowSoftInputMode = “ adjustResize ”

: ‫ به شکل زیر عمل میکنیم‬Scaffold ‫برای استفاده از اسنک بار در‬ -

val scaffoldState = rememberScaffoldState ( )

val scope = rememberCoroutineScope ( )

onClick { scope.launch { scaffoldState.snackbarHostState.showSnackbar ( msg :“ message type … “)} }

.verticalScroll ( rememberScrollState() ) :: for scrolling in Kotlin

ListView In Dart == LazyRow Or Column In Kotlin


LazyRow () OR

LazyColumn () {

ItemsIndexed (

listOf( “ a ” , … )

){

Index , text  CardItem (name = text )

}
Step To Implement Constraint Layout In Kotlin ::

1 – implementation ‘androidx.constraintlayout:constraintlayout-compose:1.0.1’

2 – val constraint = constraintSet {

Var greenBox = createRefFor ( id : “ greenBox “)

Var redBox = createRefFor ( id : “ redBox “)

Constrain ( greenBox ) {

top.linkTo ( parent.top )

start.linkTo ( parent.top )

width = Dimension.value ( 100.dp )

height = Dimension.value ( 100.dp )

Constrain (redBox) {

top.linkTo ( parent.top )

start.linkTo ( parent.top )

width = Dimension.value ( 100.dp )

height = Dimension.value ( 100.dp )

3 – ConstraintLayout ( constraint , modifier = Modifier.fillMaxSize () ) {

Box ( modifier = Modifer.background(Color.Green).layoutId(“greenBox”)) {}

Box ( modifier = Modifer.background(Color.Red).layoutId(“redBox”)) {}

}
GridView In Dart == LazyVerticalGrid In Kotlin
LazyVerticalGrid (

Cells = GridCelss.Adaptive ( 150.dp)

contentPadding = PaddingValues ( 4.dp )

content = {

items ( count :450 ) {

BoxCardItem ( … )

}})
Shortcut Kotlin Language :

( Ctrl + Shift + / ) ----> Multi Line Comment Or Uncomment

( Ctrl + Alt + L ) ----> Sort code appearance

You might also like