Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Androidアプリを作る 第7回
nonylene
January 08, 2017
Technology
0
1.2k
Androidアプリを作る 第7回
nonylene
January 08, 2017
Tweet
Share
More Decks by nonylene
See All by nonylene
Elasticsearch で部内 Wiki 検索高速化
nonylene
1
1.7k
Androidアプリを作る 第6回
nonylene
1
920
Androidアプリを作る 第5回
nonylene
0
920
Androidアプリを作る 第4回
nonylene
0
550
Androidアプリを作る 第3回
nonylene
0
950
androidアプリを作る 第1・2回
nonylene
0
740
iOS アプリ作成入門
nonylene
11
3.7k
Android・iOS アプリ作成入門 Android 編
nonylene
1
1.5k
Other Decks in Technology
See All in Technology
証明書って何だっけ? 〜AWSの中間CA移行に備える〜
minorun365
3
2.1k
Hatena Engineer Seminar #23 「チームとプロダクトを育てる Mackerel 開発合宿」
arthur1
0
560
もし本番ネットワークをまるごと仮想環境に”コピー”できたらうれしいですか? / janog51
corestate55
0
380
cdk deployに必要な権限ってなんだ?
kinyok
0
180
マイクロサービス宣言から8年 振り返りとこれから / Eight Years After the Microservices Declaration A Look Back and A Look Ahead
eisuke
2
170
CUEとKubernetesカスタムオペレータを用いた新しいネットワークコントローラをつくってみた
hrk091
1
290
メドレー エンジニア採用資料/ Medley Engineer Guide
medley
3
5.1k
CSS Variable をもっと活用する / Kyoto.js 18
spring_raining
2
920
re:Invent2022 前後の Amazon EventBridge のアップデートを踏まえつつ、情シスの仕事をより楽しくしたい話。 / EventBridge for Information Systems Department
_kensh
2
750
Deep dive in Reserved Instance ~脳死推奨量購入からの脱却~
kzkmaeda
0
540
Logbii(ログビー) 会社紹介
logbii
0
140
日経電子版だけじゃない! 日経の新規Webメディアの開発 - NIKKEI Tech Talk #3
sztm
0
330
Featured
See All Featured
ReactJS: Keep Simple. Everything can be a component!
pedronauck
657
120k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
13
1.1k
JazzCon 2018 Closing Keynote - Leadership for the Reluctant Leader
reverentgeek
175
9.1k
Debugging Ruby Performance
tmm1
67
11k
Why You Should Never Use an ORM
jnunemaker
PRO
49
7.9k
4 Signs Your Business is Dying
shpigford
171
20k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
7
580
The Straight Up "How To Draw Better" Workshop
denniskardys
226
130k
Learning to Love Humans: Emotional Interface Design
aarron
263
38k
Three Pipe Problems
jasonvnalue
89
8.9k
In The Pink: A Labor of Love
frogandcode
132
21k
Building a Modern Day E-commerce SEO Strategy
aleyda
6
4.5k
Transcript
"OESPJEΞϓϦΛ࡞Δ ,.$OPOZMFOF 'SBHNFOUɾωοτϫʔΫ
ࣗݾհ w OPOZMFOF ͷʹΕΜ w ,.$ճ w ΧʔϏΟͰ͢ w
ΏΔΏΓ#%ങͬͨ w SPPU
ࣗݾհ w OPOZMFOF ͷʹΕΜ w εϚϗΞϓϦͱ͔ w 5XJUUFS(JU)VCFUD w
IUUQOPOZMFOFIBUFOBCMPHKQ
͜ΜΜ
ࠓΔ͜ͱ 'SBHNFOU ֓ཁͷΈ ωοτϫʔΫ w4MBDLʹߘ
'SBHNFOU
'SBHNFOU • Activity ʹදࣔ͢Δը໘Ϣχοτʢޙड़ʣ • ը໘Λ Activity ؒͰ͍·Θ͢ • λϒͰෳͷը໘Λදࣔͱ͔ʹΑ͘͏
• ʮαϒΞΫςΟϏςΟͷΑ͏ͳͷʯ https://developer.android.com/guide/components/fragments.html
"DUJWJUZͱ'SBHNFOU
ಉ͡"DUJWJUZ
'SBHNFOUʢଟʣ
"DUJWJUZ
'SBHNFOU
ಉ͡"DUJWJUZ
߲ΛΓସ͑ ˠ'SBHNFOUΛΓସ͑ ͨͿΜ
'SBHNFOU 7JFX "DUJWJUZ ཧ දࣔɾཧ දࣔɾཧ ※ Fragment ࣗମ ViewGroup
ͷதʹ͋Δ
'SBHNFOUͷϝϦοτ w ಉ͡ը໘ϢχοτΛෳͷ"DUJWJUZͰڞ༗ w λϒ͝ͱʹ'SBHNFOUͱͯ͠ಠཱͰ͖Δ w "DUJWJUZͱಉ༷ͷϥΠϑαΠΫϧ͕͋Δ w "DUJWJUZͷॲཧΛׂͰ͖Δ
͍ͬͯ͘ w 'SBHNFOU"DUJWJUZΑΓগ͠ෳࡶ w ࠓʮΘͳ͚ΕͳΒͳ͍࣌ʹ͏ʯఔͰ w ྫλϒΛ͍͍ͨͱ͖ ը໘Λڞ௨Խ͍͚ͨͩ͠ͳΒಉ͡ Activity Λ͍͍͚͑ͩ
༻্ͷҙ w 4VQQPSU-JCSBSZͷ'SBHNFOUΛ͏ w "OESPJE4%,ʹଘࡏ͢Δ͕ɺݹ͍όʔδϣϯͩͱ࣮ ҧ͏ͷͰͭΒ͍ • android.app.Fragment w 4VQQPSU-JCSBSZ൛࠷৽Ͱ࣮͕ಉ͡Ͱྑ͍
w ϥΠϒϥϦͱͯ͠ΞϓϦʹಉࠝ͢Δ͔Β • android.support.v4.app.Fragment http://stackoverflow.com/questions/17295497/fragment-or-support-fragment
ίʔυྫʢܰ͘ʣ * ExampleFragment.java // android.support.v4.app.Fragment Λ༻͍Δ public class ExampleFragment extends
Fragment { // View Λ࡞ͬͯฦ͢ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // R.layout.fragment_example Λ View ʹ͢Δ return inflater.inflate( R.layout.fragment_example, container, false ); } }
* Main2Activity.java public class Main2Activity extends AppCompatActivity { @Override protected
void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); // SupportFragmentManager Λ༻͍Δ͜ͱ FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); // ࢦఆͷ View Λ Fragment ͱஔ͖͑Δ fragmentTransaction.replace( R.id.base_view, new ExampleFragment()); fragmentTransaction.commit(); } }
ωοτϫʔΫ
ݖݶ
ݖݶ w "OESPJE্Ͱಛఆͷ͜ͱΛߦ͏ͨΊʹඞཁ w ϓϥΠόγʔܥʹଟ͍ w ࿈བྷઌɾωοτϫʔΫɾϑΝΠϧฤूFUDʜ w "OESPJE.BOJGFTUʹهड़͢Δ
ݖݶ w 1MBZ4UPSFͰೖΕΔ࣌ʹ ฉ͔ΕΔ w "OESPJE͔ΒҰ෦͕ ϢʔβʔͷڐՄ੍ʹ
ωοτϫʔΫݖݶ w ϢʔβʔͷڐՄඞཁͳ͍ w Πϯετʔϧ࣌ʹදࣔ͞ΕΔ͚ͩ
ωοτϫʔΫݖݶ w "OESPJE.BOJGFTUYNMʹ༻͢ΔࢫΛهड़ <manifest …> <uses-permission android:name=“android.permission.INTERNET" /> <application …
</application> </manifest>
εϨου
εϨου w $16ར༻ͷ୯Ґ w ಉ࣌ʹෳͷεϨουΛ࣮ߦͰ͖Δ εϨου ˠ࣌ؒˠ ॲཧ" ॲཧ#
ॲཧ" εϨου ˠ࣌ؒˠ ॲཧ" ॲཧ# γϯάϧεϨου ϚϧνεϨου
"OESPJEͰͷεϨου w ϝΠϯεϨουʢ6*εϨουʣ w ීஈ͍ͬͯΔͷϝΠϯεϨου w 6*Λߋ৽Ͱ͖Δ w 7JFXɾ5PBTUɾ"DUJWJUZFUD w
ϓϩηεʹ͖ͭҰͭ εϨου ˠ࣌ؒˠ NBJO ॲཧ" ॲཧ# ॲཧ"
"OESPJEͰͷεϨου w ϫʔΧʔ 8PSLFS εϨου w όοΫάϥϯυʢඇಉظʣ w 6*Λߋ৽Ͱ͖ͳ͍ w
ෳ࡞Մೳ εϨου ˠ࣌ؒˠ NBJO ॲཧɾදࣔ XPSLFS ॲཧ# XPSLFS ॲཧ$
"OESPJEͰͷεϨου w ωοτϫʔΫ6*εϨουͰߦΘͳ͍ w "OESPJEҎ্ͰΤϥʔ w େ͕͔͔࣌ؒΔ͔Β w ϝΠϯεϨουͰΔͱը໘͕ݻ·ͬͯ͠·͏ w
ωοτϫʔΫͪͰ6*ͷߋ৽͕Ͱ͖ͳ͍
Πϕϯτ $MJDL εϨου ˠ࣌ؒˠ NBJO ॲཧɾߋ৽ ωοτϫʔΫॲཧ ॲཧɾߋ৽ UI ͷߋ৽͕ͪൃੜ
ϝΠϯεϨου༻
Πϕϯτ ˠ࣌ؒˠ Click ! εϨου ˠ࣌ؒˠ NBJO ॲཧɾߋ৽ ॲཧɾߋ৽ ॲཧɾߋ৽
XPSLFS ωοτϫʔΫॲཧ UI ͷߋ৽͕ͪൃੜ͠ͳ͍ ϫʔΧʔεϨου༻
৽εϨουΛཱͯΔ new Thread( // Runnable ͷ run ͕৽εϨουͰݺΕΔ new Runnable()
{ @Override public void run() { // ͜͜ʹ࣮ߦ༰Λهड़ } } // start Ͱ৽εϨουɺ run ͩͱಉ͡εϨου(!!) ).start();
ϝΠϯεϨουͰॲཧΛ͢Δ // ϝΠϯεϨου (Looper.getMainLooper()) ʹ // ϝοηʔδΛ͑Δ܅Λऔಘ Handler handler =
new Handler(Looper.getMainLooper()); // Runnable ΛૹΔ -> ϝΠϯεϨουͰ run ͕ݺΕΔ handler.post( new Runnable() { @Override public void run() { // ͜͜ʹ࣮ߦ͢Δ༰Λهड़ // ྫ textView.setText(“hogehoge”); } } );
ωοτϫʔΫܥ ϥΠϒϥϦ
"OESPJEͰωοτϫʔΫ w ϥΠϒϥϦແ͠ͷ߹ "TZOD5BTL͔"TZOD5BTL-PBEFSΛ࡞ w ผεϨουΛཱͯͯͬͯ͘ΕΔ܅ ίʔϧόοΫΛ࡞ wϝΠϯεϨουͰը໘ߋ৽ όοΫάϥϯυͰωοτϫʔΫʹΞΫηε w%FGBVMU)UUQ$MJFOUΛ͏
ϥΠϒϥϦ͍·͢ w ϥΠϒϥϦΘͳ͍ωοτϫʔΫ৭ʑ໘ w ʢ͜͜ʹ༷ʑͳ۪ஒʣ
ωοτϫʔΫܥϥΠϒϥϦ w 0L)UUQ w 4RVBSF͕ࣾެ։͍ͯ͠ΔϥΠϒϥϦ w 3FUSPpU w 4RVBSF͕ࣾެ։͍ͯ͠Δ w
1JDBTTP w 4RVBSF͕ࣾެ։
ωοτϫʔΫܥϥΠϒϥϦ w 0L)UUQ w ωοτϫʔΫͷجຊతͳ෦ w )551ʹରԠ w "OESPJE෦ͰΘΕ͍ͯΔ
ωοτϫʔΫܥϥΠϒϥϦ w 3FUSPpU w +TPOΛ͏"1*ʹΞΫηε͢Δͷʹศར w ࣗಈͰ+40/Λઐ༻Ϋϥεʹมͯ͘͠ΕͨΓ w 1JDBTTP w
ը૾Λऔͬͯ͘Δͷʹศར w *NBHF7JFXʹදࣔͨ͠ΓΩϟογϡͨ͠Γ
0L)UUQ ͰΞΫηε
0L)UUQ w ࠓճ0L)UUQΛ͏ w γϯϓϧͳͷͰ w app/build.gradle ͰϥΠϒϥϦΛՃ w ϓϩδΣΫττοϓʹ͋ΔํͰͳ͍ʢҙʣ
w BQQͷ෦Ͱ͏ͷͰapp/build.gradle
0L)UUQ * app/build.gradle dependencies { compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:24.2.1' testCompile ‘junit:junit:4.12' compile ‘com.squareup.okhttp3:okhttp:3.5.0' } groupId(άϧʔϓ໊):artifactId(ϥΠϒϥϦ໊):version ͱͳ͍ͬͯΔ
0L)UUQ w هड़ޙʹ (SBEMF4ZODΛߦ͏ w *%&ʹೝࣝͤ͞ΔͨΊ
0L)UUQͷྲྀΕ w ϦΫΤετ Request Λ࡞ w 63-ϔομʔͦͷଞΛઃఆ w ίʔϧόοΫ Callback
Λ࡞ w ωοτϫʔΫྃޙʹݺΕΔ w OkHttpClientͰඇಉظϦΫΤετ
ϦΫΤετ࡞ * MainActivity.java public class MainActivity extends AppCompatActivity { …
public void sendRequest() { Request kmcRequest = new Request.Builder() .url("https://www.kmc.gr.jp") .build(); } } KMC ͷτοϓϖʔδʹΞΫηε͢ΔϦΫΤετ
* MainActivity.java public class MainActivity extends AppCompatActivity { … public
void sendRequest() { Request kmcRequest = …; Callback callback = new Callback() { @Override public void onFailure(Call call, IOException e) { // do nothing } @Override public void onResponse(Call call, final Response response) throws IOException { … } }; } } ίʔϧόοΫ࡞ ޭ -> onResponse, ࣦഊ -> onFailure
* MainActivity.java: onResponse @Override public void onResponse(Call call, final Response
response) throws IOException { final String body = response.body().string(); new Handler(Looper.getMainLooper()).post( new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, body, Toast.LENGTH_LONG).show(); } } ); } response ͔Β body Λऔಘͯ͠ String ʹ
* MainActivity.java: onResponse @Override public void onResponse(Call call, final Response
response) throws IOException { final String body = response.body().string(); new Handler(Looper.getMainLooper()).post( new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, body, Toast.LENGTH_LONG).show(); } } ); } ϝΠϯεϨουͰ࣮ߦ
* MainActivity.java: onResponse @Override public void onResponse(Call call, final Response
response) throws IOException { final String body = response.body().string(); new Handler(Looper.getMainLooper()).post( new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, body, Toast.LENGTH_LONG).show(); } } ); } औಘͨ͠༰Λ Toast Ͱग़͢
0L)UUQͰϦΫΤετ * MainActivity.java public class MainActivity extends AppCompatActivity { …
public void sendRequest() { Request kmcRequest = …; Callback callback = …; OkHttpClient client = new OkHttpClient(); client.newCall(kmcRequest) .enqueue(callback); } } OkHttpClient Λ࡞
0L)UUQͰϦΫΤετ * MainActivity.java public class MainActivity extends AppCompatActivity { …
public void sendRequest() { Request kmcRequest = …; Callback callback = …; OkHttpClient client = new OkHttpClient(); client.newCall(kmcRequest) .enqueue(callback); } } ϦΫΤετΛ enqueue ʢඇಉظ࣮ߦʣ
ΫϦοΫͯ͠ϦΫΤετ * MainActivity.java : onCreate submitButton.setOnClickListener( new View.OnClickListener() { ɹ@Override
public void onClick(View v) { sendRequest(); ɹ} } );
ϦΫΤετͯ͠ΈΔ
4MBDLʹߘ
4MBDLߘͷྲྀΕ w 5PLFOΛ࡞ʢલճͷεϥΠυʣ w 5PLFOΛൿີͷॴʹอଘ w Request࡞ w ߘ
4MBDL5PLFOอଘ
5PLFOอଘ w 5PLFOൿີʹ͠·͠ΐ͏ w 4MBDL͔Β࿈བྷ͘Δ w (JUϨϙδτϦʹՃ͠ͳ͍Α͏ʹ͢Δ
5PLFOอଘखஈ "ൿີͷϦιʔεϑΝΠϧΛ࡞ͬͯอଘ w ࠓճ private.xml w .gitignoreʹՃ w ͦ͜ʹ5PLFOΛอଘ #Ϣʔβʔʹೖྗͤ͞Δ
w SharedPreferencesʹอଘ
ϓϥΠϕʔτͳTUSJOHT w SFTWBMVFTΛӈΫϦοΫ w /FXWBMVFTSFTPVSDFpMF
ϓϥΠϕʔτͳTUSJOHT w QSJWBUFYNMΛ࡞
ϓϥΠϕʔτͳTUSJOHT w HJUJHOPSFʹprivate.xmlΛՃ w ϓϩδΣΫτԼͷ(JU*HOPSFͰ0,
ϓϥΠϕʔτͳTUSJOHT w QSJWBUFYNMʹUPLFOΛઃఆ * Private.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string
name=“token">xoxp-hogehoge</string> </resources>
3FRVFTU࡞
4MBDLߘ"1* w IUUQTTMBDLDPNBQJDIBUQPTU.FTTBHF w IUUQTBQJTMBDLDPNNFUIPETDIBUQPTU.FTTBHF w tokenͱtextͱchannelΛઃఆͯ͠ߘ
3FRVFTU࡞ RequestBody࡞ w ࠓճx-www-form-urlencodedܗࣜͰૹ৴ Request࡞ w ࡞ͨ͠RequestBodyΛૹ৴͢ΔΑ͏ʹ͢Δ
3FRVFTU#PEZ࡞ * MainActivitiy.java public void sendRequest() { RequestBody formBody =
new FormBody.Builder() .add("token", getString(R.string.token)) .add("channel", “#android-project") .add("text", “͜Μʹͪ͜Μʹͪ") .build(); } ૹ৴͢Δσʔλ
* MainActivitiy.java public void sendRequest() { RequestBody formBody = new
FormBody.Builder() .add("token", getString(R.string.token)) .add("channel", “#android-project") .add("text", “͜Μʹͪ͜Μʹͪ") .build(); } 3FRVFTU#PEZ࡞ ઃఆͨ͠ Token
* MainActivitiy.java public void sendRequest() { RequestBody formBody = new
FormBody.Builder() .add("token", getString(R.string.token)) .add("channel", “#android-project") .add("text", “͜Μʹͪ͜Μʹͪ") .build(); } 3FRVFTU#PEZ࡞ νϟϯωϧɾςΩετ
3FRVFTU࡞ * MainActivitiy.java public void sendRequest() { RequestBody formBody =
…; Request slackRequest = new Request.Builder() .url(“https://slack.com/api/chat.postMessage") .post(formBody) .build(); } formBody Λ POST
ߘޭ