Android Kotlin Tutorial Day 1

Android Kotlin Tutorial Day 1

Learning Objective: Let’s start with Android App Development using Kotlin. Here is your Hello World Android App using Kotlin.

FirstFragment.java

package com.example.kotlin1

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.navigation.fragment.findNavController
import com.example.kotlin1.databinding.FragmentFirstBinding

/**
 * A simple [Fragment] subclass as the default destination in the navigation.
 */
class FirstFragment : Fragment() {

    private var _binding: FragmentFirstBinding? = null

    // This property is only valid between onCreateView and
    // onDestroyView.
    private val binding get() = _binding!!

    override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
    ): View? {

        _binding = FragmentFirstBinding.inflate(inflater, container, false)
        return binding.root

    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        binding.buttonFirst.setOnClickListener {
            findNavController().navigate(R.id.action_FirstFragment_to_SecondFragment)
        }
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}

SecondFragment.java

package com.example.kotlin1

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.navigation.fragment.findNavController
import com.example.kotlin1.databinding.FragmentSecondBinding

/**
 * A simple [Fragment] subclass as the second destination in the navigation.
 */
class SecondFragment : Fragment() {

    private var _binding: FragmentSecondBinding? = null

    // This property is only valid between onCreateView and
    // onDestroyView.
    private val binding get() = _binding!!

    override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
    ): View? {

        _binding = FragmentSecondBinding.inflate(inflater, container, false)
        return binding.root

    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        binding.buttonSecond.setOnClickListener {
            findNavController().navigate(R.id.action_SecondFragment_to_FirstFragment)
        }
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}

MainActivity.java

package com.example.kotlin1

import android.os.Bundle
import com.google.android.material.snackbar.Snackbar
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.navigateUp
import androidx.navigation.ui.setupActionBarWithNavController
import android.view.Menu
import android.view.MenuItem
import com.example.kotlin1.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

    private lateinit var appBarConfiguration: AppBarConfiguration
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        setSupportActionBar(binding.toolbar)

        val navController = findNavController(R.id.nav_host_fragment_content_main)
        appBarConfiguration = AppBarConfiguration(navController.graph)
        setupActionBarWithNavController(navController, appBarConfiguration)

        binding.fab.setOnClickListener { view ->
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show()
        }
    }

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        // Inflate the menu; this adds items to the action bar if it is present.
        menuInflater.inflate(R.menu.menu_main, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        return when (item.itemId) {
            R.id.action_settings -> true
            else -> super.onOptionsItemSelected(item)
        }
    }

    override fun onSupportNavigateUp(): Boolean {
        val navController = findNavController(R.id.nav_host_fragment_content_main)
        return navController.navigateUp(appBarConfiguration)
                || super.onSupportNavigateUp()
    }
}

Android Kotlin Tutorial Day 2

Android Kotlin Tutorial Day 2

Learning Objective: Let’s start playing with Kotlin Language and do some basic operations like on button click display toast message to users, take input from edit text and display in textview and more.

Button Click Event – Display Toast Message

 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        binding.btnclickme.setOnClickListener {

            Toast.makeText(context, "Hello I am Toast :)", Toast.LENGTH_SHORT).show()
        }
    }

Read EditText Value > Convert to Integer and Do Sum

 binding.btnsum.setOnClickListener {

            var no1 = binding.et1.text.toString();
            var no2 = binding.et2.text.toString();
            var sum = no1.toInt() + no2.toInt();

            binding.tvresult.text = sum.toString();
        }

Layout Code for above ones

<?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:orientation="vertical"
    tools:context=".FirstFragment">


    <Button
        android:id="@+id/btnclickme"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click me" />

    <EditText
        android:id="@+id/et1"
        android:hint="Enter Number 1 "
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>


    <EditText
        android:id="@+id/et2"
        android:hint="Enter Number 2 "
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
        android:id="@+id/btnsum"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Sum" />

    <TextView
        android:id="@+id/tvresult"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

Move from FirstFragment to SecondFragment after 5 Seconds

   Handler().postDelayed({
            findNavController().navigate(R.id.action_FirstFragment_to_SecondFragment)

        }, 5000)

Android Kotlin Tutorial Day 3

Android Kotlin Tutorial Day 3

Learning Objective: Let’s try some most important codes like saving data into SharedPreference using Kotlin, Call Online API, and Display Static value into ListView.

SharedPreference Example

val sharedpreferences = requireContext().getSharedPreferences(
                MyPREFERENCES,
                Context.MODE_PRIVATE
            )
            val name = "Adarsh"
            val editor = sharedpreferences.edit()
            editor.putString("name", name)
            editor.commit()
            Toast.makeText(context, "Pref Saved", Toast.LENGTH_SHORT).show()

Call API Online

fun callAPI() {

        // Instantiate the RequestQueue.
        val queue: RequestQueue = Volley.newRequestQueue(context)
        val url = "https://jsonplaceholder.typicode.com/todos/1"


        // Request a string response from the provided URL.
        val stringRequest = StringRequest(
            Request.Method.GET, url,
            Response.Listener<String> { response ->

                    Log.e("cs", response)
                    try {
                        val obj = JSONObject(response)
                        Log.e("cs", obj.getString("userId"))
                        Log.e("cs", obj.getString("id"))
                        Log.e("cs", obj.getString("title"))
                        Log.e("cs", obj.getString("completed"))
                    } catch (t: Throwable) {
                        Log.e("cs", "Could not parse malformed JSON: \"" + "" + "\"")
                    }
            }, object : Response.ErrorListener {
                override fun onErrorResponse(error: VolleyError) {
                    Log.e("cs", error.toString())
                }
            })

        // Add the request to the RequestQueue.
        queue.add(stringRequest)
    }

ListView Display Items

fragment_second.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".SecondFragment">

    <!-- TODO: Update blank fragment layout -->

    <ListView
        android:id="@+id/list1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>


</LinearLayout>

SecondFragment.kt

package com.example.kotlin1

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.ListView
import androidx.fragment.app.Fragment
import com.example.kotlin1.databinding.FragmentSecondBinding


/**
 * A simple [Fragment] subclass as the second destination in the navigation.
 */
class SecondFragment : Fragment() {

    private var _binding: FragmentSecondBinding? = null
    var list1: ListView? = null
    var courses = arrayOf("BCA", "PGDCA", "MCA", "MBA")

    // This property is only valid between onCreateView and
    // onDestroyView.
    private val binding get() = _binding!!

    override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
    ): View? {

        val view: View = inflater.inflate(R.layout.fragment_second, container, false)

        list1 = view.findViewById<View>(R.id.list1) as ListView
        val arr1: ArrayAdapter<String>

        arr1 = ArrayAdapter(
            requireContext(),
            androidx.appcompat.R.layout.support_simple_spinner_dropdown_item,
            courses
        )
        list1!!.adapter = arr1

        // Inflate the layout for this fragment

        // Inflate the layout for this fragment
        return view
       /* _binding = FragmentSecondBinding.inflate(inflater, container, false)
        return binding.root*/

    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

       /* binding.buttonSecond.setOnClickListener {
            findNavController().navigate(R.id.action_SecondFragment_to_FirstFragment)
        }*/
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}