<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>z_is_2.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Tue, 30 Nov 2021 10:15:47 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>z_is_2.log</title>
            <url>https://images.velog.io/images/z_is_2/profile/abda5fc9-9750-4261-8f69-8368089fec4e/KakaoTalk_Photo_2021-10-17-03-36-00.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. z_is_2.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/z_is_2" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[코틀린 ImageView, TextView 동적생성]]></title>
            <link>https://velog.io/@z_is_2/%EC%BD%94%ED%8B%80%EB%A6%B0-ImageView-TextView-%EB%8F%99%EC%A0%81%EC%83%9D%EC%84%B1</link>
            <guid>https://velog.io/@z_is_2/%EC%BD%94%ED%8B%80%EB%A6%B0-ImageView-TextView-%EB%8F%99%EC%A0%81%EC%83%9D%EC%84%B1</guid>
            <pubDate>Tue, 30 Nov 2021 10:15:47 GMT</pubDate>
            <description><![CDATA[<p>드디어 모프 팀플이 끝났답니다 &gt;_&lt;
코틀린을 사용하면서, 동적생성에 관련해서 제대로 정리된 글을 찾기 힘들다는 생각이 들어서 제가 정리해보려고 합니당</p>
<p>참고로 제가 지금 보여드릴 내용은 스크랩한 레시피에 대한 api정보를 image와 text로 뿌려주는 부분이예용
<br>
<br>
<strong>1. 메인 레이아웃 id 값 가져오기</strong></p>
<pre><code>val scrapMainLayout: LinearLayout = findViewById(R.id.scrap_recipe_main)</code></pre><p>먼저 저는 xml에 메인으로 리니어 레이아웃을 하나 넣어줬는데요!
레이아웃의 id를 가르키는 변수 scrapMainLayout을 만들어줬습니다.
<br></p>
<p><strong>2. TextView, ImageView 객체 만들기</strong></p>
<pre><code> val scrapImage = ImageView(this@ScrapActivity)
 val newButton = TextView(this@ScrapActivity)</code></pre><br>
**3. 각각 layout param만든 후 원하는 layout 넣기**

<pre><code>//textview의 레이아웃
val layoutParams = LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.WRAP_CONTENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT,
                )

//imageview의 레이아웃
 val imageLayoutParams = LinearLayout.LayoutParams(
                    900,
                    350,
                )</code></pre><p>imageview의 레이아웃이 뜻하는 것은 width:900, height:350이예요!
이미지 크기를 조절하는겁니다.
<br></p>
<p><strong>4. imageview 레이아웃에 gravity속성 주기</strong></p>
<pre><code>imageLayoutParams.gravity = Gravity.CENTER</code></pre><p>이 코드로 인해 이미지는 가운데 정렬됩니다.
<br></p>
<p><strong>5. textview 레이아웃에 margin속성 주기</strong></p>
<pre><code>layoutParams.setMargins(80,5,0,0)</code></pre><p>left에 margin 80, top에 margin 5이 주어집니다.
<br></p>
<p><strong>6. 레이아웃 적용하기</strong></p>
<pre><code>scrapImage.layoutParams = imageLayoutParams
newButton.layoutParams = layoutParams</code></pre><p>각각 레이아웃이 적용됩니다!
<br>
<strong>7. imageview에 이미지 추가 하기</strong></p>
<pre><code>Glide.with(this@ScrapActivity).load(foodImages[i]).into(scrapImage)</code></pre><p>저는 glide를 이용하여 이미지를 추가시켜주었습니다.
load()안에는 api에서 가져온 이미지url이 들어가고 
into()안에는 imageview객체이름이 들어갑니다.
<br>
<strong>8. textview에서 text넣고, 관련 속성 주기</strong></p>
<pre><code>newButton.setText(foodNames[i])
newButton.setTextSize(Dimension.SP,15.0f)
newButton.setTypeface(newButton.typeface, Typeface.BOLD)
newButton.setTextColor(Color.BLACK)</code></pre><p>setText() : text 추가 속성</p>
<p>setTextSize() : text 사이즈 지정 속성
<em>첫번째 파라미터인 Dimension.SP 에 따라 단위는 sp가 됩니다.
두번째 파라미터가 15.0f인 이유는 float만 가능하기 때문이예요.</em></p>
<p>setTypeface() : text 두께 지정 속성</p>
<p>setTextColor() : text color 지정 속성
<br>
<strong>9. 메인 레이아웃에 TextView, ImageView객체 추가하기</strong></p>
<pre><code>scrapMainLayout.addView(scrapImage)
scrapMainLayout.addView(newButton)</code></pre><br>
<br>
<br>
결과물입니다 !


<p><img src="https://images.velog.io/images/z_is_2/post/f3a274f4-a086-4586-b947-936d61ca1ec7/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[FireStore] 데이터 읽기]]></title>
            <link>https://velog.io/@z_is_2/FireStore-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%9D%BD%EA%B8%B0</link>
            <guid>https://velog.io/@z_is_2/FireStore-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%9D%BD%EA%B8%B0</guid>
            <pubDate>Sat, 16 Oct 2021 18:33:20 GMT</pubDate>
            <description><![CDATA[<p>저의 첫번째 게시물은 Firestore사용법 입니다!
프로젝트를 하면서 배웠던 내용들을 간단하게 정리해두려고 해요 :)</p>
<h2 id="firestore의-데이터-구조">Firestore의 데이터 구조</h2>
<p><img src="https://images.velog.io/images/z_is_2/post/2da652a7-8173-4092-a85f-fef206aca81a/KakaoTalk_Photo_2021-10-17-03-20-02.jpeg" alt=""></p>
<p>firestore는 NoSQL중심의 데이터베이스이며 <strong>collection-&gt;document-&gt;data</strong>로 짜여져 있습니다. 모든 문서는 컬렉션에 저장되어야 하며, 문서 안에 하위 컬렉션이 들어갈 수 있습니다. </p>
<h2 id="데이터-한번-읽기">데이터 한번 읽기</h2>
<pre><code>const getOnce = firebase.firestore().collection(&#39;game&#39;).doc(&#39;room&#39;).get();</code></pre><p><strong>get()</strong>을 이용하면 firestore에 있는 내용을 검색해서 가져올 수 있습니다.
위의 코드를 보면 
<strong>game</strong> (collection)-&gt; <strong>room</strong> (document)-&gt; <strong>data</strong>
가 getOnce에 저장되는 것을 알 수 있습니다.</p>
<h2 id="실시간으로-데이터-수신">실시간으로 데이터 수신</h2>
<pre><code>firebase.firestore().collection(&#39;game&#39;).doc(&#39;room&#39;).onSnapshot((doc) =&gt; {
        console.log(doc.data());
    });</code></pre><p><strong>onSnapshot()</strong>을 이용하면 데이터가 변경될때마다 실시간으로 데이터를 수신받을 수 있습니다. 
위 코드를 보면
<strong>game</strong> (collection)-&gt; <strong>room</strong> (document)-&gt; <strong>data</strong>
가 doc.data()이며 데이터가 콘솔에 찍히는 것을 볼 수 있습니다.</p>
]]></description>
        </item>
    </channel>
</rss>