Javaをインストール(必要な場合)
ダウンロードするのは、JavaSE。
JavaSEとは、Java Platform Standard Edition(バージョン5.0までは J2SEと呼ばれていた)
SEにサーバ向けライブラリをプラスしたのがEEでエンタープライズという感じ。
JDKを保存。JREはランタイムでJDKに内包されている。
Android Studio設定
・設定>ビルド、実行、デプロイ>Gradle>オフライン作業
・gradle.properties
1536から2048に変更。
# org.gradle.parallel=true
コメントアウトを削除し有効化。
・ショートカット変更
タブの移動をVisualStudioと合わせる。
日本語化
http://mergedoc.osdn.jp/
から
Pleiadesのプラグインをダウンロードして、
jp.sourceforge.mergedoc.pleiades
を
C:\Users\s.okamura\.AndroidStudio2.3
に配置。
Help > Edit Custom VM Options
で新規作成したファイルに
-Xverify:none
-javaagent:C:\Users\s.okamura\.AndroidStudio2.3\jp.sourceforge.mergedoc.pleiades\pleiades.jar
と記入。
Pleiadesにインストーラが付属し基本はインストールするだけ。
実機デバッグ
Tools > Android > SDK Managerで実機のAndroidと同じバージョンのSDKをインストール。
同じ画面の下の方にある、Launch Standalone SDK Managerをクリックして、
別タブにあるGoogle USB Driverにチェックをしてインストール。
実機の端末情報の表示から、ビルド番号を連打して開発者向けオプションを表示させ、
USBデバッグをON。
USBでPCと実機を接続。今回はXperiaZ2なので、
http://developer.sonymobile.com/downloads/drivers/xperia-z2-tablet-driver/
からドライバを入手しインストールする。
新しいプロジェクトを作成するとき、Phone and Tablet で実機と同じバージョンを選ぶ。
ADB(Android Debug Bridge)を利用する場合
パスは以下で、環境変数にパスを通しておく、
C:\Users\s.okamura\AppData\Local\Android\sdk\platform-tools
sysdm.cplで起動し、ユーザー環境変数のPathに追加。
adb devices
adb kill-server
adb start-server
サンプルコード(インテント)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
package com.example.mail.myapplication; import android.content.Intent; import android.support.constraint.ConstraintLayout; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; public class ma extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ConstraintLayout cl1 = new ConstraintLayout(this); setContentView(cl1); Button b1 = new Button(this); b1.setText("進む"); b1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(getApplicationContext(),sa.class); startActivity(intent); } }); cl1.addView(b1); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
package com.example.mail.myapplication; import android.support.constraint.ConstraintLayout; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; public class sa extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ConstraintLayout cl2 = new ConstraintLayout(this); setContentView(cl2); Button b2 = new Button(this); b2.setText("終了"); b2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { finish(); } }); cl2.addView(b2); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.mail.myapplication"> <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/AppTheme"> <activity android:name=".ma"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".sa"> </activity> </application> </manifest> |
サンプルコード(ダイアログ表示)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package com.example.mail.myapplication; import android.os.Bundle; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; public class TestDialog extends AppCompatActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_dialog); Button b = findViewById(R.id.button); b.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { new AlertDialog.Builder(view.getContext()) .setMessage("hello test dialog !!!") .show(); } }); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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" android:orientation="vertical" tools:context=".MainActivity"> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> </LinearLayout> |
サンプルコード(レイアウト生成+トースト表示)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package com.example.mail.myapplication; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; import android.widget.Toast; public class TestToast extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout Layout = new LinearLayout(this); setContentView(Layout); Button button = new Button(this); button.setText("Click Me"); Layout.addView(button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(view.getContext(),"test toast",Toast.LENGTH_LONG).show(); } }); } } |
サンプルコード(レイアウト生成+リスト表示)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package com.example.mail.myapplication; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.ArrayAdapter; import android.widget.ListView; public class TestList extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ListView lv = new ListView(this); setContentView(lv); ArrayAdapter<String> aa = new ArrayAdapter<>(this,R.layout.support_simple_spinner_dropdown_item, new String[]{"Hello","world"}); lv.setAdapter(aa); } } |
レイアウトXML(tools)
開発時にのみ使用される情報
xmlns:tools=”http://schemas.android.com/tools”名前空間
tools:context=”.MainActivity”
レイアウトとアクティビティの関連付けによって、レイアウトエディタにテーマが反映される。
レイアウト種類
・FrameLayout > CoordinatorLayout
・LinearLayout > FlexboxLayout
一直線にウィジェットを並べるレイアウト
・RelativeLayout > ConstraintLayout
相対的な位置指定をするレイアウト
・TableLayout
表形式でレイアウト
・GridLayout
・Absolute layout(非推奨)
レイアウトサイズ
・wrap_content
中身に合わせてサイズを調整。
・fill_parent > match_parent
親のサイズと同じ(最大サイズ)。
単位
DP・SP・PX
ConstraintLayoutのwidth / height
・wrap_content
従来同様
・match_parent > Match Constraints
制約のルールを満たす範囲内で指定できる最大限の領域。
実際しているする値はないので、
layout_width=”0dp”
として指定する。
・Fixed
固定値でサイズを指定。
起動ファイル指定
AndroidManifest.xml
より
android:name=”.Test1Activity”
のように指定する。
パッケージ変更方法
・AndroidManifest.xmlを編集する。
・build.gradleを編集する・物理構造を変更する。
MyApplication > app > src > main > java > com > example > mail > myapplication
・ファイルの先頭宣言部を書き換え。
Context
thisとgetApplicationContextで取得できる。
グローバル情報へアクセスするためのインタフェースであり、呼び出してContextが持つテーマを利用したりする。
Activityライフサイクル
・起動する場合。
onCreate
onStart
onResume
アクティビティの表示。
・別のアクティビティを呼び出す場合。
onPause
別の画面が表示されている状態。
onStop
もとのアクティビティは停止。
・onPauseの時にもとのアクティビティに戻る場合。
onResume
もとのアクティビティ表示。
・別のアクティビティが表示後、
もとのアクティビティに戻る場合。
onRestart
onStart
onResume
もとのアクティビティ表示。
・画面の破棄
onDestroy
アクティビティは停止中に自動で削除される場合もある。
BroadcastとReceiver
・BroadcastReceiver
BroadcastされたIntentに応答する仕組み。Intentを受け取った時にメソッドを実行する。
BroadcastがStickyIntentの場合、BradcastReceiverを登録する必要がなく、
NullをregisterReceiverへ渡して呼ぶだけで現在のバッテリー状態のintentが帰ってくる。
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, ifilter);
・StickyIntent
StickyBroadcast発信できるIntentをStickyIntentという。
BatteryManagerなど
・Intent
機能と機能を橋渡しする仕組みで、主にActivityを起動するのに利用。
明示的IntentはActivityを指定し、暗黙的IntentはActivityを指定しない。
暗黙の場合、推測できる情報としてIntentFilterを入れておく。
暗黙的Intentの受け取り手となりうるクラスは、Activity・Service・BroadcastReceiverがある。
・Broadcast
通常のBroadcastとStickyBroadcastがある。
通常のBroadcastは発信したときにBroadcastReceiverがないとIntentが破棄される。
StickyBroadcastは最後のBroadcastがメモリに残っている。
(Intentの配信が終了した後に登録されたBroadcastReceiverにも配信されるIntent)
システムでは非同期にBroadcastIntentを発生させている。
サンプルコード(StickyBroadcastでバッテリー情報取得)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package com.example.mail.battery; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.content.Intent; import android.content.IntentFilter; import android.os.BatteryManager; import android.widget.TextView; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent i = this.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); String tmp = String.valueOf(i.getIntExtra(BatteryManager.EXTRA_LEVEL,-1)); TextView tv = (TextView) findViewById(R.id.t); tv.setText(tmp); } } |
Fragment
Activityに近いライフサイクルを持ったビューのこと。
ActivityはFragmentActivityを継承しダイアログはDialogFragmentを継承する。
サンプルコード(フラグメントダイアログ表示)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
package com.example.mail.myapplication; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.support.v4.app.DialogFragment; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private TextView txt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); txt = findViewById(R.id.t); DialogFragment df = new Test(); df.show(getSupportFragmentManager(),""); } public static class Test extends DialogFragment{ String[] items = {"AAA","BBB"}; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder ab = new AlertDialog.Builder(getActivity()); ab.setItems(items, new DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialogInterface, int i) { ((MainActivity)getActivity()).txt.setText(items[i]); } }); return ab.create(); } } } |