<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: kaggle_study</title>
    <description>The latest articles on DEV Community by kaggle_study (@kaggle_study).</description>
    <link>https://dev.to/kaggle_study</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F810492%2F826a2574-047b-4a58-8969-e87ddf40a50a.png</url>
      <title>DEV Community: kaggle_study</title>
      <link>https://dev.to/kaggle_study</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kaggle_study"/>
    <language>en</language>
    <item>
      <title>[Android Studio|Kotlin] View</title>
      <dc:creator>kaggle_study</dc:creator>
      <pubDate>Sun, 27 Feb 2022 06:20:09 +0000</pubDate>
      <link>https://dev.to/kaggle_study/android-studiokotlin-view-2i5p</link>
      <guid>https://dev.to/kaggle_study/android-studiokotlin-view-2i5p</guid>
      <description>&lt;p&gt;&lt;strong&gt;basic Setting&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    buildFeatures {
        viewBinding = true
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;1) custom View&lt;/strong&gt;&lt;br&gt;
[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {
    val binding by lazy {ActivityMainBinding.inflate(layoutInflater)}
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        val customView = CustomView(this)
        binding.frameLayout.addView(customView)
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[CustomView.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class CustomView(context: Context) : View(context) {
    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)

        val paint = Paint()
        paint.color = Color.BLACK
        paint.textSize = 100f

        canvas?.run {
            drawText("Hello", 0f, 100f, paint)
            customDrawCircle(canvas)
            customDrawRect(canvas)
        }
    }
    fun customDrawCircle(canvas:Canvas) {
        val paint = Paint()
        paint.style = Paint.Style.FILL
        paint.color = Color.BLUE

        canvas.drawCircle(150f, 300f, 100f, paint)
    }
    fun customDrawRect(canvas: Canvas) {
        val paint = Paint()
        paint.style = Paint.Style.STROKE
        paint.strokeWidth = 20f
        paint.color = Color.GREEN

        val rect = RectF(50f, 450f, 250f, 650f)
        canvas.drawRect(rect, paint)
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[activity_main.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;androidx.constraintlayout.widget.ConstraintLayout
&amp;lt;TextView /&amp;gt;
&amp;lt;FrameLayout /&amp;gt;
&amp;lt;/androidx.constraintlayout.widget.ConstraintLayout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2) custom Widget&lt;/strong&gt;&lt;br&gt;
[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {
    val binding by lazy {ActivityMainBinding.inflate(layoutInflater)}
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[CustomText.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class CustomText : AppCompatTextView {
    constructor(context: Context) : super(context) { }
    constructor(context: Context, attrs:AttributeSet) : super(context, attrs) {
        val attrList = context.obtainStyledAttributes(attrs, R.styleable.CustomText)
        for(i in 0 until attrList.indexCount) {
            val attr = attrList.getIndex(i)
            when(attr) {
                R.styleable.CustomText_delimeter -&amp;gt; {
                    attrList.getString(attr)?.let {
                        process(it)
                    }
                }
            }
        }
    }
    constructor(context: Context, attrs:AttributeSet, defStyleAttr:Int) : super(context, attrs, defStyleAttr ) {}
    fun process(delimeter: String) {
        if(text.length == 8) {
            val first4 = text.substring(0,4)
            val mid2 = text. substring(4,6)
            val last2 = text.substring(6)

            text = "$first4$delimeter$mid2$delimeter$last2"
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[res &amp;gt; values &amp;gt; attrs.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;resources&amp;gt;
    &amp;lt;declare-styleable name="CustomText"&amp;gt;
        &amp;lt;attr name="delimeter" format="string"/&amp;gt;
    &amp;lt;/declare-styleable&amp;gt;
&amp;lt;/resources&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[activity_mains.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;androidx.constraintlayout.widget.ConstraintLayout
&amp;lt;com.example.myapplication.CustomText
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="20220226"
 app:delimeter="-"/&amp;gt;
&amp;lt;/androidx.constraintlayout.widget.ConstraintLayout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3-1) ViewPager &amp;amp; TabLayout&lt;/strong&gt;&lt;br&gt;
[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {
    val binding by lazy {ActivityMainBinding.inflate(layoutInflater)}
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        val list = listOf(FragmentA(), FragmentB(), FragmentC(), FragmentD() )
        // create adapter
        val pagerAdapter = FragmentPagerAdapter(list, this)
        // connect adapter and viewpager
        binding.viewPager.adapter = pagerAdapter

        // Create a list of titles as many as the number of tab menus
        val titles = listOf("A", "B", "C", "D")
        // connect TabLayout ViewPager2
        TabLayoutMediator(binding.tabLayout, binding.viewPager) { tab, position -&amp;gt;
            tab.text = titles.get(position)
        }.attach()
    }
}

class FragmentPagerAdapter(val fragmentList:List&amp;lt;Fragment&amp;gt;, fragmentActivity: FragmentActivity)
    : FragmentStateAdapter(fragmentActivity) {
    override fun getItemCount() = fragmentList.size
    override fun createFragment(position: Int) = fragmentList.get(position)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;create [FragmentA.kt], [FragmentB.kt], [FragmentC.kt], [FragmentD.kt]&lt;br&gt;
create with ([fragment_a.xml], [fragment_b.xml], [fragment_c.xml], [fragment_d.xml],)&lt;br&gt;
[activity_main.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;androidx.constraintlayout.widget.ConstraintLayout 
&amp;lt;androidx.viewpager2.widget.ViewPager2 android:id="@+id/viewPager"
&amp;lt;com.google.android.material.tabs.TabLayout android:id="@+id/tabLayout"
&amp;lt;androidx.constraintlayout.widget.ConstraintLayout 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4) tablayout, viewpager and recyclerview&lt;/strong&gt;&lt;br&gt;
[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {
    val binding by lazy {ActivityMainBinding.inflate(layoutInflater)}
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        val list = listOf("MON", "TUE", "WED","THR", "FRI","SAT","SUN")
        // create adapter
        val pagerAdapter = CustomPagerAdapter(list)
        // connect adapter and viewpager
        binding.viewPager.adapter = pagerAdapter
        //Create a list of tab titles - skip
        // connect tablayout and viewpager
        TabLayoutMediator(binding.tabLayout, binding.viewPager) { tab, position -&amp;gt;
            tab.text = list.get(position)
        }.attach()
    }
}
class CustomPagerAdapter(val textList:List&amp;lt;String&amp;gt;) : RecyclerView.Adapter&amp;lt;CustomPagerAdapter.Holder&amp;gt;() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
        val binding = ItemViewpagerBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return Holder(binding)
    }
    override fun getItemCount() = textList.size
    override fun onBindViewHolder(holder: Holder, position: Int) {
        holder.setItem(textList.get(position))
    }
    class Holder(val binding:ItemViewpagerBinding) : RecyclerView.ViewHolder(binding.root) {
        fun setItem(text:String) {
            binding.textView.text = text
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[activity_main.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;androidx.constraintlayout.widget.ConstraintLayout
&amp;lt;com.google.android.material.tabs.TabLayout android:id="@+id/tabLayout"
&amp;lt;/com.google.android.material.tabs.TabLayout
&amp;lt;androidx.viewpager2.widget.ViewPager2 android:id="@+id/viewPager"
/&amp;gt;
&amp;lt;/androidx.constraintlayout.widget.ConstraintLayout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[item_viewpager.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;androidx.constraintlayout.widget.ConstraintLayout
&amp;lt;TextView android:id="@+id/textView"
&amp;lt;/androidx.constraintlayout.widget.ConstraintLayout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5) tablayout, viewpager and recyclerview&lt;/strong&gt;&lt;br&gt;
[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {
    val binding by lazy {ActivityMainBinding.inflate(layoutInflater)}
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        val list = loadData()
        // create adapter
        val pagerAdapter = CustomPagerAdapter(list)
        // connect adapter and viewpager
        binding.viewPager.adapter = pagerAdapter
        //Create a list of tab titles
        val titles = listOf("MON", "TUE", "WED","THR", "FRI","SAT","SUN")
        // connect tablayout and viewpager
        TabLayoutMediator(binding.tabLayout, binding.viewPager) { tab, position -&amp;gt;
            tab.text = titles.get(position)
        }.attach()
    }
    fun loadData() : List&amp;lt;Page&amp;gt; {
        val pageList = mutableListOf&amp;lt;Page&amp;gt;()
        pageList.add(Page(1, "Cloudy"))
        pageList.add(Page(2, "Clear"))
        pageList.add(Page(3, "Cloud"))
        pageList.add(Page(4, "Rain"))
        pageList.add(Page(5, "Snow"))
        pageList.add(Page(6, "Typhoon"))
        pageList.add(Page(7, "Fog"))
        return pageList
    }
}
class CustomPagerAdapter(val pageList:List&amp;lt;Page&amp;gt;) : RecyclerView.Adapter&amp;lt;CustomPagerAdapter.Holder&amp;gt;() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
        val binding = ItemViewpagerBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return Holder(binding)
    }
    override fun getItemCount() = pageList.size
    override fun onBindViewHolder(holder: Holder, position: Int) {
        holder.setItem(pageList.get(position))
    }
    class Holder(val binding:ItemViewpagerBinding) : RecyclerView.ViewHolder(binding.root) {
        fun setItem(page:Page) {
            with(binding) {
                textDay.text = "${page.day} DAY"
                textWeather.text = page.weather
            }
        }
    }
}
data class Page(val day:Int, val weather:String)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[activity_main.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;androidx.constraintlayout.widget.ConstraintLayout
&amp;lt;com.google.android.material.tabs.TabLayout android:id="@+id/tabLayout"
&amp;lt;androidx.viewpager2.widget.ViewPager2 android:id="@+id/viewPager"
&amp;lt;/androidx.constraintlayout.widget.ConstraintLayout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[item_viewpager.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;androidx.constraintlayout.widget.ConstraintLayout
&amp;lt;TextView android:id="@+id/textDay"
&amp;lt;TextView android:id="@+id/textWeather"
&amp;lt;/androidx.constraintlayout.widget.ConstraintLayout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;6) add tablayout,viewpager, recyclerView and retrofit&lt;/p&gt;

&lt;p&gt;[app &amp;gt; manifests &amp;gt; AndroidManifest.xml ]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;uses-permission android:name="android.permission.INTERNET"/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[Gradle Scripts &amp;gt; build.gradle]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dependencies {
    // fragment
    implementation "androidx.fragment:fragment-ktx:1.4.1"
    // retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {
    val binding by lazy { ActivityMainBinding.inflate(layoutInflater)}
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        // 1. load page data
        val list = listOf( FragmentA(), FragmentB(), FragmentC() )
        // 2. create adapter
        val pagerAdapter = FragmentPagerAdapter(list, this)
        // 3. connect adapter and viewpager
        binding.viewPager.adapter = pagerAdapter

        // Create a list of titles as many as the number of tab menus
        val titles = listOf("tabname1", "tabname2", "tabname3" )
        // connect TabLayout ViewPager2
        TabLayoutMediator(binding.tabLayout, binding.viewPager) { tab, position -&amp;gt;
            tab.text = titles.get(position)
        }.attach()
    }
}
class FragmentPagerAdapter(val fragmentList:List&amp;lt;Fragment&amp;gt;, fragmentActivity: FragmentActivity)
    : FragmentStateAdapter(fragmentActivity) {
    override fun getItemCount() = fragmentList.size
    override fun createFragment(position: Int) = fragmentList.get(position)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[ApiService.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface ApiService {
    @GET("/apptech")
    fun getPosts(): Call&amp;lt;MutableList&amp;lt;Apptech&amp;gt;&amp;gt;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[ServiceGenerator.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;object ServiceGenerator {
    private val client = OkHttpClient.Builder().build()
    private val retrofit = Retrofit.Builder()
        .baseUrl("https://****.herokuapp.com")
        .addConverterFactory(GsonConverterFactory.create())
        .client(client)
        .build()

    fun &amp;lt;T&amp;gt; buildService(service: Class&amp;lt;T&amp;gt;): T {
        return retrofit.create(service)
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[Apptech.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data class Apptech(
    val apptech_brand: String? = null,
    val apptech_title: String? = null,
    val apptech_period: String? = null,
    val apptech_point: Int? = null,
    val apptech_time: String? = null,
    val apptech_url: String? = null
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[ApptechAdapter.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class ApptechAdapter(val apptechData: MutableList&amp;lt;Apptech&amp;gt;) : RecyclerView.Adapter&amp;lt;ApptechAdapter.Holder&amp;gt;() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
        val binding = FragmentBItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return Holder(binding)
    }
    override fun getItemCount() = apptechData.size
    override fun onBindViewHolder(holder: Holder, position: Int) {
        //val apptech = apptechData.get(position)
        //holder.setApptech(apptech)
        return holder.setApptech(apptechData[position])
    }
    class Holder(val binding: FragmentBItemBinding) : RecyclerView.ViewHolder(binding.root) {
        fun setApptech(apptech: Apptech) {
            with(binding) {
                tvTitle.text = "${apptech.apptech_brand}"
                tvBody.text = "${apptech.apptech_title}"
                tvTime.text = "${apptech.apptech_time}"

                binding.root.setOnClickListener {
                    var url = "${apptech.apptech_url}"
                    val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
                    ContextCompat.startActivity(itemView.context, intent, null)
                }
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[FragmentA.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class FragmentA : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_a, container, false)
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[FragmentB.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class FragmentB : Fragment() {
    lateinit var binding: FragmentBBinding
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = FragmentBBinding.inflate(inflater, container, false)
        return binding.root
    }
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val serviceGenerator = ServiceGenerator.buildService(ApiService::class.java)
        val call = serviceGenerator.getPosts()
        call.enqueue(object : Callback&amp;lt;MutableList&amp;lt;Apptech&amp;gt;&amp;gt; {
            override fun onResponse(call: Call&amp;lt;MutableList&amp;lt;Apptech&amp;gt;&amp;gt;, response: Response&amp;lt;MutableList&amp;lt;Apptech&amp;gt;&amp;gt;) {
                with(binding){
                    recyclerView.apply{
                        adapter = ApptechAdapter(response.body()!!)
                        layoutManager = LinearLayoutManager(activity)
                    }
                }
            }
            override fun onFailure(call: Call&amp;lt;MutableList&amp;lt;Apptech&amp;gt;&amp;gt;, t: Throwable) {
                t.printStackTrace()
                Log.e("error", t.message.toString())
            }
        })
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[FragmentC.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class FragmentC : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? { 
        return inflater.inflate(R.layout.fragment_c, container, false)
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[activity_main.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity"&amp;gt;

    &amp;lt;com.google.android.material.tabs.TabLayout
        android:id="@+id/tabLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"&amp;gt;

        &amp;lt;com.google.android.material.tabs.TabItem
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Monday" /&amp;gt;

        &amp;lt;com.google.android.material.tabs.TabItem
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Tuesday" /&amp;gt;

        &amp;lt;com.google.android.material.tabs.TabItem
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Wednesday" /&amp;gt;
    &amp;lt;/com.google.android.material.tabs.TabLayout&amp;gt;

    &amp;lt;androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tabLayout" /&amp;gt;
&amp;lt;/androidx.constraintlayout.widget.ConstraintLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[fragment_a.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;androidx.constraintlayout.widget.ConstraintLayout 
&amp;lt;\androidx.constraintlayout.widget.ConstraintLayout 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[fragment_b.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;FrameLayout 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"
    tools:context=".fragment.FragmentB"&amp;gt;
    &amp;lt;androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" /&amp;gt;
&amp;lt;/FrameLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[fragment_b_item.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:tools="http://schemas.android.com/tools"
    android:paddingTop="8dp"
    android:paddingBottom="8dp"
    android:paddingLeft="15dp"
    android:layout_marginTop="4dp"
    android:layout_marginBottom="4dp"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="8dp"
    android:orientation="horizontal"
    android:background="@drawable/border_a"&amp;gt;

    &amp;lt;TextView
        android:id="@+id/tvTitle"
        tools:text="Hello Title"
        android:layout_width="80dp"
        android:layout_height="match_parent"
        android:textColor="@color/black"
        android:textSize="20sp" /&amp;gt;

    &amp;lt;LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:paddingLeft="15dp"
        android:paddingRight="15dp" &amp;gt;

        &amp;lt;TextView
            android:id="@+id/tvBody"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="14sp"
            tools:text="Hello Body"
            android:textAlignment="center"/&amp;gt;

        &amp;lt;TextView
            android:id="@+id/tvTime"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textSize="14sp"
            tools:text="Hello Time"
            android:textAlignment="center"/&amp;gt;
    &amp;lt;/LinearLayout&amp;gt;
&amp;lt;/LinearLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[fragment_c.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;FrameLayout
&amp;lt;\FrameLayout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[res &amp;gt; drawable &amp;gt; border_a.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;shape xmlns:android="http://schemas.android.com/apk/res/android"&amp;gt;
    &amp;lt;solid android:color="#FFD0D0"&amp;gt;&amp;lt;/solid&amp;gt;
    &amp;lt;stroke android:width="3dp" android:color="#FF8484"/&amp;gt;
    &amp;lt;corners android:radius="15dp"/&amp;gt;
&amp;lt;/shape&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>[Android Studio|Kotlin] Containers, Create a list</title>
      <dc:creator>kaggle_study</dc:creator>
      <pubDate>Sun, 27 Feb 2022 00:49:25 +0000</pubDate>
      <link>https://dev.to/kaggle_study/android-studiokotlin-containers-create-a-list-24df</link>
      <guid>https://dev.to/kaggle_study/android-studiokotlin-containers-create-a-list-24df</guid>
      <description>&lt;p&gt;&lt;strong&gt;1) spinner&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {
    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        var data = listOf("-do choice", "1","2","3","4","5","6","7","8")
        var adapter = ArrayAdapter&amp;lt;String&amp;gt;(this, android.R.layout.simple_list_item_1, data)
        with(binding) {
            spinner.adapter = adapter
            spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
                override fun onNothingSelected(p0: AdapterView&amp;lt;*&amp;gt;?) {
                }
                override fun onItemSelected(p0: AdapterView&amp;lt;*&amp;gt;?, p1: View?, p2: Int, p3: Long) {
                    result.text = data.get(p2)
                }
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[activity_main.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;TextView android:id="@+id/result"
&amp;lt;Spinner android:id="@+id/spinner"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2) RecyclerView&lt;/strong&gt;&lt;br&gt;
[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {
    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        val data = loadMemoList()
        var adapter = CustomAdapter(data)
        binding.recyclerView.adapter = adapter
        binding.recyclerView.layoutManager = LinearLayoutManager(this)
    }


    fun loadMemoList(): MutableList&amp;lt;Memo&amp;gt; {
        val memoList = mutableListOf&amp;lt;Memo&amp;gt;()
        for (no in 0..100) {
            val title = "it is kotlin android ${no + 1}"
            val date = System.currentTimeMillis()
            var memo = Memo(no, title, date)
            memoList.add(memo)
        }
        return memoList;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[activity_main.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;androidx.constraintlayout.widget.ConstraintLayout
&amp;lt;androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView"
&amp;lt;androidx.constraintlayout.widget.ConstraintLayout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[CustomAdapter.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class CustomAdapter(var listData:MutableList&amp;lt;Memo&amp;gt;) : RecyclerView.Adapter&amp;lt;CustomAdapter.Holder&amp;gt;() {
    //var listData = mutableListOf&amp;lt;Memo&amp;gt;()
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
        val binding = ItemRecyclerBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return Holder(binding)
    }
    override fun getItemCount() = listData.size
    override fun onBindViewHolder(holder: Holder, position: Int) {
        val memo = listData.get(position)
        holder.setMemo(memo)
    }
    class Holder(val binding: ItemRecyclerBinding) : RecyclerView.ViewHolder(binding.root) {
        lateinit var currentMemo: Memo
        init {
            binding.root.setOnClickListener {
                Toast.makeText(binding.root.context, "clicked item : ${currentMemo.title}", Toast.LENGTH_SHORT).show()
            }
        }
        fun setMemo(memo: Memo) {
            currentMemo = memo
            with(binding) {
                textNo.text = "${memo.no}"
                textTitle.text = "memo.title"

                var sdf = SimpleDateFormat("yyyy/MM/dd")
                var formattedDate = sdf.format(memo.timestamp)
                textDate.text = formattedDate
            }
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[item_recycler.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:gravity="center_vertical"
    android:orientation="horizontal"&amp;gt;

    &amp;lt;TextView
        android:id="@+id/textNo"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="01" /&amp;gt;

    &amp;lt;TextView
        android:id="@+id/textTitle"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="5"
        android:text="title" /&amp;gt;

    &amp;lt;TextView
        android:id="@+id/textDate"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:text="2020-01-01" /&amp;gt;
&amp;lt;/LinearLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[Memo.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data class Memo(
    var no: Int,
    var title: String,
    var timestamp:Long
    )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3) add Fragment to Activity&lt;/strong&gt;&lt;br&gt;
[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {
    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        setFragment()
    }
    fun setFragment() {
        val listFragment: ListFragment = ListFragment()
        val transaction = supportFragmentManager.beginTransaction()
        transaction.add(R.id.frameLayout, listFragment)
        transaction.commit()
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[ListFragment.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class ListFragment : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? { 
        return inflater.inflate(R.layout.fragment_list, container, false)
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[activity_main.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;androidx.constraintlayout.widget.ConstraintLayout 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:visibility="visible"
    tools:context=".MainActivity"&amp;gt;

    &amp;lt;TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="Activity"
        android:visibility="visible"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" /&amp;gt;

    &amp;lt;androidx.fragment.app.FragmentContainerView
        android:id="@+id/frameLayout"
        android:name="com.example.myapplication.ListFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView2"
        tools:layout="@layout/fragment_list" /&amp;gt;

&amp;lt;/androidx.constraintlayout.widget.ConstraintLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[fragment_list.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;androidx.constraintlayout.widget.ConstraintLayout
    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"
    tools:context=".ListFragment"&amp;gt;

    &amp;lt;TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/title_list"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" /&amp;gt;

    &amp;lt;Button
        android:id="@+id/btnNext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:text="NEXT"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" /&amp;gt;

&amp;lt;/androidx.constraintlayout.widget.ConstraintLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4) Fragment screen transition&lt;/strong&gt;&lt;br&gt;
[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {
    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
    val listFragment by lazy { ListFragment() }
    val detailFragment by lazy { DetailFragment() }

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

        setFragment()
    }
    fun setFragment() {
        val transaction = supportFragmentManager.beginTransaction()
        transaction.add(R.id.frameLayout, listFragment)
        transaction.commit()
    }

    fun goDetail() {
        val transaction = supportFragmentManager.beginTransaction()
        transaction.add(R.id.frameLayout, detailFragment)
        transaction.addToBackStack("detail")
        transaction.commit()
    }
    fun goBack() {
        onBackPressed()
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[ListFragment.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class ListFragment : Fragment(R.layout.fragment_list) {
    lateinit var mainActivity:MainActivity
    lateinit var binding: FragmentListBinding

    override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
    ): View? {
        binding = FragmentListBinding.inflate(inflater,container,false)
        binding.btnNext.setOnClickListener { mainActivity?.goDetail()}
        return binding.root
    }
    override fun onAttach(context: Context) {
        super.onAttach(context)
        if(context is MainActivity) mainActivity = context
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[DetailFragment.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class DetailFragment : Fragment() {
    lateinit var mainActivity:MainActivity
    lateinit var binding: FragmentDetailBinding

    override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
    ): View? {
        binding = FragmentDetailBinding.inflate(inflater,container,false)
        binding.btnback.setOnClickListener { mainActivity?.goBack()}
        return binding.root
    }
    override fun onAttach(context: Context) {
        super.onAttach(context)
        if(context is MainActivity) mainActivity = context
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[activity_main.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;androidx.constraintlayout.widget.ConstraintLayout 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:visibility="visible"
    tools:context=".MainActivity"&amp;gt;

    &amp;lt;TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="Activity"
        android:visibility="visible"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" /&amp;gt;

    &amp;lt;androidx.fragment.app.FragmentContainerView
        android:id="@+id/frameLayout"
        android:name="com.example.myapplication.ListFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView2"
        tools:layout="@layout/fragment_list" /&amp;gt;

&amp;lt;/androidx.constraintlayout.widget.ConstraintLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[fragment_detail.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;androidx.constraintlayout.widget.ConstraintLayout 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:background="#FFFFFF"
    android:clickable="true"
    tools:context=".DetailFragment"&amp;gt; 
    &amp;lt;TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:text="Detail"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.464"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" /&amp;gt; 
    &amp;lt;Button
        android:id="@+id/btnback"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:text="BACK"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.458"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView3" /&amp;gt; 
&amp;lt;/androidx.constraintlayout.widget.ConstraintLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[fragment_list.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;androidx.constraintlayout.widget.ConstraintLayout
    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"
    tools:context=".ListFragment"&amp;gt; 
    &amp;lt;TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/title_list"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" /&amp;gt; 
    &amp;lt;Button
        android:id="@+id/btnNext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:text="NEXT"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" /&amp;gt; 
&amp;lt;/androidx.constraintlayout.widget.ConstraintLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5) Passing values ​​to Fragment&lt;/strong&gt;&lt;br&gt;
[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {
    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
    val listFragment by lazy { ListFragment() }
    val detailFragment by lazy { DetailFragment() }

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

        setFragment()
    }
    fun setFragment() {
        // pass value
        val bundle = Bundle()
        bundle.putString("key1", "List Fragment");
        bundle.putInt("key2", 20220226);
        listFragment.arguments = bundle
        //
        val transaction = supportFragmentManager.beginTransaction()
        transaction.add(R.id.frameLayout, listFragment)
        transaction.commit()
    }

    fun goDetail() {
        val transaction = supportFragmentManager.beginTransaction()
        transaction.add(R.id.frameLayout, detailFragment)
        transaction.addToBackStack("detail")
        transaction.commit()
    }
    fun goBack() {
        onBackPressed()
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[ListFragment.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class ListFragment : Fragment(R.layout.fragment_list) {
    lateinit var binding: FragmentListBinding
    lateinit var mainActivity:MainActivity

    override fun onAttach(context: Context) {
        super.onAttach(context)
        if(context is MainActivity) mainActivity = context
    }
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
    ): View? {
        binding = FragmentListBinding.inflate(inflater,container,false)
        with(binding) {
            arguments?.apply {
                textTitle.text = getString("key1")
                textValue.text = "${getInt("key2") }"
            }
            btnNext.setOnClickListener { mainActivity?.goDetail()}
        }
        return binding.root
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[fragment_list.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;androidx.constraintlayout.widget.ConstraintLayout
 &amp;lt;TextView android:id="@+id/textView"
&amp;lt;Button android:id="@+id/btnNext"
 &amp;lt;TextView android:id="@+id/textTitle"
&amp;lt;/androidx.constraintlayout.widget.ConstraintLayout 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;6) Create and deliver the value to Fragment displayed on the screen.&lt;/strong&gt;&lt;br&gt;
[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {
    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
    val listFragment by lazy { ListFragment() }
    val detailFragment by lazy { DetailFragment() }

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

        setFragment()
        binding.btnSend.setOnClickListener{
            listFragment.setValue("Pass Data")
        }

    }
    fun setFragment() {
        // pass value
        val bundle = Bundle()
        bundle.putString("key1", "List Fragment");
        bundle.putInt("key2", 20220226);
        listFragment.arguments = bundle
        //
        val transaction = supportFragmentManager.beginTransaction()
        transaction.add(R.id.frameLayout, listFragment)
        transaction.replace(R.id.frameLayout, listFragment)
        transaction.commit()
    }

    fun goDetail() {
        val transaction = supportFragmentManager.beginTransaction()
        transaction.add(R.id.frameLayout, detailFragment)
        transaction.addToBackStack("detail")
        transaction.commit()
    }
    fun goBack() {
        onBackPressed()
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[ListFragment.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class ListFragment : Fragment(R.layout.fragment_list) {
    lateinit var mainActivity:MainActivity
    lateinit var binding: FragmentListBinding
    override fun onAttach(context: Context) {
        super.onAttach(context)
        if(context is MainActivity) mainActivity = context
    }
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
    ): View? {
        binding = FragmentListBinding.inflate(inflater,container,false)
        with(binding) {
            arguments?.apply {
                textTitle.text = getString("key1")
                textValue.text = "${getInt("key2")}"
            }
            btnNext.setOnClickListener { mainActivity?.goDetail()}
        }
        return binding.root
    }
    fun setValue(value:String) {
        binding.textFromActivity.text = value
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[activity_main.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;androidx.constraintlayout.widget.ConstraintLayout
&amp;lt;TextView android:id="@+id/textView2"
&amp;lt;androidx.fragment.app.FragmentContainerView android:id="@+id/frameLayout"
&amp;lt;Button android:id="@+id/btnSend"
&amp;lt;/androidx.constraintlayout.widget.ConstraintLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[fragment_list.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;androidx.constraintlayout.widget.ConstraintLayout
&amp;lt;TextView android:id="@+id/textView"
&amp;lt;Button android:id="@+id/btnNext"
&amp;lt;TextView android:id="@+id/textTitle"
&amp;lt;TextView android:id="@+id/textValue"
&amp;lt;TextView android:id="@+id/textFromActivity"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;6) Transferring the value from fragment to fragment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;[build.gradle]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dependencies { 
    // fragment
    implementation "androidx.fragment:fragment-ktx:1.4.1"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[SenderFragment.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class SenderFragment : Fragment() {
    lateinit var binding:FragmentSenderBinding
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = FragmentSenderBinding.inflate(inflater, container, false)
        with(binding) {
            btnYes.setOnClickListener{
                val bundle = bundleOf("senderKey" to "Yes")
                setFragmentResult("request", bundle)
            }
            btnNo.setOnClickListener{
                val bundle = bundleOf("senderKey" to "No")
                setFragmentResult("request", bundle)
            }
        }
        return binding.root
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[ReceiverFragment.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class ReceiverFragment : Fragment() {
    lateinit var binding:FragmentReceiverBinding
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = FragmentReceiverBinding.inflate(inflater, container, false)
        setFragmentResultListener("request") { key, bundle -&amp;gt;
            bundle.getString("senderKey")?.let { value -&amp;gt;
                binding.textView.text = value
            }
        }
        return binding.root
    } 
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[activity_main.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;androidx.constraintlayout.widget.ConstraintLayout
&amp;lt;androidx.fragment.app.FragmentContainerView
&amp;lt;androidx.fragment.app.FragmentContainerView
&amp;lt;/androidx.constraintlayout.widget.ConstraintLayout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[fragment_receiver.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;androidx.constraintlayout.widget.ConstraintLayout
&amp;lt;TextView android:id="@+id/textView"
&amp;lt;androidx.constraintlayout.widget.ConstraintLayout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[fragment_sender.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;androidx.constraintlayout.widget.ConstraintLayout
&amp;lt;Button android:id="@+id/btnYes"
&amp;lt;Button android:id="@+id/btnNo"
&amp;lt;/androidx.constraintlayout.widget.ConstraintLayout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>[Android Studio|Kotlin] Activity</title>
      <dc:creator>kaggle_study</dc:creator>
      <pubDate>Tue, 22 Feb 2022 07:16:01 +0000</pubDate>
      <link>https://dev.to/kaggle_study/android-studiokotlin-activity-12jh</link>
      <guid>https://dev.to/kaggle_study/android-studiokotlin-activity-12jh</guid>
      <description>&lt;p&gt;&lt;strong&gt;1) Running sub activity from main activity&lt;/strong&gt; &lt;br&gt;
MainActivity(Button android:id="@+id/btnStart), SubActivity&lt;/p&gt;

&lt;p&gt;[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {

    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }

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

        binding.btnStart.setOnClickListener{
            val intent = Intent(this, SubActivity::class.java)
            startActivity(intent)
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2) Sending and receiving activity values&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;2-1) Pass values ​​from main to sub.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {

    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }

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

        binding.btnStart.setOnClickListener{
            val intent = Intent(this, SubActivity::class.java)
            intent.putExtra("from1", "hello Bundle")
            intent.putExtra("from2", 2020)
            startActivity(intent)
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[activity_sub.xml ]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TextView android:id="@+id/to1"
TextView android:id="@+id/to2"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[SubActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class SubActivity : AppCompatActivity() {
    val binding by lazy { ActivitySubBinding.inflate(layoutInflater) }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        with(binding) {
            to1.text = intent.getStringExtra("from1")
            to2.text = "${intent.getIntExtra("from2", 0) }"
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2-2) Return the value to MainActivity.kt while exiting SubActivity.kt&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://developer.android.com/training/basics/intents/result" rel="noopener noreferrer"&gt;https://developer.android.com/training/basics/intents/result&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;registerForActivityResult()&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;* startActivityForResult is deprecated&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {

    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }

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

        val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -&amp;gt;
            if (result.resultCode == Activity.RESULT_OK) {
                val intent = result.data
                intent?.getStringExtra("returnValue")?.let { message -&amp;gt;
                    Toast.makeText(this, message, Toast.LENGTH_LONG).show()
                }
            }
        }
        binding.btnStart.setOnClickListener{
            val intent = Intent(this, SubActivity::class.java)
            intent.putExtra("from1", "hello Bundle")
            intent.putExtra("from2", 2020)
            startForResult.launch(intent) 
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[activity_main.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;androidx.constraintlayout.widget.ConstraintLayout
TextView android:id="@+id/textView2"
Button android:id="@+id/btnStart"
&amp;lt;androidx.constraintlayout.widget.ConstraintLayout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[SubActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class SubActivity : AppCompatActivity() {
    val binding by lazy { ActivitySubBinding.inflate(layoutInflater) }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        with(binding) {
            to1.text = intent.getStringExtra("from1")
            to2.text = "${intent.getIntExtra("from2", 0) }"
            btnClose.setOnClickListener{
                val returnIntent = Intent()
                returnIntent.putExtra("returnValue", editMessage.text.toString())
                setResult(Activity.RESULT_OK, returnIntent)
                finish()
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[activity_sub.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;androidx.constraintlayout.widget.ConstraintLayout
TextView android:id="@+id/textView"
TextView android:id="@+id/to1"
TextView android:id="@+id/to2"
EditText android:id="@+id/editMessage"
Button android:id="@+id/btnClose"
&amp;lt;androidx.constraintlayout.widget.ConstraintLayout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>[Android Studio] Basic Resource Layout</title>
      <dc:creator>kaggle_study</dc:creator>
      <pubDate>Mon, 21 Feb 2022 06:37:03 +0000</pubDate>
      <link>https://dev.to/kaggle_study/android-studio-basic-resource-layout-37hi</link>
      <guid>https://dev.to/kaggle_study/android-studio-basic-resource-layout-37hi</guid>
      <description>&lt;p&gt;&lt;strong&gt;OverView&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ConstraintLayout (Constraint(제약조건) 설정만으로 화면 구성)&lt;/li&gt;
&lt;li&gt;LinearLayout&lt;/li&gt;
&lt;li&gt;FrameLayout &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bias 위치 조절 버튼&lt;br&gt;
Aspect Ratio 가로세로비&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ConstraintLayout&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmcw7anjhqwte5qlokctv.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmcw7anjhqwte5qlokctv.PNG" alt="Image description" width="464" height="172"&gt;&lt;/a&gt;&lt;br&gt;
① View Options : 제약조건을 화면에 표시하거나 숨길 수 있다.&lt;br&gt;
② Auto Connect : 오토 커넥트가 켜진 상태에서 위젯을 컨스트레인트 레이아웃에 가져다 놓으면 기본 컨스트레인트를 연결해준다.&lt;br&gt;
③ Default Margin : 컨스트레인트 연결 시 설정한 만큼 기본 마진값을 적용한다.&lt;br&gt;
④ Clear Constraints : 화면상의 모든 컨스트레인트를 제거한다. 개별로 제거할 때는 위젯에 마우스 포인터를 올리면 나타나는 동일한 모양의 아이콘을 클릭한다.&lt;br&gt;
⑤ Infer Constraints : 오토 커넥트를 끄고 작업할 때 사용한다. 가까운 위젯이나 레이아웃에 2개 이상의 컨스트레인트를 연결한다.&lt;br&gt;
⑥ Pack : 여러 개의 위젯을 동시에 선택한 상태에서 크기를 조절할 때 사용한다. 선택된 위젯들의 상태에 따라서 크기가 조절될 때도 있고, 위치가 조절될 때도 있다.&lt;br&gt;
⑦ Align : 선택된 위젯들을 정렬해준다.&lt;br&gt;
⑧ GuideLine : layout 안의 모든 위젯에 대해 공통의 여백을 지정할 때 사용한다. 가로 또는 세로 가이드라인을 삽입하면 위젯들은 가이드라인에 컨스트레인트를 연결할 수 있다.&lt;/p&gt;

&lt;p&gt;GuideLine&lt;br&gt;
  ConstraintLayout에만 사용할 수 있는 보조 도구다.&lt;br&gt;
GuideLine을 Drag해서 화면 임의의 위치에 가져다 놓으면 layout 안에 배치되는 위젯에 가상의 Anchor Point를 제공한다.&lt;br&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F11isz8t37cz1s26cz23j.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F11isz8t37cz1s26cz23j.PNG" alt="Image description" width="319" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LinearLayout&lt;/strong&gt;&lt;br&gt;
위젯을 가로 또는 세로로 한 줄로 배치하기 위한 layout.&lt;/p&gt;

&lt;p&gt;orientation 속성&lt;br&gt;
  하위 버전의 android studio에서는 필수 속성이었지만, 3.1부터는 입력하지 않으면 horizontal가 적용돼 가로로 배치된다. (horizontal, vertical만 변경해주면 기존에 배치되어 있던 위젯들도 방향을 바꿀 수 있다.)&lt;/p&gt;

&lt;p&gt;layout_weight 속성&lt;br&gt;
  레이아웃 안에 배치되는 위젯의 크기를 비율로 나타낼 수 있는 옵션. LinearLayout에 배치되는 위젯의 layout_weight 속성은 기본 설정값이 1이다.&lt;/p&gt;

&lt;p&gt;gravity 속성&lt;/p&gt;

&lt;p&gt;layout_gravity 속성&lt;br&gt;
  속해있는 layout(부모 layout)을 기준으로 나의 위치를 설정할 때 사용. 주로 LinearLayout과 FrameLayout 에서 사용된다.&lt;/p&gt;

&lt;p&gt;LinearLayout을 사용하기 위해 ConstraintLayout 안에 LinearLayout을 추가할 수도 있지만 Layout이 중첩되면 그만큼 그래픽 처리 속도가 느려지기 때문에 기본 Layout인 ConstraintLayout을 LinearLayout으로 바꾼 후에 작업을 한다.&lt;/p&gt;

&lt;p&gt;주의사항&lt;br&gt;
LinearLayout과 같은 일반 layout들은 화면 크기(높이, 넓이)를 넘어가는 위젯이 삽입돼도 Scroll이 되지 않는다.&lt;br&gt;
 이럴 때는 최상위 layout을 Scroll 할 수 있는 요소로 감싸야 한다. Scroll View를 사용하려면 ① 기존 layout(ConstraintLayout)을 Scroll View로 변경해서 사용하거나, ② 기본 layout 안에 Scroll View를 추가해야 한다.&lt;/p&gt;

&lt;p&gt;example)&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk910w99zrfqve9wrjzvv.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk910w99zrfqve9wrjzvv.PNG" alt="Image description" width="632" height="521"&gt;&lt;/a&gt;&lt;br&gt;
1) Change [android.constraintlayout.widget.ConstraintLayout] -&amp;gt; [ScrollView]&lt;br&gt;
2) LinearLayout을 Drag하여 ScrollView 안에 놓는다.&lt;br&gt;
3) 그 다음 LinearLayout 안에 Button을 20개 정도 삽입한 다음 emulator를 실행해보면 scroll 되는 것을 확인할 수 있다.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;FrameLayout *&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>[Android Studio|Kotlin] Binding</title>
      <dc:creator>kaggle_study</dc:creator>
      <pubDate>Sun, 20 Feb 2022 20:39:16 +0000</pubDate>
      <link>https://dev.to/kaggle_study/android-studiokotlin-practice-view-binding-2ace</link>
      <guid>https://dev.to/kaggle_study/android-studiokotlin-practice-view-binding-2ace</guid>
      <description>&lt;p&gt;&lt;strong&gt;viewBinding&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    buildFeatures {
        viewBinding = true
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example 1 ) setOnClickListener&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {

    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }

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

        binding.btnSay.setOnClickListener {
            binding.textSay.text = "Hello Kotlin"
        }

    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[activity_main.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    &amp;lt;TextView
        android:id="@+id/textSay"
        android:layout_width="77dp"
        android:layout_height="19dp"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" /&amp;gt;

    &amp;lt;Button
        android:id="@+id/btnSay"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="31dp"
        android:text="Button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textSay" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example 2-1 ) addTextChangedListener&lt;/strong&gt;&lt;br&gt;
[activity_main.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    &amp;lt;TextView
        android:id="@+id/textView"   /&amp;gt;

    &amp;lt;EditText
        android:id="@+id/editText" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {

    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }

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

        with(binding) {
            editText.addTextChangedListener{
                Log.d("EditText012345", "Current Value=${it.toString()}")
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example 2-2 ) addTextChangedListener&lt;/strong&gt;&lt;br&gt;
[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {

    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }

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

        with(binding) {
            editText.addTextChangedListener{ editable -&amp;gt;
                Log.d("EditText012345", "Current Value=${editable.toString()}")
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example 2-3 ) addTextChangedListener&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Depending on the version of Android Studio used, the parameters of the automatically generated function may be different. &lt;br&gt;
like .. &lt;strong&gt;[s: Editable?], [s: CharSequence?], [p0: Editable?], [edit: Editable?]&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {

    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }

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

        binding.editText.addTextChangedListener(object : TextWatcher{
            override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
            }
            override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
            }
            override fun afterTextChanged(p0: Editable?) {
                Log.d("EditText012345", "Current Value=${p0.toString()}")
                binding.textView.text = p0.toString()
            }
        })
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example 3-1 ) &lt;em&gt;Check if the entered characters are 8 or more characters like when checking ID when logging in&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
class MainActivity : AppCompatActivity() {

    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }

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

        with(binding) {
            editText.addTextChangedListener{
                if (it.toString().length &amp;gt;= 8) {
                    Log.d("EditText012345", "over 8=${it.toString()}")
                }
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example 3-2 ) &lt;em&gt;Check if the entered characters are 8 or more characters like when checking ID when logging in&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {

    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }

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

        binding.editText.addTextChangedListener(object : TextWatcher{
            override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
            }
            override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
            }
            override fun afterTextChanged(p0: Editable?) {
                if (p0.toString().length &amp;gt;= 8 ) {
                    Log.d("EditText012345", "over 8=${p0.toString()}")
                }
            }
        })
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example 4-1 ) CHECKBOX&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;{ compoundButton, b -&amp;gt; }&lt;br&gt;
{ compoundButton, i -&amp;gt; }&lt;br&gt;
{ buttonView, isChecked -&amp;gt; }&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {

    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }

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

        with(binding) {
            checkApple.setOnCheckedChangeListener (listener)
            checkBanana.setOnCheckedChangeListener (listener)
            checkOrange.setOnCheckedChangeListener (listener)
        }
    }
    var listener = CompoundButton.OnCheckedChangeListener { buttonView, isChecked -&amp;gt;
        if (isChecked) {
            when (buttonView.id) {
                R.id.checkApple -&amp;gt; Log.d("CheckBox", "Apples have been selected.")
                R.id.checkBanana -&amp;gt; Log.d("CheckBox", "Banana have been selected.")
                R.id.checkOrange -&amp;gt; Log.d("CheckBox", "Orange have been selected.")
            }
        } else {
            when (buttonView.id) {
                R.id.checkApple -&amp;gt; Log.d("CheckBox", "Apple are deselected.")
                R.id.checkBanana -&amp;gt; Log.d("CheckBox", "Banana are deselected.")
                R.id.checkOrange -&amp;gt; Log.d("CheckBox", "Orange are deselected.")
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example 4-2 ) CHECKBOX&lt;/strong&gt;&lt;br&gt;
{ compoundButton, b -&amp;gt; }&lt;br&gt;
{ buttonView, isChecked -&amp;gt; }&lt;br&gt;
[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {

    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }

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

        with(binding) {
            var listener = CompoundButton.OnCheckedChangeListener { compoundButton, b -&amp;gt; 
                if (b) {
                    when (compoundButton.id) {
                        R.id.checkApple -&amp;gt; Log.d("CheckBox", "Apples have been selected.")
                        R.id.checkBanana -&amp;gt; Log.d("CheckBox", "Banana have been selected.")
                        R.id.checkOrange -&amp;gt; Log.d("CheckBox", "Orange have been selected.")
                    }
                } else {
                    when (compoundButton.id) {
                        R.id.checkApple -&amp;gt; Log.d("CheckBox", "Apple are deselected.")
                        R.id.checkBanana -&amp;gt; Log.d("CheckBox", "Banana are deselected.")
                        R.id.checkOrange -&amp;gt; Log.d("CheckBox", "Orange are deselected.")
                    }
                }
            }
            checkApple.setOnCheckedChangeListener (listener)
            checkBanana.setOnCheckedChangeListener (listener)
            checkOrange.setOnCheckedChangeListener (listener)
        }

    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example 5 ) ToggleButton, Switch&lt;/strong&gt;&lt;br&gt;
[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {

    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }

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

        with(binding) {
            toggleButton.setOnCheckedChangeListener { compoundButton, isChecked -&amp;gt;
                textToggle.text = if(isChecked) "On" else "Off"
            }
            switchButton.setOnCheckedChangeListener { compoundButton, isChecked -&amp;gt;
                textSwitch.text = if(isChecked) "On" else "Off"
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example 6 ) ProgressBar&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;LinearLayout android:id="@+id/progressLayout"&lt;/em&gt;&lt;br&gt;
[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {

    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }

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

        with(binding) {
            // MAIN THREAD
            showProgress(true)
            thread(start=true) {
                Thread.sleep(3000)
                runOnUiThread {
                    showProgress(false)
                }
            } // SUB THREAD
        } // MAIN THREAD
    }

    fun showProgress(show: Boolean){
        binding.progressLayout.visibility = if(show) View.VISIBLE else View.GONE
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example 7 ) SeekBar&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;SeekBar android:id="@+id/seekBar"&lt;br&gt;
TextView android:id="@+id/textView"&lt;/em&gt;&lt;br&gt;
(SeekBar: SeekBar?, progress: Int, fromUser: Boolean) &lt;br&gt;
(p0: SeekBar?, p1: Int, p2: Boolean) &lt;br&gt;
[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class MainActivity : AppCompatActivity() {

    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }

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

        with(binding) {
            seekBar.setOnSeekBarChangeListener(object :SeekBar.OnSeekBarChangeListener {
                override fun onProgressChanged(p0: SeekBar?, p1: Int, p2: Boolean) {
                    textView.text = "$p1"
                }
                override fun onStartTrackingTouch(p0: SeekBar?) {}
                override fun onStopTrackingTouch(p0: SeekBar?) {}
            })
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example 8 ) Rating Bar&lt;/strong&gt; &lt;br&gt;
RatingBar android:id="@+id/ratingBar"&lt;br&gt;
TextView android:id="@+id/textView"&lt;br&gt;
{ ratingBar, fl, b -&amp;gt; }&lt;br&gt;
{ ratingBar, rating, fromUser -&amp;gt; }&lt;br&gt;
[MainActivity.kt]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
class MainActivity : AppCompatActivity() {

    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }

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

        with(binding) {
            ratingBar.setOnRatingBarChangeListener { ratingBar, fl, b -&amp;gt;
                textView.text = "$fl"
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Android Studio basic settings</title>
      <dc:creator>kaggle_study</dc:creator>
      <pubDate>Sun, 20 Feb 2022 04:13:55 +0000</pubDate>
      <link>https://dev.to/kaggle_study/android-sdk-basic-settings-24e6</link>
      <guid>https://dev.to/kaggle_study/android-sdk-basic-settings-24e6</guid>
      <description>&lt;p&gt;&lt;strong&gt;Android SDK basic settings&lt;/strong&gt;&lt;br&gt;
[File &amp;gt; Settings &amp;gt; Appearance &amp;amp; Behavior &amp;gt; System Settings &amp;gt; Android SDK &amp;gt; SDK Tools] &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Android SDK Build-Tools ::리소스 아이디를 가지고 있는 R파일을 생성하고 설치 파일인 APK 파일을 최적화하는 도구. include tool that convert Java Bytecode to Dalvik Bytecode.&lt;/li&gt;
&lt;li&gt;(Android Emulator)&lt;/li&gt;
&lt;li&gt;( Android SDK Platform-Tools)&lt;/li&gt;
&lt;li&gt;Android SDK Tools&lt;/li&gt;
&lt;li&gt;Intel x86 Emulator Accelerator (HAXM Installer) :: 에뮬레이터의 처리 속도를 빠르게 해주는 하드웨어 가속기&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When developing multiple projects at the same time.&lt;/strong&gt;&lt;br&gt;
[File &amp;gt; Settings &amp;gt; Appearance &amp;amp; Behavior &amp;gt; System Settings] &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uncheck [Reopen projects on startup] &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;viewBinding&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    buildFeatures {
        viewBinding = true
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[values&amp;gt;themes&amp;gt;themes.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;item name="windowActionBar"&amp;gt;false&amp;lt;/item&amp;gt;
&amp;lt;item name="windowNoTitle"&amp;gt;true&amp;lt;/item&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;color / #FFC107&lt;/p&gt;

</description>
    </item>
    <item>
      <title>notepad (Google Play Store)</title>
      <dc:creator>kaggle_study</dc:creator>
      <pubDate>Sun, 20 Feb 2022 02:11:30 +0000</pubDate>
      <link>https://dev.to/kaggle_study/notepad-google-play-store-1pdc</link>
      <guid>https://dev.to/kaggle_study/notepad-google-play-store-1pdc</guid>
      <description>&lt;p&gt;AAB 파일로 빌드된 파일을 앱스토어에 등록한다.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Different Java Kotlin in Android Studio</title>
      <dc:creator>kaggle_study</dc:creator>
      <pubDate>Sun, 20 Feb 2022 01:45:16 +0000</pubDate>
      <link>https://dev.to/kaggle_study/different-java-kotlin-in-android-studio-36ca</link>
      <guid>https://dev.to/kaggle_study/different-java-kotlin-in-android-studio-36ca</guid>
      <description>&lt;p&gt;onClickListener&lt;/p&gt;

&lt;p&gt;Java&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class ButtonActivity extends Activity {
      protected void onCreate(Bundle saveInstance) {
            Button button = findViewById(R.id.button);
            button.setOnClickListener(new View.OnClickListener() {
                  public void onClick(View view) {
                        System.out.print("Hello World");
                  }
            }
      }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kotlin&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class ButtonActivity : Activity() {
      override fun onCreate(saveInstance: Bundle?) {
            button.setOnClicklistener {
                  print("Hello World")
            }
      }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>[Android Studio|Kotlin] RecyclerView, setOnClickListener</title>
      <dc:creator>kaggle_study</dc:creator>
      <pubDate>Fri, 18 Feb 2022 18:57:34 +0000</pubDate>
      <link>https://dev.to/kaggle_study/android-studiokotlin-recyclerview-setonclicklistener-50ma</link>
      <guid>https://dev.to/kaggle_study/android-studiokotlin-recyclerview-setonclicklistener-50ma</guid>
      <description>&lt;p&gt;Youtube: &lt;iframe width="710" height="399" src="https://www.youtube.com/embed/4o6QwVe_2Yg"&gt;
&lt;/iframe&gt;
 &lt;/p&gt;

&lt;p&gt;[app&amp;gt;values&amp;gt;themes&amp;gt;themes.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        &amp;lt;!-- Customize your theme here. --&amp;gt;
        &amp;lt;item name="windowActionBar"&amp;gt;false&amp;lt;/item&amp;gt;
        &amp;lt;item name="windowNoTitle"&amp;gt;true&amp;lt;/item&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[Gradle Scripts&amp;gt;build.gradle(Module:recyclerview.app)]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    // retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[app&amp;gt;manifests&amp;gt;AndroidManifest.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.recyclerview"&amp;gt;

    &amp;lt;uses-permission android:name="android.permission.INTERNET"/&amp;gt;

    &amp;lt;application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Recyclerview"&amp;gt;
        &amp;lt;activity
            android:name=".MainActivity"
            android:exported="true"&amp;gt;
            &amp;lt;intent-filter&amp;gt;
                &amp;lt;action android:name="android.intent.action.MAIN" /&amp;gt;

                &amp;lt;category android:name="android.intent.category.LAUNCHER" /&amp;gt;
            &amp;lt;/intent-filter&amp;gt;
        &amp;lt;/activity&amp;gt;
    &amp;lt;/application&amp;gt; 
&amp;lt;/manifest&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[app&amp;gt;java&amp;gt;com.example...&amp;gt;ApiService]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package com.example.recyclerview

import retrofit2.Call
import retrofit2.http.GET

interface ApiService {
    @GET("/apptech")
    fun getPosts(): Call&amp;lt;MutableList&amp;lt;PostModel&amp;gt;&amp;gt;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[app&amp;gt;java&amp;gt;com.example...&amp;gt;MainActivity]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package com.example.recyclerview

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.recyclerview.*
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val recyclerView = findViewById&amp;lt;RecyclerView&amp;gt;(R.id.myRecyclerView)
        val serviceGenerator = ServiceGenerator.buildService(ApiService::class.java)
        val call = serviceGenerator.getPosts()
        call.enqueue(object : Callback&amp;lt;MutableList&amp;lt;PostModel&amp;gt;&amp;gt;{
                override fun onResponse(call: Call&amp;lt;MutableList&amp;lt;PostModel&amp;gt;&amp;gt;, response: Response&amp;lt;MutableList&amp;lt;PostModel&amp;gt;&amp;gt;) {
                    if (response.isSuccessful) {
                        recyclerView.apply {
                            layoutManager = LinearLayoutManager(this@MainActivity)
                            adapter = PostAdapter(response.body()!!)
                        }
                    }
                }

                override fun onFailure(call: Call&amp;lt;MutableList&amp;lt;PostModel&amp;gt;&amp;gt;, t: Throwable) {
                    t.printStackTrace()
                    Log.e("error", t.message.toString())
                }
            })
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[app&amp;gt;java&amp;gt;com.example...&amp;gt;PostAdapter]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package com.example.recyclerview

import android.content.Intent
import android.net.Uri
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView 
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView

class PostAdapter(val postModel: MutableList&amp;lt;PostModel&amp;gt;):RecyclerView.Adapter&amp;lt;PostAdapter.PostViewHolder&amp;gt;() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PostViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.card_post,parent,false)
        return PostViewHolder(view )
    }

    override fun getItemCount(): Int {
        return postModel.size
    }



    override fun onBindViewHolder(holder: PostViewHolder, position: Int) {
        return holder.bindView(postModel[position])
    }

    inner class PostViewHolder(itemView: View ) : RecyclerView.ViewHolder(itemView) {
        private val tvTitle: TextView = itemView.findViewById(R.id.tvTitle)
        private val tvBody: TextView = itemView.findViewById(R.id.tvBody)
        private val tvTime: TextView = itemView.findViewById(R.id.tvTime)

        fun bindView(postModel: PostModel){
            tvTitle.text = postModel.apptech_brand
            tvBody.text = postModel.apptech_title
            tvTime.text = postModel.apptech_time
            // for setOnClickListener
            itemView.setOnClickListener {
                var url = "${postModel.apptech_url}"
                val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
                ContextCompat.startActivity(itemView.context, intent, null)
            }
        }

    } 
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[app&amp;gt;java&amp;gt;com.example...&amp;gt;PostModel]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package com.example.recyclerview

data class PostModel(
    val apptech_brand: String? = null,
    val apptech_title: String? = null,
    val apptech_period: String? = null,
    val apptech_point: Int? = null,
    val apptech_time: String? = null,
    val apptech_url: String? = null
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[app&amp;gt;java&amp;gt;com.example...&amp;gt;ServiceGenerator]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package com.example.recyclerview

import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

object ServiceGenerator {
    private val client = OkHttpClient.Builder().build()
    private val retrofit = Retrofit.Builder()
        .baseUrl("https://********.herokuapp.com")
        .addConverterFactory(GsonConverterFactory.create())
        .client(client)
        .build()

    fun &amp;lt;T&amp;gt; buildService(service: Class&amp;lt;T&amp;gt;): T {
        return retrofit.create(service)
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[app&amp;gt;res&amp;gt;drawable&amp;gt;border_a.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;shape xmlns:android="http://schemas.android.com/apk/res/android"&amp;gt;
    &amp;lt;solid android:color="#FFD0D0"&amp;gt;&amp;lt;/solid&amp;gt;
    &amp;lt;stroke android:width="3dp" android:color="#FF8484"/&amp;gt;
    &amp;lt;corners android:radius="15dp"/&amp;gt;
&amp;lt;/shape&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[app&amp;gt;res&amp;gt;layout&amp;gt;activity_main.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;FrameLayout 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"
tools:context=".MainActivity"&amp;gt;
&amp;lt;androidx.recyclerview.widget.RecyclerView
    android:id="@+id/myRecyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" /&amp;gt;
&amp;lt;/FrameLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;[app&amp;gt;res&amp;gt;layout&amp;gt;card_post.xml]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:tools="http://schemas.android.com/tools"
    android:paddingTop="8dp"
    android:paddingBottom="8dp"
    android:paddingLeft="15dp"
    android:layout_marginTop="4dp"
    android:layout_marginBottom="4dp"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="8dp"
    android:orientation="horizontal"
    android:background="@drawable/border_a"&amp;gt;

    &amp;lt;TextView
        android:id="@+id/tvTitle"
        tools:text="Hello Title"
        android:layout_width="80dp"
        android:layout_height="match_parent"
        android:textColor="@color/black"
        android:textSize="20sp" /&amp;gt;

    &amp;lt;LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:paddingLeft="15dp"
        android:paddingRight="15dp" &amp;gt;

        &amp;lt;TextView
            android:id="@+id/tvBody"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="14sp"
            tools:text="Hello Body"
            android:textAlignment="center"/&amp;gt;

        &amp;lt;TextView
            android:id="@+id/tvTime"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textSize="14sp"
            tools:text="Hello Time"
            android:textAlignment="center"/&amp;gt; 
    &amp;lt;/LinearLayout&amp;gt; 
&amp;lt;/LinearLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Heroku Deploy</title>
      <dc:creator>kaggle_study</dc:creator>
      <pubDate>Mon, 14 Feb 2022 16:38:46 +0000</pubDate>
      <link>https://dev.to/kaggle_study/heroku-107e</link>
      <guid>https://dev.to/kaggle_study/heroku-107e</guid>
      <description>&lt;p&gt;&lt;strong&gt;heroku login&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;git init&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;heroku git:remote -a appname&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;git add .&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;git commit -am "make it better"&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;git push heroku master&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;rm -rf .git&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;! [rejected]        master -&amp;gt; master (non-fast-forward)&lt;br&gt;
error: failed to push some refs to '&lt;a href="https://git.heroku.com/appname.git" rel="noopener noreferrer"&gt;https://git.heroku.com/appname.git&lt;/a&gt;'&lt;br&gt;
hint: Updates were rejected because the tip of your current branch is behind&lt;br&gt;
hint: its remote counterpart. Integrate the remote changes (e.g.&lt;br&gt;
hint: 'git pull ...') before pushing again.&lt;br&gt;
hint: See the 'Note about fast-forwards' in 'git push --help' for details.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;git push heroku HEAD:master --force&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Precautions &lt;br&gt;
&lt;a href="https://velog.io/@han0707/django-heroku-error" rel="noopener noreferrer"&gt;https://velog.io/@han0707/django-heroku-error&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>memo, Window10 with Ubuntu</title>
      <dc:creator>kaggle_study</dc:creator>
      <pubDate>Fri, 11 Feb 2022 15:58:02 +0000</pubDate>
      <link>https://dev.to/kaggle_study/memo-window10-with-ubuntu-1njo</link>
      <guid>https://dev.to/kaggle_study/memo-window10-with-ubuntu-1njo</guid>
      <description>&lt;p&gt;source activate &lt;code&gt;virtual name&lt;/code&gt;   &lt;/p&gt;

&lt;p&gt;&lt;a href="https://stackoverflow.com/questions/39281594/error-1698-28000-access-denied-for-user-rootlocalhost" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/39281594/error-1698-28000-access-denied-for-user-rootlocalhost&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://stackoverflow.com/questions/62987154/mysql-wont-start-error-su-warning-cannot-change-directory-to-nonexistent" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/62987154/mysql-wont-start-error-su-warning-cannot-change-directory-to-nonexistent&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
