A curated android live templates to make your android development more fast🚀 and easy✨.
Live Templates are code snippets that you can insert into your code by typing their abbreviation and pressing tab.
By using them, you can quickly and intelligently add frequently used code patterns and constructs to your code, letting the IDE do the tedious work for you.
Write Only :keyboard: | You will get :sparkles: |
---|---|
:diamonds: Adapters :diamonds: | |
| kotlin
class $FILE_NAME$ : androidx.recyclerview.widget.ListAdapter<$TYPE$, $FILE_NAME$.$HOLDER_NAME$ViewHolder>(DiffCallback()) {
override fun onCreateViewHolder(parent: android.view.ViewGroup, viewType: Int): $HOLDER_NAME$ViewHolder {
val binding =
$BINDING$.inflate(
android.view.LayoutInflater.from(parent.context),
parent,
false
)
return $HOLDER_NAME$ViewHolder(binding)
}
override fun onBindViewHolder(holder: $HOLDER_NAME$ViewHolder, position: Int) {
val currentItem = getItem(position)
}
inner class $HOLDER_NAME$ViewHolder(private val binding: $BINDING$) :
androidx.recyclerview.widget.RecyclerView.ViewHolder(binding.root) {}
class DiffCallback : androidx.recyclerview.widget.DiffUtil.ItemCallback<$TYPE$>() {
override fun areItemsTheSame(oldItem: $TYPE$, newItem: $TYPE$) =
oldItem.id == newItem.id
override fun areContentsTheSame(oldItem: $TYPE$, newItem: $TYPE$) =
oldItem == newItem
}
} |
| kotlin
class $FILE_NAME$ : androidx.recyclerview.widget.RecyclerView.Adapter<$FILE_NAME$.MyViewHolder>() {
class MyViewHolder(itemView: android.view.View) : androidx.recyclerview.widget.RecyclerView.ViewHolder(itemView) {}
override fun onCreateViewHolder(parent: android.view.ViewGroup, viewType: Int): MyViewHolder {
return MyViewHolder(
android.view.LayoutInflater.from(parent.context).inflate(R.layout.$LAYOUT$, parent, false)
)
}
override fun getItemCount(): Int {
TODO("Not yet implemented")
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
TODO("Not yet implemented")
}
} |
:diamonds: View Binding :diamonds: | |
| kotlin
class $FILE_NAME$ : androidx.appcompat.app.AppCompatActivity() {
private lateinit var binding: $BINDING_LAYOUT$
override fun onCreate(savedInstanceState: android.os.Bundle?) {
super.onCreate(savedInstanceState)
binding = $BINDING_LAYOUT$.inflate(layoutInflater)
val view = binding.root
setContentView(view)
}
} |
| kotlin
class $FILE_NAME$ : androidx.fragment.app.Fragment() {
private var _binding: $BINDING_LAYOUT$? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: android.view.LayoutInflater,
container: android.view.ViewGroup?,
savedInstanceState: android.os.Bundle?
): android.view.View {
_binding = $BINDING_LAYOUT$.inflate(inflater, container, false)
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
} |
:diamonds: Retrofit Library :diamonds: | |
| kotlin
class $FILE_NAME$ {
companion object {
private val retrofit by lazy {
val logging = okhttp3.logging.HttpLoggingInterceptor()
logging.setLevel(okhttp3.logging.HttpLoggingInterceptor.Level.$TYPE$)
val client = okhttp3.OkHttpClient.Builder()
.addInterceptor(logging)
.build()
retrofit2.Retrofit.Builder()
.baseUrl($BASE_URL$)
.addConverterFactory(retrofit2.converter.gson.GsonConverterFactory.create())
.client(client)
.build()
}
val api by lazy {
retrofit.create($API_NAME$::class.java)
}
}
} |
:diamonds: Room Database :diamonds: | |
| kotlin
@androidx.room.Database(
entities = [$TABLE_NAME$::class],
version = 1,
exportSchema = false
)
@androidx.room.TypeConverters($CONVERTER_NAME$::class)
abstract class $FILE_NAME$ : androidx.room.RoomDatabase() {
abstract fun $DAO_NAME$(): $DAO_TYPE$
} |
| kotlin
@androidx.room.Database(
entities = [$TABLE_NAME$::class],
version = 1,
exportSchema = false
)
@androidx.room.TypeConverters($CONVERTER_NAME$::class)
abstract class $FILE_NAME$ : androidx.room.RoomDatabase() {
abstract fun $DAO_NAME$(): $DAO_TYPE$
companion object {
@Volatile
private var INSTANCE: $FILE_NAME$? = null
private val LOCK = Any()
fun getDatabase(context: android.content.Context): $FILE_NAME$ =
INSTANCE ?: synchronized(LOCK) {
INSTANCE
?: buildDatabase(context).also { INSTANCE = it }
}
private fun buildDatabase(context: android.content.Context) =
androidx.room.Room.databaseBuilder(
context.applicationContext,
$FILE_NAME$::class.java, "$DB_NAME$.db"
).build()
}
} |
| kotlin
import androidx.room.*
@Dao
interface $FILE_NAME$ {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert$TABLE_NAME$($VAR_NAME$: $TABLE_NAME$)
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertAll$TABLE_NAME$(vararg $VAR_NAME$s: $TABLE_NAME$)
@Update
suspend fun update($VAR_NAME$: $TABLE_NAME$)
@Delete
suspend fun delete($VAR_NAME$: $TABLE_NAME$)
@Query("SELECT * FROM $VAR_NAME$")
fun getAll$TABLE_NAME$(): List<$TABLE_NAME$>
} |
| kotlin
// List<String> <-> String
@androidx.room.TypeConverter
fun fromList(list: List<String>): String {
return com.google.gson.Gson().toJson(list)
}
@androidx.room.TypeConverter
fun toList(string: String): List<String> {
return com.google.gson.Gson().fromJson(string, object : com.google.gson.reflect.TypeToken<List<String>>() {}.type)
} |
| kotlin
// Date <-> Long
@androidx.room.TypeConverter
fun fromTimestamp(value: Long?): java.util.Date? {
return value?.let { java.util.Date(it) }
}
@androidx.room.TypeConverter
fun dateToTimestamp(date: java.util.Date?): Long? {
return date?.time?.toLong()
} |
| kotlin
// Bitmap <-> ByteArray
@androidx.room.TypeConverter
fun fromBitmap(bitmap: android.graphics.Bitmap): ByteArray {
val outputStream = java.io.ByteArrayOutputStream()
bitmap.compress(android.graphics.Bitmap.CompressFormat.PNG, 100, outputStream)
return outputStream.toByteArray()
}
@androidx.room.TypeConverter
fun toBitmap(byteArray: ByteArray): android.graphics.Bitmap {
return android.graphics.BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size)
} |
:diamonds: Dependency Injection :diamonds: | |
| kotlin
@dagger.hilt.android.HiltAndroidApp
class $FILE_NAME$ : android.app.Application() {
} |
| kotlin
@javax.inject.Singleton
@dagger.Provides
fun provideRetrofit(): retrofit2.Retrofit =
retrofit2.Retrofit.Builder()
.baseUrl($BASE_URL$)
.addConverterFactory(retrofit2.converter.gson.GsonConverterFactory.create())
.build()
@javax.inject.Singleton
@dagger.Provides
fun provide$API_NAME$(retrofit: retrofit2.Retrofit): $API$ =
retrofit.create($API$::class.java) |
| kotlin
@javax.inject.Singleton
@dagger.Provides
fun provideDatabase(
@dagger.hilt.android.qualifiers.ApplicationContext context: android.content.Context
) = androidx.room.Room.databaseBuilder(
context,
$DATABASE_CLASS$::class.java,
"$DATABASE_NAME$"
).build()
@javax.inject.Singleton
@dagger.Provides
fun provideDao(database: $DATABASE_CLASS$) = database.$METHOD$ |
:diamonds: Drawable :diamonds: | |
| kotlin
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:bottomRightRadius="10dp"
android:radius="40dp" ></corners>
<stroke
android:width="1dp"
android:color="@color/$STROKE_COLOR$" ></stroke>
<size
android:width="50dp"
android:height="50dp" ></size>
<solid android:color="@color/$SOLID_COLOR$" ></solid>
</shape> |
| kotlin
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:topLeftRadius="60dp"
android:topRightRadius="60dp" ></corners>
<size
android:width="120dp"
android:height="60dp" ></size>
<solid android:color="@color/$SOLID_COLOR$" ></solid>
</shape> |
| kotlin
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="line">
<stroke
android:width="3dp"
android:color="@color/$STROKE_COLOR$" ></stroke>
<size android:height="1dp" ></size>
</shape> |
| kotlin
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<stroke
android:width="3dp"
android:color="@color/$STROKE_COLOR$" ></stroke>
<solid android:color="@color/$SOLID_COLOR$" ></solid>
</shape> |
| kotlin
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="10dp" ></corners>
<stroke
android:width="3dp"
android:color="@color/$STROKE_COLOR$" ></stroke>
<solid android:color="@color/$SOLID_COLOR$" ></solid>
</shape> |
| kotlin
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="ring"
android:thickness="5dp"
android:useLevel="false">
<solid android:color="@color/$SOLID_COLOR$" ></solid>
</shape> |
| kotlin
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:innerRadius="0dp"
android:shape="ring"
android:thickness="100dp"
android:useLevel="false">
<solid android:color="@color/$SOLID_COLOR$" ></solid>
</shape> |
| kotlin
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/$DRAWABLE1$" android:state_pressed="true" ></item> <!-- pressed -->
<item android:drawable="@drawable/$DRAWABLE2$" android:state_focused="true" ></item> <!-- focused -->
<item android:drawable="@drawable/$DRAWABLE3$" android:state_hovered="true" ></item> <!-- hovered -->
<item android:drawable="@drawable/$DRAWABLE4$" android:state_selected="true" ></item> <!-- selected -->
<item android:drawable="@drawable/$DRAWABLE5$" android:state_checkable="true" ></item> <!-- checkable -->
<item android:drawable="@drawable/$DRAWABLE6$" android:state_checked="true" ></item> <!-- checked -->
<item android:drawable="@drawable/$DRAWABLE7$" android:state_enabled="true" ></item> <!-- enabled -->
<item android:drawable="@drawable/$DRAWABLE8$" android:state_activated="true" ></item> <!-- activated -->
<item android:drawable="@drawable/$DRAWABLE9$" android:state_window_focused="true" ></item> <!-- window_focused -->
<item android:drawable="@drawable/$DRAWABLE$" ></item> <!-- default -->
</selector> |
:diamonds: XML :diamonds: | |
| kotlin
app:layout_constraintEnd_toStartOf="@+id/$VIEWIDSTART$"
app:layout_constraintStart_toEndOf="@+id/$VIEWIDEND$" |
| kotlin
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" |
| kotlin
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" |
| kotlin
app:layout_constraintBottom_toTopOf="@+id/$VIEWIDTOP$"
app:layout_constraintTop_toBottomOf="@+id/$VIEWIDBOTTOM$" |
| kotlin
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent" |
| ```kotlin <?xml version=”1.0” encoding=”utf-8”?> </td>
</tr>
<tr></tr>
<tr>
<td colspan="2"> </td>
</tr>
<tr>
<td align="center" colspan="2">
<div name="util">
:diamonds: Util :diamonds:
</div>
</td>
</tr>
<tr>
<td colspan="2"> </td>
</tr>
<tr></tr>
<tr>
<td> <pre> util resource </pre> </td>
<td> kotlinsealed class Resource class Success class Error } </td>
</tr>
<tr></tr>
<tr>
<td> <pre> util toast </pre> </td>
<td> kotlinfun android.content.Context.toast(message: CharSequence) = android.widget.Toast.makeText(this, message, android.widget.Toast.$LENGTH$).show() </td>
</tr>
<tr></tr>
<tr>
<td colspan="2"> </td>
</tr>
<tr>
<td align="center" colspan="2">
<div name="gradle-dependencies">
:diamonds: Dependencies :diamonds:
</div>
</td>
</tr>
<tr>
<td colspan="2"> </td>
</tr>
<tr></tr>
<tr>
<td> <pre> view and data binding </pre> </td>
<td> kotlinbuildFeatures { viewBinding true dataBinding true } </td>
</tr>
<tr></tr>
<tr>
<td> <pre> view binding </pre> </td>
<td> kotlinbuildFeatures { viewBinding true } ``` |
If you have any suggestion or you want to add any other templates than ping me on
Contributions are always welcome!😇
Please read the contribution guidelines first.