<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Android - Kama Kaczmarek</title>
	<atom:link href="https://kamakaczmarek.net/category/android/feed/" rel="self" type="application/rss+xml" />
	<link>https://kamakaczmarek.net/category/android/</link>
	<description>Strona z materiałami dla uczniów i nauczycieli</description>
	<lastBuildDate>Fri, 10 Apr 2026 07:54:33 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>6. Android &#8211; tworzymy pierwszą aplikację w Android Studio</title>
		<link>https://kamakaczmarek.net/6-android-tworzymy-pierwsza-aplikacje-w-android-studio/</link>
		
		<dc:creator><![CDATA[Kama]]></dc:creator>
		<pubDate>Tue, 12 Oct 2021 16:30:35 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android]]></category>
		<guid isPermaLink="false">https://kamakaczmarek.net/?p=3141</guid>

					<description><![CDATA[<p>Założenia aplikacji: nazwa aplikacji &#8211; Lotto losowanie 6 niepowtarzalnych liczb z zakresu 1..49 po naciśnięciu przycisku &#8222;Losuj&#8221; aplikacja ma posiadać 3 widoki w rozkładzie RelativeLayout: ImageView &#8211; zawierający logo totalizatora, TextView &#8211; zawierający napis &#8222;Losowanie 6 z 49 liczb&#8221; Button &#8211; posiadający napis &#8222;Losuj&#8221; po naciśnięciu przycisku następuje wyświetlenie wylosowanych liczb w zdefiniowanym uprzednio widoku [&#8230;]</p>
<p>Artykuł <a href="https://kamakaczmarek.net/6-android-tworzymy-pierwsza-aplikacje-w-android-studio/">6. Android &#8211; tworzymy pierwszą aplikację w Android Studio</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Założenia aplikacji:</p>
<ul>
<li>nazwa aplikacji &#8211; Lotto</li>
<li>losowanie 6 niepowtarzalnych liczb z zakresu 1..49 po naciśnięciu przycisku &#8222;Losuj&#8221;</li>
<li>aplikacja ma posiadać 3 widoki w rozkładzie RelativeLayout:
<ul>
<li>ImageView &#8211; zawierający logo totalizatora,</li>
<li>TextView &#8211; zawierający napis &#8222;Losowanie 6 z 49 liczb&#8221;</li>
<li>Button &#8211; posiadający napis &#8222;Losuj&#8221;</li>
</ul>
</li>
<li>po naciśnięciu przycisku następuje wyświetlenie wylosowanych liczb w zdefiniowanym uprzednio widoku TextView</li>
</ul>
<p>&nbsp;</p>
<p>Otwieramy Android Studio i tworzymy Nowy projekt:</p>
<p><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-3148" src="https://kamakaczmarek.net/wp-content/uploads/lotto1.png" alt="" width="1384" height="997" srcset="https://kamakaczmarek.net/wp-content/uploads/lotto1.png 1384w, https://kamakaczmarek.net/wp-content/uploads/lotto1-300x216.png 300w, https://kamakaczmarek.net/wp-content/uploads/lotto1-1024x738.png 1024w, https://kamakaczmarek.net/wp-content/uploads/lotto1-768x553.png 768w" sizes="(max-width: 1384px) 100vw, 1384px" /></p>
<p>Wybieramy Empty Activity</p>
<p><img decoding="async" class="aligncenter size-full wp-image-3147" src="https://kamakaczmarek.net/wp-content/uploads/lotto2.png" alt="" width="1126" height="817" srcset="https://kamakaczmarek.net/wp-content/uploads/lotto2.png 1126w, https://kamakaczmarek.net/wp-content/uploads/lotto2-300x218.png 300w, https://kamakaczmarek.net/wp-content/uploads/lotto2-1024x743.png 1024w, https://kamakaczmarek.net/wp-content/uploads/lotto2-768x557.png 768w" sizes="(max-width: 1126px) 100vw, 1126px" /></p>
<p>Nadajemy nazwę i klikamy Finish</p>
<p><img decoding="async" class="aligncenter size-full wp-image-3146" src="https://kamakaczmarek.net/wp-content/uploads/lotto3.png" alt="" width="1124" height="812" srcset="https://kamakaczmarek.net/wp-content/uploads/lotto3.png 1124w, https://kamakaczmarek.net/wp-content/uploads/lotto3-300x217.png 300w, https://kamakaczmarek.net/wp-content/uploads/lotto3-1024x740.png 1024w, https://kamakaczmarek.net/wp-content/uploads/lotto3-768x555.png 768w" sizes="(max-width: 1124px) 100vw, 1124px" /></p>
<p>Teraz do folderu res/drawable wgrywamy grafikę totalizatora (pobierz ją z internetu):</p>
<p>Wystarczy kliknąć na pobrany plik PPM-&gt;&#8221;copy&#8221;, następnie PPM w Android Studio na folder Drawable-&gt;&#8221;Paste&#8221;</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3154" src="https://kamakaczmarek.net/wp-content/uploads/Zrzut-ekranu-2021-09-11-203804.png" alt="" width="711" height="651" srcset="https://kamakaczmarek.net/wp-content/uploads/Zrzut-ekranu-2021-09-11-203804.png 711w, https://kamakaczmarek.net/wp-content/uploads/Zrzut-ekranu-2021-09-11-203804-300x275.png 300w" sizes="(max-width: 711px) 100vw, 711px" /></p>
<p>Przechodzimy do edycji pliku activity_main.xml w widoku Code:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3156" src="https://kamakaczmarek.net/wp-content/uploads/Zrzut-ekranu-2021-09-11-204051.png" alt="" width="930" height="166" srcset="https://kamakaczmarek.net/wp-content/uploads/Zrzut-ekranu-2021-09-11-204051.png 930w, https://kamakaczmarek.net/wp-content/uploads/Zrzut-ekranu-2021-09-11-204051-300x54.png 300w, https://kamakaczmarek.net/wp-content/uploads/Zrzut-ekranu-2021-09-11-204051-768x137.png 768w" sizes="(max-width: 930px) 100vw, 930px" /></p>
<p>&nbsp;</p>
<p>Przystępujemy do kodowania:</p>
<ul>
<li>ustawiamy biały kolor tła dla layoutu</li>
<li>dodajemy id do widoków</li>
<li>ustawiamy TextView na środku oraz ustawiamy mu padding górny i dolny</li>
<li>dla ImageView określamy, że będzie nad TextView i wyśrodkowujemy</li>
<li>przycisk wyśrodkowujemy i ustawiamy poniżej tekstu</li>
</ul>
<pre>&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />&lt;RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"<br />    xmlns:tools="http://schemas.android.com/tools"<br />    android:layout_width="match_parent"<br />    android:layout_height="match_parent"<br />    android:background="#fff"<br />    tools:context=".MainActivity"&gt;<br /><br />    &lt;TextView<br />        android:id="@+id/textview"<br />        android:layout_width="wrap_content"<br />        android:layout_height="wrap_content"<br />        android:layout_centerInParent="true"<br />        android:paddingTop="20dp"<br />        android:paddingBottom="20dp"<br />        android:text="Losowanie 6 z 49 liczb"<br />        android:textSize="20sp"/&gt;<br /><br />    &lt;ImageView<br />        android:id="@+id/imageView"<br />        android:src="@drawable/lotto"<br />        android:layout_width="wrap_content"<br />        android:layout_height="wrap_content"<br />        android:layout_above="@id/textview"<br />        android:layout_centerInParent="true"<br />        /&gt;<br /><br />    &lt;Button<br />        android:id="@+id/button"<br />        android:layout_width="wrap_content"<br />        android:layout_height="wrap_content"<br />        android:layout_below="@id/textview"<br />        android:layout_centerInParent="true"<br />        android:text="Losuj"<br />        android:textSize="16sp"<br />    /&gt;<br />&lt;/RelativeLayout&gt;</pre>
<p>Możemy podejrzeć wygląd aplikacji w zakładce split lub design.</p>
<p>Przechodzimy do warstwy logicznej, modyfikujemy plik MainActivity.java:</p>
<pre>package com.example.androidlotto;<br /><br />import androidx.appcompat.app.AppCompatActivity;<br />import android.os.Bundle;<br />import android.view.View;<br />import android.widget.Button;<br />import android.widget.TextView;<br /><br />import java.util.ArrayList;<br />import java.util.Collections;<br /><br />public class MainActivity extends AppCompatActivity {<br />    //deklarujemy dwa pola, oba wykorzystują pakiet widget<br />    TextView textView;<br />    Button button;<br /><br />    @Override<br />    protected void onCreate(Bundle savedInstanceState) {<br />        super.onCreate(savedInstanceState);<br />        setContentView(R.layout.activity_main);<br />        //inicjuję moje pola<br />        textView = (TextView) findViewById(R.id.textview); //rzutujemy na konkretny typ<br />        button = (Button) findViewById(R.id.button);<br /><br />        //co się stanie gdy klikniemy<br />        button.setOnClickListener(new View.OnClickListener() {<br />            @Override<br />            public void onClick(View view) {<br />                //tworzymy listę liczb<br />                ArrayList&lt;Integer&gt; list = new ArrayList&lt;&gt;();<br />                for (int i=1; i&lt;=49; i++){<br />                    list.add(i);<br />                }<br />                //mieszamy naszą listę<br />                Collections.shuffle(list);<br />                //wybieramy 6 pierwszych liczb i ustawiamy w kolejności rosnącej<br />                ArrayList&lt;Integer&gt; choosen = new ArrayList&lt;&gt;();<br />                for (int i=0; i&lt;6; i++){<br />                    choosen.add(list.get(i));<br />                }<br />                //sortujemy rosnąco<br />                Collections.sort(choosen);<br /><br />                //z wylosowanych liczb tworzę łańcuch liczb oddzielonych przecinkami<br />                StringBuilder readList = new StringBuilder();<br />                for (int i: choosen) {<br />                    readList.append(String.valueOf(i));<br />                    readList.append(", ");<br />                }<br />                //zamieniamy StringBuilder na łańcuch znaków i kasujemy ostatni przecinek i spację<br />                textView.setText(readList.toString().replaceAll(", $",""));<br />            }<br />        });<br />    }<br />}</pre>
<p>Jeżeli podejrzymy sobie nasz widok aplikacji w Design, okaże się, że mamy 3 ostrzeżenia. Dotyczą one 2 tekstów i grafiki. Zawartość wyświetlanych stringów powinna być zdefiniowana w kodzie jako zmienna, natomiast grafika powinna posiadać tekst alternatywny dla osób niepełnosprawnych zgodnie z wytycznymi WCAG.</p>
<p>Po podejrzeniu błędu klikamy fix. Przeglądamy plik strings.xml w folderze res/values i widzimy, że dodały się wspomniane wcześniej stringi.</p>
<p>Teraz uruchomimy aplikację na emulatorze:</p>
<ul>
<li>otwieramy <a href="https://developer.android.com/studio/run/managing-avds">managera urządzeń wirtualnych</a>: Tools-&gt;AVD Manager</li>
<li>dodajemy urządzenie na jakim chcemy testować aplikację i startujemy</li>
<li>w Android Studio wybieramy &#8222;Run app&#8221;</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3166" src="https://kamakaczmarek.net/wp-content/uploads/lottoapp.png" alt="" width="414" height="862" srcset="https://kamakaczmarek.net/wp-content/uploads/lottoapp.png 414w, https://kamakaczmarek.net/wp-content/uploads/lottoapp-144x300.png 144w" sizes="(max-width: 414px) 100vw, 414px" /></p>
<p>Zadanie:</p>
<p>Przetestuj aplikację na innym urządzeniu stworzonym przez siebie</p>
<p>Artykuł <a href="https://kamakaczmarek.net/6-android-tworzymy-pierwsza-aplikacje-w-android-studio/">6. Android &#8211; tworzymy pierwszą aplikację w Android Studio</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>5. Android &#8211; ViewGroup: LinearLayout, RelativeLayout</title>
		<link>https://kamakaczmarek.net/5-android-viewgroup-linearlayout-relativelayout/</link>
		
		<dc:creator><![CDATA[Kama]]></dc:creator>
		<pubDate>Fri, 10 Sep 2021 16:47:38 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android]]></category>
		<guid isPermaLink="false">https://kamakaczmarek.net/?p=3102</guid>

					<description><![CDATA[<p>W UI nie wyświetlamy tylko jednego elementu na raz, zwykle jest ich znacznie więcej. Korzystamy wtedy z rozkładów (layoutów), dzięki którym możemy odpowiednio pogrupować elementy w widoku. ViewGroup jest klasą abstrakcyjną, a jak wiemy z programowania obiektowego, nie da się utworzyć obiektu takiej klasy. Jeżeli mamy do czynienia z klasą dziedziczącą po klasie abstrakcyjnej, to [&#8230;]</p>
<p>Artykuł <a href="https://kamakaczmarek.net/5-android-viewgroup-linearlayout-relativelayout/">5. Android &#8211; ViewGroup: LinearLayout, RelativeLayout</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>W UI nie wyświetlamy tylko jednego elementu na raz, zwykle jest ich znacznie więcej.</p>
<p>Korzystamy wtedy z rozkładów (layoutów), dzięki którym możemy odpowiednio pogrupować elementy w widoku.</p>
<p>ViewGroup jest klasą abstrakcyjną, a jak wiemy z programowania obiektowego, nie da się utworzyć obiektu takiej klasy. Jeżeli mamy do czynienia z klasą dziedziczącą po klasie abstrakcyjnej, to obiekt takiej klasy możemy stworzyć. Klasami dziedziczącymi po ViewGroup są m.in.: LinearLayout, RelativeLayout oraz GridLayout.</p>
<p>Layouty mogą być kontenerami dla innych layoutów oraz elementów widoku. W skrócie możemy je w sobie zagnieżdżać.</p>
<p><a href="https://developer.android.com/guide/topics/ui/layout/linear.html#Example"><em><strong>LinearLayout</strong></em> &#8211;&nbsp;</a>Jeden z najpopularniejszych layoutów, który układa elementy w pionowej kolumnie lub poziomym rzędzie.</p>
<ul>
<li><em><strong>android:orientation</strong></em> &#8211; określenie kieruknu: horisontal/vertical</li>
<li><em><strong>android:layout_weight</strong></em> &#8211; waga elementu, czyli wielkość obszaru jaki będzie element zajmował</li>
</ul>
<p>Przykład użycia:</p>
<pre>&lt;LinearLayout<br />    xmlns:android="http://schemas.android.com/apk/res/android"<br />    android:layout_width="match_parent"<br />    android:layout_height="match_parent"<br />    android:orientation="vertical"&gt;<br /><br />    &lt;TextView<br />        android:layout_width="wrap_content"<br />        android:layout_height="wrap_content"<br />        android:layout_weight="1"<br />        android:text="some content 1"<br />        android:textSize="30sp"<br />        android:background="#c0c0c0"<br />    /&gt;<br /><br />    &lt;TextView<br />        android:layout_width="wrap_content"<br />        android:layout_height="wrap_content"<br />        android:layout_weight="2"<br />        android:text="some content 2"<br />        android:textSize="30sp"<br />        android:background="#aaaaaa"<br />    /&gt;<br /><br />    &lt;TextView<br />        android:layout_width="wrap_content"<br />        android:layout_height="wrap_content"<br />        android:text="some content 3"<br />        android:textSize="30sp"<br />        android:background="#aabbbc"<br />    /&gt;<br /><br />&lt;/LinearLayout&gt;</pre>
<p>Linijka <em><strong>xmlns:android=&#8221;http://schemas.android.com/apk/res/android&#8221; </strong></em>wskazuje na używaną przestrzeń nazw.</p>
<p>Zadanie:</p>
<p>Wykorzystując dotychczas zdobytą wiedzę i korzystając z pomocy dokumentacji spróbuj odtworzyć widoczny poniżej layout:</p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-3111 aligncenter" src="https://kamakaczmarek.net/wp-content/uploads/zadLL.png" alt="" width="349" height="595" srcset="https://kamakaczmarek.net/wp-content/uploads/zadLL.png 349w, https://kamakaczmarek.net/wp-content/uploads/zadLL-176x300.png 176w" sizes="(max-width: 349px) 100vw, 349px" /></p>
<p>&nbsp;</p>
<p><a href="https://developer.android.com/guide/topics/ui/layout/relative"><em><strong>RelativeLayout</strong></em> &#8211; </a>układa elementy względnie, czyli względem innych elementów lub rozkładu.</p>
<ul>
<li><em><strong>android:layout_alignParent&#8230;</strong></em>&#8211; Bottom/Left/Right/Top &#8211; określenie położenia względem rozkładu</li>
<li><em><strong>android:layout_center&#8230;</strong></em> -Horizontal/Vertical &#8211; gdy chcemy wyśrodkować element w rodzicu/rozkładzie</li>
<li><span class="devsite-heading" role="heading" aria-level="3"><em><strong>android:layout_<wbr />below</strong></em> &#8211; możemy użyć celem umieszczenia elementu pod innym elementem, ale ten musi mieć przypisane ID<br /></span></li>
</ul>
<p>Przykład użycia:</p>
<pre>&lt;RelativeLayout<br />    xmlns:android="http://schemas.android.com/apk/res/android"<br />    android:layout_width="match_parent"<br />    android:layout_height="match_parent"&gt;<br /><br /><br />    &lt;ImageView <br />        android:src="@drawable/rocks"<br />        android:layout_width="wrap_content"<br />        android:layout_height="wrap_content"<br />        android:scaleType="centerCrop"<br />    /&gt;<br /><br />    &lt;TextView<br />        android:layout_width="match_parent"<br />        android:layout_height="wrap_content"<br />        android:padding="20dp"<br />        android:gravity="center"<br />        android:text="Mój relatywny layout"<br />        android:textSize="28sp"<br />        android:textColor="#000"<br />        android:background="#fff"<br />    /&gt;<br /><br />    &lt;Button<br />        android:layout_width="wrap_content"<br />        android:layout_height="wrap_content"<br />        android:padding="10dp"<br />        android:text="button1"<br />        android:textSize="20sp" <br />        android:layout_alignParentBottom="true"<br />        android:background="#fff"<br />    /&gt;<br />    &lt;Button<br />        android:layout_width="wrap_content"<br />        android:layout_height="wrap_content"<br />        android:padding="10dp"<br />        android:text="button2"<br />        android:textSize="20sp" <br />        android:layout_alignParentBottom="true"<br />        android:layout_alignParentRight="true"<br />        android:background="#fff"<br />    /&gt;<br /><br />&lt;/RelativeLayout&gt;</pre>
<p>Artykuł <a href="https://kamakaczmarek.net/5-android-viewgroup-linearlayout-relativelayout/">5. Android &#8211; ViewGroup: LinearLayout, RelativeLayout</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>4. Android &#8211; ImageView</title>
		<link>https://kamakaczmarek.net/4-android-imageview/</link>
		
		<dc:creator><![CDATA[Kama]]></dc:creator>
		<pubDate>Fri, 10 Sep 2021 09:40:18 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<guid isPermaLink="false">https://kamakaczmarek.net/?p=3091</guid>

					<description><![CDATA[<p>Elementem interfejsu użytkownika (UI), który jest odpowiedzialny za wyświetlanie zasobów graficznych jest ImageView. Jest to klasa Javy dziedzicząca po klasie View i Object. Przejdźmy do Visualizera i rozpocznijmy tworzenie elementów. Objaśnienia poszczególnych atrybutów poniżej kodu: &#60;ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/fall" android:scaleType="centerCrop"/&#62; android: &#8211; oznacza użycie przestrzeni nazw języka XML dedykowanej dla platformy Android, czyli po prostu [&#8230;]</p>
<p>Artykuł <a href="https://kamakaczmarek.net/4-android-imageview/">4. Android &#8211; ImageView</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Elementem interfejsu użytkownika (UI), który jest odpowiedzialny za wyświetlanie zasobów graficznych jest <a href="https://developer.android.com/reference/android/widget/ImageView"><strong>ImageView</strong></a>.</p>
<p>Jest to klasa Javy dziedzicząca po klasie View i Object.</p>
<p>Przejdźmy do <a href="https://labs.udacity.com/android-visualizer/">Visualizera</a> i rozpocznijmy tworzenie elementów. Objaśnienia poszczególnych atrybutów poniżej kodu:</p>
<pre>&lt;ImageView<br />    android:layout_width="match_parent"<br />    android:layout_height="match_parent"<br />    android:src="@drawable/fall"<br />    android:scaleType="centerCrop"<br />/&gt;</pre>
<p><em><strong>android:</strong></em> &#8211; oznacza użycie przestrzeni nazw języka XML dedykowanej dla platformy Android, czyli po prostu otwieramy paczkę, z której wyciągamy konkretne atrybuty (to taka jakby ścieżka dostępu).</p>
<p><em><strong>layout_width, layout_height &#8211;</strong></em> szerokość i wysokość elementu, ten zapis stosujemy we wszystkich widokach na jakich pracujemy</p>
<ul>
<li><em><strong>wrap_content</strong></em> &#8211; dynamiczne dostosowanie wielkości do zawartości</li>
<li><em><strong>match_parent</strong> </em>&#8211; dostosowanie wielkości do elementu nadrzędnego, np. ekranu telefonu</li>
<li><em><strong>dp</strong> </em>&#8211; np. 300dp, &#8222;dp&#8221; to jednostka niezależna od rozdzielczości urządzenia i nie wpływają na nią ustawienia telefonu, związana jest z gęstością ekranu (ilość pikseli w określonej przestrzeni ekranu). Zostaje automatycznie przeskalowana na urządzeniach z różną gęstością. 1dp = 1px dla gęstości 160dpi, w przypadku uruchomienia aplikacji na urządzeniu o gęstości innej niż 160, wartość zostanie przeskalowana wg wzoru: px=dp*(dpi/160).</li>
</ul>
<p><em><strong>android:src</strong></em> &#8211; wgrywanie obrazka, źródło obrazka</p>
<ul>
<li><em><strong>&#8222;@drawable/fall&#8221;</strong></em> &#8211; podajemy ścieżkę dostępu do obrazka jaki chcemy wyświetlić. Kiedy zaczniemy korzystać z AndroidStudio, taką właśnie strukturę będziemy wykorzystywać i taką strukturę ma nasz Visualizer. Na stronie Visualizera, w prawym dolnym rogu klknij &#8222;AVAILABLE IMAGES&#8221; i zobaczysz z jakich grafik możesz skorzystać na tą chwilę. Nie musimy podawać rozszerzenia grafiki.</li>
</ul>
<p><em><strong>scaleType</strong> </em>&#8211; skalowanie obrazka (wszystkie opcje na stronie dokumentacji)</p>
<ul>
<li><em><strong>centerCrop</strong> </em>&#8211; rozciąga obrazek wertykalnie i obcina krawędzie</li>
</ul>
<p>Artykuł <a href="https://kamakaczmarek.net/4-android-imageview/">4. Android &#8211; ImageView</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>3. Android &#8211; TextView</title>
		<link>https://kamakaczmarek.net/3-android-textview/</link>
		
		<dc:creator><![CDATA[Kama]]></dc:creator>
		<pubDate>Fri, 10 Sep 2021 09:02:52 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android]]></category>
		<guid isPermaLink="false">https://kamakaczmarek.net/?p=3059</guid>

					<description><![CDATA[<p>Rozpoczynając tworzenie aplikacji musimy poukładać w widoku nasze klocki, jednym z nich jest warstwa odpowiedzialna za wyświetlanie tekstu, czyli TextView. TextView jest klasą Javy, która dziedziczy po klasie nadrzędnej View oraz Object. Każdy element powinien mieć zdefiniowane podstawowe atrybuty np. szerokość i wysokość. Przejdźmy do Visualizera i rozpocznijmy tworzenie elementów. Objaśnienia poszczególnych atrybutów poniżej kodu: [&#8230;]</p>
<p>Artykuł <a href="https://kamakaczmarek.net/3-android-textview/">3. Android &#8211; TextView</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Rozpoczynając tworzenie aplikacji musimy poukładać w widoku nasze klocki, jednym z nich jest warstwa odpowiedzialna za wyświetlanie tekstu, czyli <a href="https://developer.android.com/reference/android/widget/TextView?hl=en"><strong>TextView</strong></a>.</p>
<p>TextView jest klasą Javy, która dziedziczy po klasie nadrzędnej View oraz Object.</p>
<p>Każdy element powinien mieć zdefiniowane podstawowe atrybuty np. szerokość i wysokość.</p>
<p>Przejdźmy do <a href="https://labs.udacity.com/android-visualizer/">Visualizera</a> i rozpocznijmy tworzenie elementów. Objaśnienia poszczególnych atrybutów poniżej kodu:</p>
<pre>&lt;TextView<br />    android:text="Witaj w mojej aplikacji!"<br />    android:layout_width="match_parent"<br />    android:layout_height="wrap_content"<br />    android:textSize="36sp"<br />    android:textStyle="bold|italic"<br />    android:fontFamily="sans-serif"<br />    android:textColor="@android:color/black"<br />    android:background="#c0c0c0" <br />    android:gravity="center"<br />    android:padding="30dp"<br />    android:layout_marginTop="15dp"<br />/&gt;</pre>
<p><em><strong>android:</strong></em> &#8211; oznacza użycie przestrzeni nazw języka XML dedykowanej dla platformy Android, czyli po prostu otwieramy paczkę, z której wyciągamy konkretne atrybuty (to taka jakby ścieżka dostępu).</p>
<p><em><strong>layout_width, layout_height &#8211;</strong></em> szerokość i wysokość elementu, ten zapis stosujemy we wszystkich widokach na jakich pracujemy</p>
<ul>
<li><em><strong>wrap_content</strong></em> &#8211; dynamiczne dostosowanie wielkości do zawartości</li>
<li><em><strong>match_parent</strong> </em>&#8211; dostosowanie wielkości do elementu nadrzędnego, np. ekranu telefonu</li>
<li><em><strong>dp</strong> </em>&#8211; np. 300dp, &#8222;dp&#8221; to jednostka niezależna od rozdzielczości urządzenia i nie wpływają na nią ustawienia telefonu, związana jest z gęstością ekranu (ilość pikseli w określonej przestrzeni ekranu). Zostaje automatycznie przeskalowana na urządzeniach z różną gęstością. 1dp = 1px dla gęstości 160dpi, w przypadku uruchomienia aplikacji na urządzeniu o gęstości innej niż 160, wartość zostanie przeskalowana wg wzoru: px=dp*(dpi/160).</li>
</ul>
<p><em><strong>text</strong> </em>&#8211; treść do wyświetlenia</p>
<p><em><strong>textSize</strong> </em>&#8211; rozmiar tekstu, np 36sp, &#8222;sp&#8221; to jednostka niezależna od rozdzielczości urządzenia, którą można modyfikować ustawieniami urządzenia, związana jest z gęstością ekranu (ilość pikseli w określonej przestrzeni ekranu). Zostaje automatycznie przeskalowana gdy zmienimy w urządzeniu ustawienia rozmiaru czcionki. W trybie &#8222;normalny&#8221; 1sp=1 * dp, gdzie 1 to współczynnik proporcji dla urządzenia.</p>
<p><em><strong>textStyle</strong> </em>&#8211; styl tekstu, domyślnie: normal; za pomocą separatora | można dodawać kolejne własności elementu</p>
<p><em><strong>textColor</strong> </em>&#8211; kolor obiektu, podajemy w hexie lub @android:color/black</p>
<p><em><strong>fontFamily</strong> </em>&#8211; krój czcionki</p>
<p><em><strong>background</strong> </em>&#8211; kolor tła</p>
<p><em><strong>gravity</strong> </em>&#8211; położenie elementu, podstawowe ustawienia to:</p>
<ul>
<li>bottom/top</li>
<li>left/right</li>
<li>center &#8211; wyśrodkowanie</li>
<li>więcej w <a href="https://developer.android.com/reference/android/R.styleable#TextView_gravity">dokumentacji</a></li>
</ul>
<p><em><strong>padding</strong> </em>&#8211; margines wewnętrzny dla wszystkich stron lub <em><strong>paddingLeft, paddingRight, paddingTop, paddingBottom</strong></em></p>
<p><em><strong>layout_margin</strong> </em>&#8211; margines zewnętrzny dla wszystkich stron lub <em><strong>layout_marginLeft</strong></em>, <em><strong>layout_marginRight, layout_marginTop, layout_marginBottom</strong></em></p>
<p>Zadanie</p>
<p>Przeanalizuj dokumentację elementu TextView. Przypomnij sobie z języka HTML jak należy wyświetlać znaki specjalne w &#8222;bezpieczny&#8221; sposób i odtwórz w kodzie XML następujący widok:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3072" src="https://kamakaczmarek.net/wp-content/uploads/ZadanieTextView.png" alt="" width="316" height="593" srcset="https://kamakaczmarek.net/wp-content/uploads/ZadanieTextView.png 316w, https://kamakaczmarek.net/wp-content/uploads/ZadanieTextView-160x300.png 160w" sizes="(max-width: 316px) 100vw, 316px" /></p>
<p>&nbsp;</p>
<p>Artykuł <a href="https://kamakaczmarek.net/3-android-textview/">3. Android &#8211; TextView</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>2. Android &#8211; podstawy</title>
		<link>https://kamakaczmarek.net/2-android-podstawy/</link>
		
		<dc:creator><![CDATA[Kama]]></dc:creator>
		<pubDate>Fri, 10 Sep 2021 08:51:16 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[podstawy]]></category>
		<guid isPermaLink="false">https://kamakaczmarek.net/?p=3013</guid>

					<description><![CDATA[<p>W tej części poznamy: podstawy interfejsu użytkownika podstawowe elementy View, czyli widoku korzystamy Android Layout Visualiser podstawy XML Interfejs Interfejs(UI) to wszystko to, co użytkownik widzi i może wejść w interakcję. Niezmiernie skomplikowaną sprawą jest stworzenie uniwersalnego UI dla wszystkich istniejących urządzeń: telefony, tablety, TV, smartwatch, ekrany samochodowe, komputery i wiele innych. Poza różnorodnością rozdzielczości [&#8230;]</p>
<p>Artykuł <a href="https://kamakaczmarek.net/2-android-podstawy/">2. Android &#8211; podstawy</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>W tej części poznamy:</p>
<ul>
<li>podstawy interfejsu użytkownika</li>
<li>podstawowe elementy View, czyli widoku</li>
<li>korzystamy <a href="https://labs.udacity.com/android-visualizer/">Android Layout Visualiser</a></li>
<li>podstawy XML</li>
</ul>
<h2>Interfejs</h2>
<p>Interfejs(UI) to wszystko to, co użytkownik widzi i może wejść w interakcję. Niezmiernie skomplikowaną sprawą jest stworzenie uniwersalnego UI dla wszystkich istniejących urządzeń: telefony, tablety, TV, smartwatch, ekrany samochodowe, komputery i wiele innych. Poza różnorodnością rozdzielczości wielu urządzeń musimy się zmierzyć jeszcze w możliwością pracy tych urządzeń w 2 formach wyświetlania zawartości: pionowym i poziomym.</p>
<p>&nbsp;</p>
<h2>View</h2>
<p>Widok (View), czyli podstawowy element naszej aplikacji, to nic innego jak kontener, który przechowuje widoczne dla nas elementy. Jest to podstawowa struktura, która mieści w sobie elementy potomne, jest klasą napisaną w Javie i dziedziczącą po klasie Object. Więcej na ten temat możesz przeczytać <a href="https://developer.android.com/reference/android/view/View">tutaj</a>.</p>
<p>Musisz mieć świadomość, że to co widzisz na ekranie nie jest płaską konstrukcją jak namalowany obrazek, to są raczej budowle z klocków np. Lego. Poszczególne elementy widoku są poustawiane na sobie, obok siebie, mogą być rozdzielane określoną przestrzenią i tak z 1 widocznego elementu otrzymujemy wiele klocków, które go budują.</p>
<p>Elementy składające się na konkretny &#8222;kafelek&#8221; mają swoje nazwy i tak:</p>
<ul>
<li>tekst wyświetlany to TextView</li>
<li>obrazek to ImageView</li>
<li>przycisk to Button</li>
<li>LinearLayout</li>
<li>RelativeLayout</li>
</ul>
<p>Wyżej wymienione elementy możemy podejrzeć na swoim telefonie używając <a href="https://kamakaczmarek.net/telefon-z-androidem-opcje-programistyczne/" target="_blank" rel="noopener">opcji programistycznych</a> i wybierając &#8222;Pokazywanie granic układu&#8221;. Zobaczymy wtedy granice wszystkich elementów składających się na konkretny widok.</p>
<p>Nazwy elementów przedstawione powyżej są tak naprawdę nazwami klas języka Java, które funkcjonują dla Androida w klasie View, dziedziczą po klasie Object. Przykładowa lista ze strony dokumentacji, która jest jedynie kroplą w morzu dostępnych klas:<a href="https://developer.android.com/reference/android/view/View"><img loading="lazy" decoding="async" class="aligncenter wp-image-3055 size-full" src="https://kamakaczmarek.net/wp-content/uploads/View.png" alt="https://developer.android.com/reference/android/view/View" width="586" height="769" srcset="https://kamakaczmarek.net/wp-content/uploads/View.png 586w, https://kamakaczmarek.net/wp-content/uploads/View-229x300.png 229w" sizes="(max-width: 586px) 100vw, 586px" /></a></p>
<h2>Visualizer</h2>
<p>Na początkowym etapie nauki będziemy korzystali z narzędzia Visualizer. To prosta aplikacja, która w locie pokazuje nam zmiany jakie wprowadzamy w kodzie.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3100" src="https://kamakaczmarek.net/wp-content/uploads/Visualizer.png" alt="" width="886" height="879" srcset="https://kamakaczmarek.net/wp-content/uploads/Visualizer.png 886w, https://kamakaczmarek.net/wp-content/uploads/Visualizer-300x298.png 300w, https://kamakaczmarek.net/wp-content/uploads/Visualizer-150x150.png 150w, https://kamakaczmarek.net/wp-content/uploads/Visualizer-768x762.png 768w" sizes="(max-width: 886px) 100vw, 886px" /></p>
<p>Miejmy na uwadze, że nie będzie ona w stanie obsłużyć wszystkich opcji dostępnych dla języka XML, ma ona dostęp tylko do podstawowych poleceń.</p>
<p>Na dole ekranu są widoczne przyciski:</p>
<p><em>available images</em> &#8211; który zawiera dostępne grafiki do testowania</p>
<p><em>cheat sheet</em> &#8211; lista dostępnych widoków dla Android</p>
<h2>XML</h2>
<p>Jak wspomniałam w poprzednim wpisie, UI tworzy się przy pomocy XML, czyli rozszerzalnego języka znaczników. Jest on niezależny od platformy i służy do prostego reprezentowania danych. W języku tym dane mają format tekstowy i są możliwe do odczytu dla ludzi i maszyn. W tym języku sami definiujemy elementy, nie jesteśmy niczym ograniczeni, nie ma odgórnie określonych nazw tagów.</p>
<p>Na tym etapie będziesz potrzebował podstawowej wiedzy nt kodowania w XMLu (<a href="https://www.w3schools.com/xml/">proponuję następujący kurs</a>). Poniżej przypomnienie jedynie podstawowych zasad.</p>
<h4>Prolog</h4>
<p>Pierwszy wiersz naszego kodu powinien zawierać linijkę zwaną &#8222;prologiem&#8221;, która zawiera podstawowe informacje o wersji języka i kodowaniu znaków, mogą się w niej również znaleźć informacje opisujące dany dokument bardziej szczegółowo:</p>
<pre class="highlight"><code class="prettyprint lang-sql" style="font-size: 0.85em;"><span class="cp">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span></code></pre>
<h4>Tagi</h4>
<p>W języku XML kodujemy za pomocą tagów, czyli konkretnych poleceń zawartych w nawiasach ostrych &lt;&gt;. Każdy tag powinien mieć następującą budowę:</p>
<pre><strong>&lt;to_jest_tag_otwierający&gt;</strong>treść do wyświetlenia<strong>&lt;/to_jest_tag_zamykający&gt;</strong></pre>
<p>lub jeżeli nie ma treści</p>
<pre><strong>&lt;</strong>to_jest_tag_samozamykający atrybut="blablabla"<strong>/&gt; </strong></pre>
<p>Wewnątrz tagów umieszczamy również atrybuty, tak samo jak w HTMLu.</p>
<h4>Struktura drzewiasta</h4>
<p>Poprawnie skonstruowany dokument XML posiada jeden główny element, zwany &#8222;root&#8221;, wewnątrz którego można zagnieżdżać kolejne elementy.</p>
<p>Poniżej widać strukturę drzewiastą HTML, w podobny sposób można przedstawić strukturę dokumentu XML</p>
<p><img decoding="async" class="tc-smart-loaded" src="http://www.kurshtml.edu.pl/pliki/drzewo.gif" alt="Drzewo dokumentu"/></p>
<h4><strong>&lt;!– komentarz –&gt;</strong></h4>
<p>nie będzie widoczny na stronie, widoczny tylko w kodzie źródłowym</p>
<pre class="wp-block-preformatted prettyprint prettyprinted"><span class="com">&lt;!-- Ten tekst
zostanie zignorowany
przez przeglądarkę --&gt;</span></pre>
<h4>O czym należy pamiętać!</h4>
<ol>
<li>Zawsze zamykamy tagi.</li>
<li>Używamy wcięć.</li>
<li>Dokument powinien posiadać 1 główny root.</li>
<li>XML nie tworzy graficznego UI jedynie reprezentuje jego strukturę odwołując się do nazw klas Javy. Te klasy funkcjonują w przestrzeni nazw dedykowanej dla Androida.</li>
</ol>
<h4>Przykładowy plik XML</h4>
<pre><code class="prettyprint lang-sql" style="font-size: 0.85em;"><span class="cp">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br /></span></code><code class="prettyprint lang-sql" style="font-size: 0.85em;"><span class="nt">&lt;news&gt;</span>
    <span class="nt">&lt;article </span><span class="na">date=</span><span class="s">”2021-09-01”</span><span class="nt">&gt;</span>
        <span class="nt">&lt;tytul&gt;</span>Rozpoczęcie roku szkolnego<span class="nt">&lt;/tytul&gt;</span>
        <span class="nt">&lt;autor&gt;</span>Jan Kowalski<span class="nt">&lt;/autor&gt;</span> 
    <span class="nt">&lt;/article&gt;</span> 
    <span class="nt">&lt;article&gt;</span> 
        <span class="c">&lt;!-- tutaj można wpisać dodatkową treść --&gt;</span> 
    <span class="nt">&lt;/article&gt;</span>
    <span class="nt">&lt;opis</span> <span class="na">status=</span><span class="s">”szkic</span><span class="err">”</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/news&gt;</span></code></pre>
<h4>Zadanie</h4>
<p>Stwórz plik XML przechowujący katalog twoich ulubionych książek. Uzupełnij go o min. 5 pozycji. Elementy, które powinny się znaleźć to: &#8222;prolog&#8221;, tytuł, autor, ilość stron, rodzaj oprawy i krótka recenzja.</p>
<p>Artykuł <a href="https://kamakaczmarek.net/2-android-podstawy/">2. Android &#8211; podstawy</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Telefon z Androidem &#8211; opcje programistyczne</title>
		<link>https://kamakaczmarek.net/telefon-z-androidem-opcje-programistyczne/</link>
		
		<dc:creator><![CDATA[Kama]]></dc:creator>
		<pubDate>Thu, 09 Sep 2021 11:58:59 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Bez kategorii]]></category>
		<category><![CDATA[telefon]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[programista]]></category>
		<guid isPermaLink="false">https://kamakaczmarek.net/?p=3032</guid>

					<description><![CDATA[<p>Czy zastanawialiście się kiedyś, gdzie są te wszystkie ukryte opcje w Waszych telefonach i jak się do nich &#8222;dobrać&#8221;? Tylko dla doświadczonych użytkowników. Robisz to na własne ryzyko! Oto krótki tutorial (testowane na Xiaomi Mi 10): 1. Wchodzimy w ustawienia naszego telefonu i wybieramy &#8222;O telefonie&#8221;. W innych modelach szukajcie właśnie zakładki &#8222;Informacje o telefonie&#8221;, [&#8230;]</p>
<p>Artykuł <a href="https://kamakaczmarek.net/telefon-z-androidem-opcje-programistyczne/">Telefon z Androidem &#8211; opcje programistyczne</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Czy zastanawialiście się kiedyś, gdzie są te wszystkie ukryte opcje w Waszych telefonach i jak się do nich &#8222;dobrać&#8221;?</p>
<h3>Tylko dla doświadczonych użytkowników. Robisz to na własne ryzyko!</h3>
<p>Oto krótki tutorial (testowane na Xiaomi Mi 10):</p>
<p>1. Wchodzimy w ustawienia naszego telefonu i wybieramy &#8222;O telefonie&#8221;. W innych modelach szukajcie właśnie zakładki &#8222;Informacje o telefonie&#8221;, musimy dotrzeć do ekranu, na którym będzie widoczna wersja zainstalowanego oprogramowania.</p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-3038 alignleft" src="https://kamakaczmarek.net/wp-content/uploads/Android-opcje-programistyczne-7.jpg" alt="" width="405" height="878" srcset="https://kamakaczmarek.net/wp-content/uploads/Android-opcje-programistyczne-7.jpg 405w, https://kamakaczmarek.net/wp-content/uploads/Android-opcje-programistyczne-7-138x300.jpg 138w" sizes="(max-width: 405px) 100vw, 405px" /></p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-3035 alignnone" src="https://kamakaczmarek.net/wp-content/uploads/Android-opcje-programistyczne-4.jpg" alt="" width="405" height="878" srcset="https://kamakaczmarek.net/wp-content/uploads/Android-opcje-programistyczne-4.jpg 405w, https://kamakaczmarek.net/wp-content/uploads/Android-opcje-programistyczne-4-138x300.jpg 138w" sizes="(max-width: 405px) 100vw, 405px" /></p>
<p> </p>
<p style="text-align: left;">2. Kilkukrotnie dotykamy wyświetlonej wersji oprogramowania na naszym telefonie &#8211; na screenie MIUI Global 12.5.1. Po wykonaniu poprawnie operacji, wyświetlą nam się kolejno komunikaty jak na zdjęciach poniżej.</p>
<p><img loading="lazy" decoding="async" class="wp-image-3036 size-full alignleft" src="https://kamakaczmarek.net/wp-content/uploads/Android-opcje-programistyczne-5.jpg" alt="" width="405" height="878" srcset="https://kamakaczmarek.net/wp-content/uploads/Android-opcje-programistyczne-5.jpg 405w, https://kamakaczmarek.net/wp-content/uploads/Android-opcje-programistyczne-5-138x300.jpg 138w" sizes="(max-width: 405px) 100vw, 405px" /></p>
<p><img loading="lazy" decoding="async" class="wp-image-3037 size-full alignnone" src="https://kamakaczmarek.net/wp-content/uploads/Android-opcje-programistyczne-6.jpg" alt="" width="405" height="878" srcset="https://kamakaczmarek.net/wp-content/uploads/Android-opcje-programistyczne-6.jpg 405w, https://kamakaczmarek.net/wp-content/uploads/Android-opcje-programistyczne-6-138x300.jpg 138w" sizes="(max-width: 405px) 100vw, 405px" /></p>
<p> </p>
<p style="text-align: left;">3. Wracamy do ekranu Ustawienia i wchodzimy w &#8222;Dodatkowe ustawienia&#8221; następnie &#8222;Opcje programistyczne&#8221; lub po prostu wyszukujemy &#8222;Opcje programistyczne&#8221;. I tutaj możemy je też wyłączyć.</p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-3041 alignleft" src="https://kamakaczmarek.net/wp-content/uploads/Android-opcje-programistyczne-3.jpg" alt="" width="405" height="878" srcset="https://kamakaczmarek.net/wp-content/uploads/Android-opcje-programistyczne-3.jpg 405w, https://kamakaczmarek.net/wp-content/uploads/Android-opcje-programistyczne-3-138x300.jpg 138w" sizes="(max-width: 405px) 100vw, 405px" /></p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-3040 alignnone" src="https://kamakaczmarek.net/wp-content/uploads/Android-opcje-programistyczne-2.jpg" alt="" width="405" height="878" srcset="https://kamakaczmarek.net/wp-content/uploads/Android-opcje-programistyczne-2.jpg 405w, https://kamakaczmarek.net/wp-content/uploads/Android-opcje-programistyczne-2-138x300.jpg 138w" sizes="(max-width: 405px) 100vw, 405px" /></p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3039" src="https://kamakaczmarek.net/wp-content/uploads/Android-opcje-programistyczne-1.jpg" alt="" width="405" height="878" srcset="https://kamakaczmarek.net/wp-content/uploads/Android-opcje-programistyczne-1.jpg 405w, https://kamakaczmarek.net/wp-content/uploads/Android-opcje-programistyczne-1-138x300.jpg 138w" sizes="(max-width: 405px) 100vw, 405px" /></p>
<p>I tyle <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Miłej zabawy.</p>
<p>Artykuł <a href="https://kamakaczmarek.net/telefon-z-androidem-opcje-programistyczne/">Telefon z Androidem &#8211; opcje programistyczne</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>1. Android &#8211; wstęp, historia, działanie</title>
		<link>https://kamakaczmarek.net/1-android-wstep-historia-dzialanie/</link>
		
		<dc:creator><![CDATA[Kama]]></dc:creator>
		<pubDate>Thu, 09 Sep 2021 11:26:07 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[android wstęp]]></category>
		<category><![CDATA[wstęp]]></category>
		<guid isPermaLink="false">https://kamakaczmarek.net/?p=3005</guid>

					<description><![CDATA[<p>Android został stworzony przy użyciu języka C i zbudowany na jądrze Linuxa, a dodatki (czyli biblioteki i narzędzia) zostały napisane w Javie. Ale czego używać do tworzenia aplikacji na Androida? Niekwestionowanym liderem wg mnie jest IntelliJ IDEA firmy JetBrains. To doskonałe narzędzie do pisania kodu, którego też używam m.in. w programowaniu w języku Java. Jego [&#8230;]</p>
<p>Artykuł <a href="https://kamakaczmarek.net/1-android-wstep-historia-dzialanie/">1. Android &#8211; wstęp, historia, działanie</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Android został stworzony przy użyciu języka C i zbudowany na jądrze Linuxa, a dodatki (czyli biblioteki i narzędzia) zostały napisane w Javie.</p>
<p>Ale czego używać do tworzenia aplikacji na Androida?</p>
<p>Niekwestionowanym liderem wg mnie jest IntelliJ IDEA firmy JetBrains. To doskonałe narzędzie do pisania kodu, którego też używam m.in. w programowaniu w języku Java. Jego darmowa wersja wspiera tworzenie aplikacji na androida, jednak jeżeli będziemy chcieli napisać taką aplikację przy użyciu HTML, JS i CSS to pozostaje nam wykupienie płatnej wersji (co jest doskonałą inwestycją w przyszłość). W celu pisania aplikacji na Androida przy pomocy IntelliJ należy dodatkowo pobrać i skonfigurować Android SDK.</p>
<p>Jeżeli jeszcze nie stać nas na płatną licencję IntelliJ lub chcemy stworzyć aplikację tylko na Androida, możemy skorzystać z darmowego narzędzia, jakim jest AndroidStudio. Został on dostosowany przez Google tak, aby służył właśnie temu.</p>
<p>Będziemy korzystali właśnie z tego ostatniego rozwiązania, czyli AndroidStudio.</p>
<p>W jakim języku programować na platformę Android?</p>
<p>Do tworzenia aplikacji mobilnych na Androida zwykło się używać:</p>
<ul>
<li>XML do tworzenia UI &#8211; User Interface &#8211; język ten pozwala szybko i łatwo tworzyć oraz modyfikować wygląd naszej aplikacji np. w AndroidStudio. Układ kodu jest przejrzysty i pozwala od razu zobaczyć zmiany, bez konieczności kompilowania i uruchamiania kodu po każdej zmianie.</li>
<li>JAVA do tworzenia warstwy logicznej</li>
<li>SQLite do obsługi baz danych</li>
</ul>
<p>Ten dobór języków jest rekomendowany przez Google.</p>
<p>Oczywiście można użyć innych języków i aplikacji np.</p>
<ul>
<li>HTML, JS i CSS tworząc aplikację w&nbsp; PhoneGap</li>
<li>C# tworząc aplikację w Xamarin</li>
<li>za pomocą silnika Unity w JS, C#</li>
<li>za pomocą silnika Unreal w C++</li>
</ul>
<p>Warto dodatkowo skorzystać z narzędzi np. processing &#8211; do tworzenia wizualizacji graficznych i dźwiękowych oraz takich dostosowanych do VR.</p>
<h4>Wygląd aplikacji &#8211; rekomendacje Google</h4>
<p>Jednym z trendów projektowania aplikacji mobilnych jest Googlowski Material Design dostępny pod adresem: <a href="https://material.io/">material.io</a>.</p>
<p>Główną zasadą projektowania aplikacji jest to, że każdy element ma dokładnie przypisane miejsce w 3-warstwowej hierarchii.</p>
<p>Zasady te opisują jak aplikacja powinna wyglądać oraz jak powinna się zachowywać, a Material Design to coś więcej niż styl, to swoisty język w którym porozumiewają się poszczególne elementy tworzące naszą aplikację.</p>
<p>Na stronie <a href="https://material.io/">Materials Design </a>znajdziemy wiele przydatnych materiałów, zachęcam do zapoznania się z jej treścią. Znajdziecie tam podpowiedzi ad planowania UI, doboru kolorów elementów, czcionki i wiele innych.</p>
<p>Gdzie szukać pomocy?</p>
<p>Najważniejszą zdolnością jaką powinien posiadać każdy człowiek, nie tylko programista, jest umiejętność wyszukiwania informacji. Żadne źródło internetowe nie jest wyczerpującym opracowaniem danego problemu. Należy umiejętnie korzystać z wielu źródeł równolegle. Często nie wystarczy sama dokumentacja języka, dlatego też zalecam korzystanie z platformy StackOverflow, w3schools, Google i innych, na których znajdziemy rozwiązania.</p>
<p>Przykładem problemu na jaki możemy natrafić jest atrybut <a href="https://developer.android.com/reference/android/widget/TextView?hl=en#attr_android:fontFamily"><span class="devsite-heading" role="heading" aria-level="3">android:fontFamily</span></a><span class="devsite-heading" role="heading" aria-level="3">, w dokumentacji nie znajdziemy informacji nt możliwych czcionek do wykorzystania, ale na <a href="https://stackoverflow.com/questions/19691530/valid-values-for-androidfontfamily-and-what-they-map-to">stackoverflow</a> już tak.</span></p>
<h3>Środowisko pracy</h3>
<p>Zanim przejdziemy do AndroidStudio zainstalować należy środowisko JDK, instrukcję i opis znajdziesz <a href="https://kamakaczmarek.net/java-wstep-historia-dzialanie/">w tym materiale</a> oraz edytor kodu np. SublimeText, czy inny w którym lubisz pracować.</p>
<p>Zainstaluj teraz kolejno JDK wg powyższej instrukcji, następnie AndroidStudio oraz preferowany edytor kodu.</p>
<p>Na koniec będziemy musieli zainstalować sterownik USB, by móc testować aplikacje na urządzeniu mobilnym, ale to później.</p>
<h4><strong>AndroidStudio</strong></h4>
<p>Zakładam, że znacie już podstawy Javy (jeżeli nie, niestety od tego musicie zacząć). Zakładam również, że pracowaliście w edytorze IntelliJ (<a href="https://www.udemy.com/course/intellij-idea-ide/">darmowy kurs obsługi programu</a>), ułatwi to bardzo pracę, ponieważ AndroidStudio to zmodyfikowany IntelliJ.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3131" src="https://kamakaczmarek.net/wp-content/uploads/as1.png" alt="" width="965" height="684" srcset="https://kamakaczmarek.net/wp-content/uploads/as1.png 965w, https://kamakaczmarek.net/wp-content/uploads/as1-300x213.png 300w, https://kamakaczmarek.net/wp-content/uploads/as1-768x544.png 768w" sizes="(max-width: 965px) 100vw, 965px" /></p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3130" src="https://kamakaczmarek.net/wp-content/uploads/as2.png" alt="" width="1118" height="815" srcset="https://kamakaczmarek.net/wp-content/uploads/as2.png 1118w, https://kamakaczmarek.net/wp-content/uploads/as2-300x219.png 300w, https://kamakaczmarek.net/wp-content/uploads/as2-1024x746.png 1024w, https://kamakaczmarek.net/wp-content/uploads/as2-768x560.png 768w" sizes="(max-width: 1118px) 100vw, 1118px" /></p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3129" src="https://kamakaczmarek.net/wp-content/uploads/as3.png" alt="" width="1127" height="811" srcset="https://kamakaczmarek.net/wp-content/uploads/as3.png 1127w, https://kamakaczmarek.net/wp-content/uploads/as3-300x216.png 300w, https://kamakaczmarek.net/wp-content/uploads/as3-1024x737.png 1024w, https://kamakaczmarek.net/wp-content/uploads/as3-768x553.png 768w" sizes="(max-width: 1127px) 100vw, 1127px" /></p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3128" src="https://kamakaczmarek.net/wp-content/uploads/as4.png" alt="" width="1356" height="927" srcset="https://kamakaczmarek.net/wp-content/uploads/as4.png 1356w, https://kamakaczmarek.net/wp-content/uploads/as4-300x205.png 300w, https://kamakaczmarek.net/wp-content/uploads/as4-1024x700.png 1024w, https://kamakaczmarek.net/wp-content/uploads/as4-768x525.png 768w" sizes="(max-width: 1356px) 100vw, 1356px" /></p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3127" src="https://kamakaczmarek.net/wp-content/uploads/as5.png" alt="" width="546" height="612" srcset="https://kamakaczmarek.net/wp-content/uploads/as5.png 546w, https://kamakaczmarek.net/wp-content/uploads/as5-268x300.png 268w" sizes="(max-width: 546px) 100vw, 546px" /></p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3126" src="https://kamakaczmarek.net/wp-content/uploads/as6.png" alt="" width="1394" height="996" srcset="https://kamakaczmarek.net/wp-content/uploads/as6.png 1394w, https://kamakaczmarek.net/wp-content/uploads/as6-300x214.png 300w, https://kamakaczmarek.net/wp-content/uploads/as6-1024x732.png 1024w, https://kamakaczmarek.net/wp-content/uploads/as6-768x549.png 768w" sizes="(max-width: 1394px) 100vw, 1394px" /></p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3125" src="https://kamakaczmarek.net/wp-content/uploads/as7.png" alt="" width="1301" height="1038" srcset="https://kamakaczmarek.net/wp-content/uploads/as7.png 1301w, https://kamakaczmarek.net/wp-content/uploads/as7-300x239.png 300w, https://kamakaczmarek.net/wp-content/uploads/as7-1024x817.png 1024w, https://kamakaczmarek.net/wp-content/uploads/as7-768x613.png 768w" sizes="(max-width: 1301px) 100vw, 1301px" /></p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3124" src="https://kamakaczmarek.net/wp-content/uploads/as8.png" alt="" width="1310" height="1036" srcset="https://kamakaczmarek.net/wp-content/uploads/as8.png 1310w, https://kamakaczmarek.net/wp-content/uploads/as8-300x237.png 300w, https://kamakaczmarek.net/wp-content/uploads/as8-1024x810.png 1024w, https://kamakaczmarek.net/wp-content/uploads/as8-768x607.png 768w" sizes="(max-width: 1310px) 100vw, 1310px" /></p>
<h2>WSTAWIĆ FILMIK Z NAGRANYM OPISEM UI PROGRAMU</h2>
<p>Opisać szczegółowo lewy panel z widokiem naszego projektu</p>
<p>Gradle Scripts &#8211; system budowania aplikacji. Jeżeli kończymy pracę nad projektem i chcemy przystąpić do publikacji apki w sklepie, to właśnie Gradle zbiera nasz projekt w całość, w format &#8222;apk&#8221;.</p>
<p>app &#8211; drzewo ze składowymi naszego projektu, a w nim:</p>
<ul>
<li>manifests &#8211; zawierający plik o nazwie <a href="https://developer.android.com/guide/topics/manifest/manifest-intro">AndroidManifest.xml</a> &#8211; zawiera podstawowe informacje dla Androida, bez tego nie uruchomimy aplikacji. Każda aplikacja musi zawierać ten plik o niezmienionej nazwie.</li>
<li>java &#8211; zawiera kody źródłowe javy, główny plik aplikacji to MainActivity. Logika aplikacji.</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Przeanalizujmy linijka po linijce zawartość tego pliku na starcie:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<pre>package com.example.test;<br /><br />import androidx.appcompat.app.AppCompatActivity;<br />import android.os.Bundle;<br /><br />public class MainActivity extends AppCompatActivity {<br />    @Override<br />    protected void onCreate(Bundle savedInstanceState) {<br />        super.onCreate(savedInstanceState);<br />        setContentView(R.layout.activity_main);<br />    }<br />}</pre>
<p><em>package com.example.test;</em> &#8211; jest to nazwa naszego pakietu</p>
<p><em>import&#8230;</em> &#8211; importujemy klasy, których metody/funkcjonalności będziemy wykorzystywać</p>
<p><em>public class MainActivity extends AppCompatActivity {</em> &#8211; klasa MainActivity, która dziedziczy po AppCompatActivity , klasie posiadającej więcej opcji niż Activity</p>
<p><em>@Override</em> &#8211; to słówko oznacza, że coś nadpisujemy, a konkretnie metodę onCreate</p>
<p><em>protected void onCreate(Bundle savedInstanceState) {</em> &#8211; metoda wywoływana podczas uruchamiania aktywności, która w argumencie posiada obiekt typu Bundle, służą one do przesyłania danych między aktywnościami. Metoda onCreate jest równoznaczna z klasą Main w Javie, a Bundle z String[] args.</p>
<p><em>super.onCreate(savedInstanceState);</em> &#8211; wywołujemy metodę onCreate z pierwotnej deklaracji</p>
<p><em>setContentView(R.layout.activity_main);</em> &#8211; tworzy i wyświetla na ekranie zdefiniowany przez nas rozkład (activity_main). </p>
<ul>
<li>res &#8211; czyli zasoby, znajdują się w nim m.in w drawable &#8211; dla grafik, mipmap &#8211; dla ikon, layout &#8211; rozkłady aplikacji, values &#8211; kolory, tablice, style</li>
</ul>
<p>Przydatne strony:</p>
<ul>
<li><a href="https://www.android.com/">https://www.android.com/</a></li>
<li><a href="https://developer.android.com/guide">https://developer.android.com/guide</a></li>
<li><a href="https://developers.google.com/android/for-all/vocab-words?hl=en">słownik z wizualnym objaśnieniem</a></li>
<li><a href="https://developer.android.com/">https://developer.android.com/</a></li>
<li><a href="https://blog.google/products/android/">https://blog.google/products/android/</a></li>
<li><a href="https://stackoverflow.com/">https://stackoverflow.com/</a></li>
<li><a href="https://material.io/">https://material.io/</a></li>
<li><a href="https://material.io/design/color/the-color-system.html#tools-for-picking-colors">narzędzia do wyboru kolorów</a></li>
</ul>
<p>&nbsp;</p>
<p>Artykuł <a href="https://kamakaczmarek.net/1-android-wstep-historia-dzialanie/">1. Android &#8211; wstęp, historia, działanie</a> pochodzi z serwisu <a href="https://kamakaczmarek.net">Kama Kaczmarek</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
