Similar presentations:
Your First Android Project!
1.
Your First Android Project!Sergey Ryabov
11.09.2018
1
2.
You can trust meMobile Consultant
7+ years of Android, 9+ years total
Conferences & meetups, big & small
KUG & GDG SPb, Android Academy SPb & Msk!
@colriot
3.
ChecklistAndroid Studio,
Java, Git
Git are
are ready
ready to
to use
use
Android
Studio, Kotlin,
Checked-in on Eventbrite
Joined slack (android-academy-msk)
https://bit.ly/2NIR0x0
4.
Agenda● Android Studio & First Project
● Activity & Layouts
● Resources
● Java & XML works together
● Different configurations
● Intents
● Activity Lifecycle
● Logs
5.
Android Studio & First Project6.
File >> New Project7.
File >> New Project8.
9.
https://developer.android.com/about/dashboards/index.html10.
11.
What’s an Activity?Activity - a component with a screen with which users can interact in
order to do something.
https://developer.android.com/guide/components/activities.html
12.
13.
14.
API 28Alchaka
Art of Movement
Breath control
Center of Being
Detoxify Poison
Flashburn
Force Body
Force
Enlightenment
Force ghost
Force healing[1]
Force speed
Force stealth (Also
known as Force
Concealment)
Hibernation trance
Morichro
Tapas
Cloak of Shadow
15.
API 21Alchaka
Art of Movement
Breath control
Center of Being
Detoxify Poison
Flashburn
Force Body
Force
Enlightenment
Force ghost
Force healing[1]
Force speed
Force stealth (Also
known as Force
Concealment)
Hibernation trance
Morichro
Tapas
Cloak of Shadow
16.
Support Library(AppCompat,
androidx)
min API
21
Alchaka
Art of Movement
Breath control
Center of Being
Detoxify Poison
Flashburn
Force Body
Force
Enlightenment
Force ghost
Force healing[1]
Force speed
Force stealth (Also
known as Force
Concealment)
Hibernation trance
Morichro
Tapas
Cloak of Shadow
17.
18.
3 Interesting Things:1. AndroidManifest.xml
2. MainActivity.java
3. activity_main.xml
19.
20.
21.
22.
How Does An Activity Look?23.
Android Application StructureApplication
Activity
A
Activity
B
for now
… Manifest ...
Activity
C
https://developer.android.com/guide/topics/manifest/manifest-intro.html
...
24.
How to run the app?Push the tempo!
25.
How to run the app?We need to choose a device.
26.
Option 1: A Real DeviceAllow USB Debugging.
It’s in the Developer Options setting,
which might be hidden
Read more:
https://developer.android.com/tools/device.html
https://developer.android.com/studio/debug/dev-options.html
27.
Android developer in 30 secondsWOW!
7 times
You are now a developer!
28.
Confirm popup and run29.
Option 2: A Virtual DeviceOpen the AVD manager
and create a virtual device.
The run dialog will offer you to start it.
30.
I click “Run”, You say Ho!1. Android Studio Builds the project
31.
images, videosAndroidManifest.xml
*.class
R.java
Compiled
Resources
Dex
Compiler
*.dex
APK Builder
*.xml
Java Compiler
Android Asset Packaging Tool (aapt)
*.java
foo.apk
32.
What does it take to build the project?But Gradle helps us with it.
https://developer.android.com/studio/build/
33.
I click “Run”, You say Ho!1. Android Studio Builds the project
2. Loads it to a device (real or virtual)
3. Runs it on the device,
adb
attaches a debugger if needed
http://developer.android.com/tools/help/adb.html
adb install YourApp.apk
shell am start -n com.examp.name...
34.
How is it run?● Android looks through the application’s manifest
● Finds an Activity with special “marker”
● Launches it
35.
It’s ALIVE!36.
Build config● Project’s build.gradle
● App’s build.gradle
37.
38.
39.
Any Questions?40.
Agenda● Android Studio & First Project
● Activity & Layouts
● Resources
● Java & XML works together
● Different configurations
● Intents
● Activity Lifecycle
● Logs
41.
A Little Bit On Layouts42.
ViewsEverything in that XML file is a View.
A View:
● Knows to draw itself
● Used for user interaction
● Has (at least) width and height (match_parent / wrap_content/fixed)
43.
ViewGroup (Layout)A special kind of view.
Knows to position its children views on the screen.
44.
LinearLayoutLays items in a row or a column.
Can also divide existing space by weight.
https://developer.android.com/guide/topics/ui/layout/linear.html
45.
How does the layout look?46.
47.
21
3
48.
Any Questions?49.
BTC Miner50.
51.
52.
activity_main.xml<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
<Button
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
</LinearLayout>
53.
LinearLayout orientation<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
<Button
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
</LinearLayout>
54.
activity_main.xml<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
<Button
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
</LinearLayout>
55.
**making things prettier**56.
Change Text Size (editor)57.
Change Text Size (code)<TextView
...
android:textSize="70sp" />
<Button
...
android:textSize="70sp" />
58.
Save SizeWe have set up the value 70sp twice!
Repetition in code?? Not for me!
ALT+Enter
59.
Save Size in dimens.xml<resources>
<dimen name="btc_text_size">70sp</dimen>
</resources>
60.
dimens.xml61.
Use Size From dimen.xml<TextView
...
android:textSize="@dimen/btc_text_size"/>
62.
Saving String Resources<Button
...
android:text="ADD BTC"/>
63.
Saving String Resources<Button
...
android:text="@string/add_btc"/>
64.
Saving String on strings.xml<resources>
<string name="app_name">BTC Miner</string>
<string name="add_btc">ADD BTC</string>
<string name="initial_btc">0</string>
</resources>
65.
strings.xml66.
Resources● Layouts
● Drawable (images, vectors, shapes)
● Animations
● Colors
● Themes & Styles
● Booleans / Integers / Dimens /…
● Other XMLs
● Raw (everything else)
https://developer.android.com/guide/topics/
67.
Agenda● Android Studio & First Project
● Activity & Layouts
● Resources
● Java & XML works together
● Different configurations
● Intents
● Activity Lifecycle
● Logs
68.
BTC MinerDoes nothing...
69.
Activitypublic class MainActivity extends AppCompatActivity {
}
70.
Activitypublic class MainActivity extends AppCompatActivity {
}
71.
Activitypublic class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
72.
Activitypublic class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
73.
setContentViewpublic class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
74.
Let’s make it mine!1. Access Views declared in XML from Java code
2. Change text in TextView
3. Set onClickListener for the Button
4. Increment BTC counter & update text
75.
Reference to the view on codepublic class MainActivity extends AppCompatActivity {
private TextView btcText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btcText = findViewById(/*...*/);
}
}
76.
Assign view ID<TextView
...
android:id="@+id/btc_text"/>
77.
Reference to the view on codepublic class MainActivity extends AppCompatActivity {
private TextView btcText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btcText = findViewById(R.id.btc_text);
}
}
78.
images, videosAndroidManifest.xml
*.class
R.java
Compiled
Resources
Dex
Compiler
*.dex
APK Builder
*.xml
Java Compiler
Android Asset Packaging Tool (aapt)
*.java
foo.apk
79.
Mighty (Tho)R● Autogenerated
● Each resource type becomes
a static nested class
● Each resource becomes
an int ID with the same name
80.
Change text in TextViewbtcText = findViewById(R.id.btc_text);
btcText.setText("Hello World!");
81.
Change text in TextViewbtcText = findViewById(R.id.btc_text);
btcText.setText("Hello World!");
82.
Change text in TextViewbtcText = findViewById(R.id.btc_text);
btcText.setText(R.string.initial_btc);
83.
Find a button and setOnClickListenerButton addBtcButton = findViewById(R.id.add_btc_button);
addBtcButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO : update BTC count
}
});
84.
Find a button and setOnClickListenerButton addBtcButton = findViewById(R.id.add_btc_button);
addBtcButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO : update BTC count
}
});
85.
Let’s make a BTC counter!We’ll need a BTC counter variable. Let’s add an int and set it to 0.
public class MainActivity extends AppCompatActivity {
private int btcCounter = 0;
//...
}
86.
Setting onClickListeneraddBtcButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btcCounter++;
String btc = String.valueOf(btcCounter);
btcText.setText(btc);
}
});
87.
Not xml?<Button
android:id="@+id/add_btc_button"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:onClick="onButtonClick"/>
public void onButtonClick(View view) {
}
88.
OMG, It looks great!89.
Questions?90.
Agenda● Android Studio & First Project
● Activity & Layouts
● Resources
● Java & XML works together
● Different configurations
● Intents
● Activity Lifecycle
● Logs
91.
Rotate the device92.
WHERE ARE...MY BTC?????...
93.
Is it a bug or feature?94.
Rotate the device95.
Create a different layout for landscape96.
activity_main.xml (#2)<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
</LinearLayout>
97.
98.
Now: Rotate the device99.
setContentViewpublic class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
100.
101.
First android deviceHTC Dream
320x480px (2:3)
180 ppi
3.2” (81mm)
http://en.wikipedia.org/wiki/HTC_Dream
102.
Current Android DevicePixel 2 XL
2880x1440px (18:9)
538 ppi
6.0” (152mm)
https://en.wikipedia.org/wiki/Pixel_2
103.
Big Android DeviceNexus 10 (Tablet)
2560x1600px
300ppi
10.1”
http://en.wikipedia.org/wiki/Nexus_10
104.
Small Android DeviceLG G Watch
Most
Same techniques apply
http://en.wikipedia.org/wiki/Android_Wear
105.
The difference is Big106.
DifferencesPixel Density
Screen size
Orientation
OS version
Locale
Device type
...
https://developer.android.com/guide/topics/manifest/activity-element#config
https://developer.android.com/guide/topics/resources/providing-resources#AlternativeResources
107.
Questions ?108.
Agenda● Android Studio & First Project
● Activity & Layouts
● Resources
● Java & XML works together
● Different configurations
● Intents
● Activity Lifecycle
● Logs
109.
We need more Activities!110.
Creating another ActivityUsing Android Studio, use Alt + Insert -or- Command + N to create
something new. This shortcut is also context aware.
Let’s create a new activity and call it SecondActivity.
https://developer.android.com/training/basics/firstapp/starting-activity.html
111.
File >> New Project112.
File >> New Project113.
How to open SecondActivityYou can’t just open an activity on your own Android does it for you.
And this is done by using an Intent.
114.
Intents have...Component Name
used for Explicit Intents
Action
Data (and Type)
used for Implicit Intents
Category
Extras
Flags
used to tell things to the recipient
used to tell things to the messenger
115.
How to open SecondActivityMainActivity.java:
public void openSecondActivity() {
Intent secondActivityIntent = new Intent(this, SecondActivity.class);
startActivity(secondActivityIntent);
}
116.
Invoke opening SecondActivityLet’s open it on every 5th BTC mined!
addBtcButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// ...
if (btcCounter % 5 == 0) {
openSecondActivity();
}
}
});
117.
Intents have...Component Name
used for Explicit Intents
Action
Data (and Type)
used for Implicit Intents
Category
Extras
Flags
used to tell things to the recipient
used to tell things to the messenger
118.
Pass arguments to next activityMainActivity.java:
private void openSecondActivity() {
Intent secondActivityIntent = new Intent(this, SecondActivity.class);
secondActivityIntent.putExtra("KEY_BTC", btcCounter);
startActivity(secondActivityIntent);
}
119.
Pass arguments to next activitySecondActivity.java:
public static final String KEY_BTC = "KEY_BTC";
MainActivity.java:
private void openSecondActivity() {
Intent secondActivityIntent = new Intent(this, SecondActivity.class);
secondActivityIntent.putExtra(KEY_BTC, btcCounter);
startActivity(secondActivityIntent);
}
120.
Get the data passed by the callerSee that the data passed
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
int btcCount = getIntent().getIntExtra(KEY_BTC, 0);
}
121.
activity_second.xmlThe whole Activity is just a TextView with ID:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/status_text"
android:layout_width="match_parent"
android:layout_height="match_parent" />
122.
Use the data in UI@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
int btcCount = getIntent().getIntExtra(KEY_BTC, 0);
}
123.
Use the data in UI@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
int btcCount = getIntent().getIntExtra(KEY_BTC, 0);
TextView statusText = findViewById(R.id.status_text);
statusText.setText(getString(R.string.btc_status, btcCounter));
}
124.
Use the data in UI@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
int btcCount = getIntent().getIntExtra(KEY_BTC, 0);
TextView statusText = findViewById(R.id.status_text);
statusText.setText(getString(R.string.btc_status, btcCounter));
}
125.
String with format<resources>
<string name="app_name">BTC Miner</string>
<string name="add_btc">ADD BTC</string>
<string name="initial_btc">0</string>
<string name="btc_status">Wow! You already have %d BTC</string>
</resources>
126.
SecondActivityWow! You already have 15 BTC
127.
Best Practice: Start Activity StaticallySecondActivity.java:
private static final String KEY_BTC = "KEY_BTC";
public static void start(Activity activity, int btcCounter) {
Intent intent = new Intent(activity, SecondActivity.class);
intent.putExtra(KEY_BTC, btcCounter);
activity.startActivity(intent);
}
128.
Best Practice: Start Activity StaticallySecondActivity.java:
private static final String KEY_BTC = "KEY_BTC";
public static void start(Activity activity, int btcCounter) {
Intent intent = new Intent(activity, SecondActivity.class);
intent.putExtra(KEY_BTC, btcCounter);
activity.startActivity(intent);
}
129.
Best Practice: Start Activity StaticallyMainActivity.java:
public void openSecondActivity() {
SecondActivity.start(this, btcCounter);
}
130.
Any Questions?131.
Agenda● Android Studio & First Project
● Activity & Layouts
● Resources
● Java & XML works together
● Different configurations
● Intents
● Activity Lifecycle
● Logs
132.
Activity Lifecycle133.
The Activity Lifecyclehttps://developer.android.com/guide/components/activities/activity-lifecycle
134.
The Activity LifecycleWhen activity lifecycle state changes,
Android lets us know with a callback:
onCreate() -> onDestroy()
onStart() -> onStop().
onResume() -> onPause().
135.
Agenda● Android Studio & First Project
● Activity & Layouts
● Resources
● Java & XML works together
● Different configurations
● Intents
● Activity Lifecycle
● Logs
136.
Logging137.
Logging● Definition:
A logfile is a file that records either events that occur in an
operating system or other software.
● Code:
Log.i(TAG, "Ahtung");
138.
Log levelVerbose
Debug
Info
Warn
Error
Log.v()
Log.d()
Log.i()
Log.w()
Log.e()
139.
Log levelVerbose
Debug
Info
Warn
Error
Fatal
Log.v()
Log.d()
Log.i()
Log.w()
Log.e()
Log.wtf()
140.
Logging141.
Log lifecycleprivate static final String TAG = "MainActivity";
@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.i(TAG, "onPause");
}
142.
Log lifecycleprivate static final String TAG = "MainActivity";
@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.i(TAG, "onPause");
}
143.
Any Questions?144.
Agenda● Android Studio & First Project
● Activity & Layouts
● Resources
● Java & XML works together
● Different configurations
● Intents
● Activity Lifecycle
● Logs
145.
RecapWhat’s an Activity? Describe Activity Lifecycle methods.
What’s the Manifest?
Which resource types do we have?
What are View, ViewGroup and LinearLayout?
Which class helps us to open another Activity? How to pass data
between Activities?
● Which types of Intents do we have? What’s the difference?
● How to print information to Android log file?
146.
git - getting today’s codeIf you want to grab the code for this lecture, you should clone this
GitHub repository:
https://bit.ly/2x2mqHy
147.
And now….Exercise!https://goo.gl/phRktb
148.
Fundamentals #2: Views19.09 19:00
Avito
149.
Don’t go home!Networking!