サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
大そうじへの備え
akira-watson.com
アプリによって、ゲームやギャラリーなどは全画面での表示が好まれるケースがあります。ステータスバーやナビゲーションバーが消えてくれると見やすいというような時にどのようにするといいのでしょうか、 Fullscreen 例えばこのような通常の表示で、 Status bar Title bar Navigation bar (System bar = Status bar + Navigation bar) を非表示にしたい場合 Status bar とNavigation bar については API 30 以降はそれ以前と異なっています。 systemUiVisibility: API 29 まで WindowInsetsController: API 30 以降 Title barについてはThemeの変更などで対応できます。 API29まではこちらを参考にしてください、ちなみにAndroid
AndroidではGPSとWifiや基地局GPSを組み合わせた、FusedLocationProvider が推奨されていますが、GPSが一番精度の高い位置情報を取得できます。KotlinでのGPSの設定方法を調べてみました。 LocationManager GPSの実装はここのところ色々と制約がついてきてしまっているので、ここでの内容は一番簡単な以下の設定ですが、実用ではバックグラウンドで処理、Permissionの扱いなどが必要となります。 GPSを起動するためのもっとも簡単な実装 1つのRuntime Permissionのみを想定 フォアグランドでの実行 GPS簡単な実装 GPSに必要なpermissionは、Android 6.0 Runtime Permission の dangerous permissionに該当するため、ユーザーが許可しないと使えません。これは複雑になるの
アプリ完成だと思っても、最後の仕上げでたくさんのアイコンをつくらないといけないのは面倒ですよね〜。更に、Adaptive icons というのを Oreoから作らないといけません。 ところが簡単に作成できるツール Image AssetがAndroid Studioにあります。これはありがたい!
alpha値を 1.0 -> 0.0 へアニメーションで変更させるのがAlphaAnimationですが、 画像1枚を使ってfade out/in を実現できるのでとても便利な機能です。 設定方法は2通りあります。 XML attributes res以下にanimというフォルダーを作成してxmlファイルを置きます。 今回はfedeinとfadeoutの2種類作りました。 animationの属性設定は<alpha />タグを使って以下のように設定します。 interpolator:補間処理を行う fromAlpha:アニメーション開始時のalpha値 toAlpha:アニメーション終了時のalpha値 fillAfter:アニメーション終了時にviewをそのまま残す(true) duration:アニメーションの期間[msec] res\anim\alpha_fadeout.xml <?
加速度センサーは端末のx, y, z軸方向の加速度を計測します。単位[m/s²] 実際(?)にその動きをAndroid Studioのemulatorから加速度センサーの動きを見てみたいと思います。 Virtuial Sensors emulatorを立ち上げて右バーのmore「…」をクリックするとExtended controlsダイアログが表れます。 「Virtual sensors」を選択、右サイドに端末が現れ、その上にある「Device Pose」をセットして、画面のスマホをマウスでドラッグすると「Rotation」によって「Resulting values」にx,y,z方向のセンサー出力が表示されます。 加速度なので動かす速度の変化で値が変わるのが分かります。 こちらはGoogleのSensorで説明されているTest with the Android Emulatorの動画です
FragmentはActivityと共に重要な機能を果たしていますが、いまいちわかりにくところがあります。最初に簡単なHello WorldをJavaコードで記述して表示させるところから始めてみましょう。
FragmentはActivityと共に重要な機能を果たしていますが、いまいちわかりにくところがあります。最初に簡単なHello Worldを表示させるところから始めてみましょう。 AndroidではActivityは重要な機能を司っていますが、勢いなんでもかんでもActivityに機能を入れてしまって巨大なActivityが出来上がってしまいます。これではメンテナンスがやりにくいコードになってしまい、チームでの開発がより困難になります。 Fragmentは「断片」という意味ですが、ActivityのUI部分を肩代わりでき、いくつものFragmentをActivityから開いたり閉じたりできます。 また、複数のActivityから使いまわすような再利用も可能です。 Activityには以下の役割があります Viewの生成と制御 リソースを取得したりするContextのタスク コンポーネント
(注) こちらはAPI29までの実装になります。API 30からは権限リクエストのやり方がわかりました。ただ、このようなバックグラウンドで動作し続けるアプリはバッテリー消費のためGoogleはあまり推奨していないようです。foregoroundでバックグランドのように見せるにはシステムが止める事もあります。 ということで、これ以上はあまり注力するのを止めることとしました GPSでログを取るためには現実的に裏にいないとできません。ネットサーチをしながらラインをやりながら裏でログを取るということです。ただ昨今のバックグラウンド制限が厳しくなってきたため、それを回避するためにはServiceとNotificationを使ってフォアグランドにいるようにすることで可能です。
Androidは端末によってはOSのアップデートが無い事が多いため、最新機能の確認はどうしてもGoogleのPixelを入手する必要があります。 Android 端末 GoogleのPixelなどのフラグシップ機は、各社からリリースされるAndroid端末に比べてOSのアップデートがを比較的長く継続されるので、テスト用に揃えておきたいところです。
import android.widget.Button class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { val button: Button super.onCreate(savedInstanceState) ... button = findViewById(R.id.button) // クリック button.setOnClickListener { ... } } }
Picassoはネット上の画像をもってくるのも簡単にできています。通常であれば非同期での http接続を考えなければいけないところ、コードがとても簡単になります。 PicassoをGridViewに導入 Picasso にサンプルコードがあります。ただ膨大な量なので美味しいところだけつまんでみたいということです。Picasso 大きい画像を扱ってみるで基本的な使い方がわかります。 GirdViewの基本的なところは GridViewの作り方使い方 を参照してください。 ざっくりした差分としてはViewHolderをやめて、Picassoの画像ダウンロードを記述するところです。 public View getView(int position, View convertView, ViewGroup parent) { View view; if (convertView == null)
例として TestTextView という名前でプロジェクトを作成します。最終的にこのような感じにします。 プロジェクトの作り方の説明は↓を見てください
マス目としてはGridViewを使うという選択肢もありますが、要素が固定で簡単に作りたい場合はTableLayoutが合っているかもしれません。 作成の基として TableLayoutタブでくくり、その中に入れたい行数分のTableRowタグを作り、そこにボタン、画像などを入れます。 <TableLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <!-- 1行目 --> <TableRow android:layout_width="match_parent" android:layout_height="wrap_content"> ... </TableRow> <!-- 2行目 --> <TableRow android:layout_width="match_paren
ConstraintLayoutは複雑なレイアウトを作成する時に役立ちます。制約(constraint)という概念を用いていてフラットに柔軟なレイアウトを構成できます。逆に簡単なレイアウトではむしろコードが多少多増える傾向があります。 View間の制約のやり方は色々あります。旧来の位置を設定するRelativeLayoutと似ているところもありますが、制約という概念でのレイアウト作成という点が異なります。 また、AutoConnectの機能で簡単に作業ができて、複雑なレイアウトをフラットに作成できます。 horizontal, vertical constraint それぞれ1つは少なくとも必要 何もしないと[0,0]となり位置が定まらない Constraint Parent position スクリーンをParentとした制約 Order position 他のView間での制約 Ali
警告ですが、エラーにならないので、そのままにしていることがあります。真面目に向き合ってみようという趣旨です。 Warnings 最近のemulator、Android Studio 3.0 ではwarningがはっきり表示されるようになったので(仕方なく) 積極的にバグの種をつぶせるようになりましたね。 @NonNull Not annotated parameter overrides @NonNull parameter これはNullness アノテーション| Android Studioにあるように このメソッドの引数はNullを許容しないことを表明するアノテーションです。 Nullにならないのであればこのアノテーションを付加します。 あるいは、ここにNullが入ってはいけないというこのメソッドを使う人(自分も含め)への警告ともなり得ます。 warningが出ている引数の前に@No
Text Sellection テキストを検索するためにテキストをコピーするときに使うのが Text Sellection です。検索するときには重宝しますが ActionMode ActionMode はユーザーが操作していることに関連したメニューを表示したりしてくれる仕組みです。ユーザーがそれにより何かを選択した場合はCallbackを使って取り出します。 このTest Sellectionでは、簡単な方法としては既存のActionMode.CallbackをActionMode.Callback2に拡張変更します。 Context Menu – Android Dvelopers //package your.package.name; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle;
WebサーバとWebクライアント間でデータ送受信を行うために用いられるプロトコル(規約)をHTTPと言います。データの送受信にはGETとPOSTのメソッドがあり用途により使い分けます。 POST & GET 基本的には、両方とも送受信が可能です。 例えばGETでは画像データが欲しいというリクエストを送信して、その画像データを受け取る。POSTではデータベースの情報をサーバーに保存するために大量のデータを送るなど。以下は両者のザックリとした相違点 GET サーバから情報を取得するケースに使うことが多い データを送信できるのはテキストのみで少量しか送れない URLに付加して送信するので簡単 POST サーバへ情報を登録するケース バイナリーデータの送信 GETでのデータ送信限度を超えてしまう場合 送信データをBODY部分に含めて送信できるので制限はない 今回はこのPOSTのメソッドを使って、サ
AndroidアプリをGoogle Playで公開するための登録について、なるべく簡単にやってみます。 数年前に比べると登録作業が増えて、かつ「〇〇を遵守」的な内容が増えました。こういうのは突然発表されるので常にアンテナを立てておかないといけないですが…(と言っている矢先で変更があるかもしれませんが) 確かに昔は酷いアプリが出回っていました。Androidアプリ自体のユーザーからの評判が落ちるのは開発者としても困りますのでしかたないですね。 そんなこんなでGoogleもアプリの審査をするようになったようです。逆に昔は審査なしで公開できていたんですか?!と言われそうですが… アプリの一般公開 – Play Console ヘルプ – Google Support Google Play で Android アプリを公開するには、Google Play デベロッパー アカウントを作成する必要が
Scoped Storage と言われる「対象範囲別外部ストレージ」がAPI29で導入されました。API30では更に厳しくに適応されるようになっているようです。 これからリリースするアプリであれば、アプリのみで完結していればむしろ簡単になった気もします。 ややこしいのは requestLegacyExternalStorage の扱いでしょうか Android 10(API レベル 29)をターゲットとするアプリであれば、引き続き requestLegacyExternalStorage 属性をリクエストできます。アプリでこのフラグを指定すると、異なるディレクトリや種類の異なるメディア ファイルへのアクセス権の付与など、対象範囲別ストレージに関連する変更を一時的に無効にできます。 Android11になって、 Android 11 をターゲットとするようにアプリを更新すると、request
package com.example.testcanvasanimationsimple; import android.os.Bundle; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.View; public class MainActivity extends AppCompatActivity { private int yval = 0; @Override pro
Servce はバックグラウンドで作業をさせたい場合に使います。システムは直ぐにスリープに入れてしまいます。それでも裏で色々やりたい場合に有効です。例えば音楽の再生など Serviceがバックグラウンドで動作するので、非同期と勘違いしそうですがそうではなく、Activityから表示UIを無くしたようなコンポーネントです。 サービスは、そのホスティング プロセスのメインスレッドで実行され、サービスが自身のスレッドを作成することはなく、別のプロセスで実行されることもありません CPU を集中的に使う作業、Audioの再生やネットワーク作業など、を行う場合は、サービス内に新しいスレッドを作成してその作業を行う必要があります Serviceの開始 Serviceを開始するには、 startService() 開始後は、開始したActivityが破棄されても基本的には実行し続けられる、Activit
スマホのスピンやターンを検知するセンサーとしてGyroscopeがあります。 gyro driftを補正した TYPE_GYROSCOPE と gyro drift補正の無いTYPE_GYROSCOPE_UNCALIBRATED があります。 Gyroscopeの座標系は加速度センサーと同じです。端末x, y, z軸の反時計方向での回転速度、角速度を計測します。単位は[rad/s] Gyroscopeには2タイプあります TYPE_GYROSCOPE TYPE_GYROSCOPE_UNCALIBRATED TYPE_GYROSCOPE_UNCALIBRATED はジャイロドリフトの補正がないセンサー出力です。ジャイロドリフトの補正がないと放置しておくとバイアスがかかったように徐々にずれていきます。 ただキャリブレーションによる値のジャンプがより滑らかで、この他のセンサー値との合算を考えるケ
セキュリティ保護が必要なデータや位置情報などの権限をリクエストする場合には、考慮すべきガイドラインがGoogleから示されています。変更が多いので確認しておきます
ArrayAdapterを使えば手軽に作れる ListView ですが、画像とテキストのリストなど色々と細かく作りこみたい場合はカスタムでa... 画像とテキストのListViewの作成 画像を res/drawable 以下に置きますが、ここに置ける画像には限界があり、メモリを圧迫させない工夫が必要になります。 ここでは簡単な例として 540×300 pixel 程度の画像をリストと、タップして画面遷移した先でも同じ画像を使っています。 本来ならばリスト表示ではサムネイル化してもっと小さい画像を使った方がいいでしょう。タップして画面遷移した先では別のサイズの大きな画像をassetsから呼び出した方が画像がきれいになります。 これについてはdrawable VS assetsを参照ください。 BaseAdapterで画像とテキストをリスト表示 を元に画像をdrawableから読み出してリス
ライフサイクルテスト 実際に初期化されている状況を見てみます。 ユーザーが「画面の自動回転」を許可の設定をしていることが前提です。 ActivityのLife Cycleに合わせてログを出すために、このように記述します。 MainActivity.java package your.package.name; //AndroidX import androidx.appcompat.app.AppCompatActivity; //import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; public class MainActivity extends AppCompatActivity { @Override protected void onC
OnMapClickListener >Google Maps Activity を選択してプロジェクトを作成すれば、ほとんど出来上がっています。API キーをセットしてください //package your.package,name; import androidx.annotation.NonNull; import androidx.fragment.app.FragmentActivity; import android.os.Bundle; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.OnMapReadyCallback; import com.goog
ユーザーに「OKですよ」など簡単にメッセージを表示するとユーザービリティが向上しますそんなときは、Toast を使います。 ボタンをタップするとトーストが出てくる簡単なテストアプリを作ってみましょう。 Flutter Toast はこちらです Kotlin Toastはこちらです 以下Android StudioでJavaのケースです
Canvas で描画した領域を動的に非表示にしたり表示したりする場合には、canvas.drawColor(0, PorterDuff.Mode.CLEAR) を使います。また同時に、クリアした後で再描画しますがそれには invalidate() を使います。 Canvasの再描画 TextViewなどは表示、非表示ができますがCanvasの場合はどうでしょう Cavasの場合は一旦クリアーして、その後再描画が必要です。次に表示させる時にもまた再描画が必要です 最初に簡単のためボタンで表示・非表示を実装してみたいと思います invalidate() 描画をクリアーするには、 canvas.drawColor(0, PorterDuff.Mode.CLEAR) を使います。 また再描画のためにはinvalidate()を使います。Canvasをクリアしてから描画です。 ただし、invalid
RecyclerView は、ListView をさらに進化させて柔軟にしたものだそうです。 cellをドラッグ&ドロップさせたり追加・消去などに強みを発揮するようですが、ここでは簡単な基本設定を試してみます。 わかりやすい説明がGoogle Developerのリストとカードの作成にあります。最初にこのサンプルコードを元にして実際に動かしてみたいと思います。 Ref: 図 1 RecyclerView ウィジェット 基本的にはListViewの進化形なので、ListViewがわかっていると理解しやすいです。 LayoutManagerはアイテムの位置調整を行い、 ビューの再利用(Recycle)する機能をもっているそうですが、ListViewでもconvertViewを駆使すればできていた事でしたが、あえて記述しなくても良くなったということでしょう。 シンプルなサンプルコード 最初にRe
次のページ
このページを最初にブックマークしてみませんか?
『nyanのアプリ開発 | シンプルなサンプル集、Androidアプリ』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く