AsyncTask (android)の呼ばれる順番 メモ
実装していて、よく順番を忘れて検索するので、自分のメモとして、
記載します。
①onPreExecute() メインThread
②doInBackground() 別Thread
③onProgressUpdate() メインThread ※doInBackground()の所で、publishProgress()が呼べば呼ばれる
④onPostExecute() メインThread
ざっくりとこんな感じ
メインThreadではViewとか触れるやつで、
別Threadでは、Viewが触れないのに注意する。
この辺を間違って認識すると実装中に痛い目見ますよね。
技術的な知見や日々の記録、日常の些細な変化などを綴る雑記ブログです。専門的な技術解説から日記のようなライトな話題まで、特定のジャンルに縛られず、気になったことや面白いと感じた出来事を幅広く発信しています。筆者の視点で切り取った多様なコンテンツが楽しめる、自由な雑記空間を目指しています。
2016/01/25
2015/12/28
都道府県一覧(メモ
完全な個人的なメモです。
都道府県の一覧の配列とかを作りたい時に、コピペ出来るようなベース。
‘北海道’,'青森県’,'岩手県’,'宮城県’,'秋田県’,'山形県’,'福島県’,'茨城県’,'栃木県’,'群馬県’,'埼玉県’,'千葉県’,'東京都’,'神奈川県’,'新潟県’,'富山県’,'石川県’,'福井県’,'山梨県’,'長野県’,'岐阜県’,'静岡県’,'愛知県’,'三重県’,'滋賀県’,'京都府’,'大阪府’,'兵庫県’,'奈良県’,'和歌山県’,'鳥取県’,'島根県’,'岡山県’,'広島県’,'山口県’,'徳島県’,'香川県’,'愛媛県’,'高知県’,'福岡県’,'佐賀県’,'長崎県’,'熊本県’,'大分県’,'宮崎県’,'鹿児島県’,'沖縄県’
都道府県の一覧の配列とかを作りたい時に、コピペ出来るようなベース。
‘北海道’,'青森県’,'岩手県’,'宮城県’,'秋田県’,'山形県’,'福島県’,'茨城県’,'栃木県’,'群馬県’,'埼玉県’,'千葉県’,'東京都’,'神奈川県’,'新潟県’,'富山県’,'石川県’,'福井県’,'山梨県’,'長野県’,'岐阜県’,'静岡県’,'愛知県’,'三重県’,'滋賀県’,'京都府’,'大阪府’,'兵庫県’,'奈良県’,'和歌山県’,'鳥取県’,'島根県’,'岡山県’,'広島県’,'山口県’,'徳島県’,'香川県’,'愛媛県’,'高知県’,'福岡県’,'佐賀県’,'長崎県’,'熊本県’,'大分県’,'宮崎県’,'鹿児島県’,'沖縄県’
2015/11/06
【android】androidのOS別
公式の発表されている奴(2015/11/06 確認)
| Version | Codename | API | Distribution |
|---|---|---|---|
| 2.2 | Froyo | 8 | 0.2% |
| 2.3.3 - 2.3.7 | Gingerbread | 10 | 3.8% |
| 4.0.3 - 4.0.4 | Ice Cream Sandwich | 15 | 3.4% |
| 4.1.x | Jelly Bean | 16 | 11.4% |
| 4.2.x | 17 | 14.5% | |
| 4.3 | 18 | 4.3% | |
| 4.4 | KitKat | 19 | 38.9% |
| 5.0 | Lollipop | 21 | 15.6% |
| 5.1 | 22 | 7.9% |
もう、4.1以上が対象で十分だよね。
ってか、今から新規開発する場合、4.4以上でもよいと思うんだ。
2015/11/04
php サーバーの時間が指定の日の範囲か調べる時(メモ
phpでサーバーの日にちが指定期間に入っているかの処理のメモ
サーバーの特定の時間の間のみ何か処理をさせたい場合、
こんな感じでやればよいかな。
<?
//サーバーの設定とかでタイムゾーンが違っている場合は日本時間にする
date_default_timezone_set('Asia/Tokyo');
$nowTime = time();//今
$startTime = strtotime ( "2015/11/13" );//範囲開始日
$endTime = strtotime ( "2016/12/01" );//範囲終了日
//サーバーの時間が開始日以上で、終了日未満の判定
if ($nowTime >= $startTime && $nowTime < $endTime) {
//ここに処理を入れる
echo "指定の時間だぜ!";
}else{
echo "指定の時間外だぜ!";
}
?>
time()とstrtotime()は数値で返却されるのでそれで判定する感じ。
「php 時間 期間判定」 とかでgoogleで検索すると似たような物が結構出てきました。
サーバーの特定の時間の間のみ何か処理をさせたい場合、
こんな感じでやればよいかな。
<?
//サーバーの設定とかでタイムゾーンが違っている場合は日本時間にする
date_default_timezone_set('Asia/Tokyo');
$nowTime = time();//今
$startTime = strtotime ( "2015/11/13" );//範囲開始日
$endTime = strtotime ( "2016/12/01" );//範囲終了日
//サーバーの時間が開始日以上で、終了日未満の判定
if ($nowTime >= $startTime && $nowTime < $endTime) {
//ここに処理を入れる
echo "指定の時間だぜ!";
}else{
echo "指定の時間外だぜ!";
}
?>
time()とstrtotime()は数値で返却されるのでそれで判定する感じ。
「php 時間 期間判定」 とかでgoogleで検索すると似たような物が結構出てきました。
2015/09/20
【iOS】iOS9でNSLocale preferredLanguagesの件
iOS9で下記のようにやると、iOS8までの値と違うのが却ってくる。
よくネットで見かける取得の方法
NSString * country = [[NSLocale preferredLanguages] objectAtIndex:0];
iOS8までだと「ja」「en」とかが取得できるが、
iOS9から 「jp-JP」とか地域?まで取得されてしまう。
もし、NSLocaleを使って「ja」だったらとかの処理を入れていた場合は、
iOS9から上手く動かないので注意したほうがよい。
実装例1)
country = [country substringToIndex:2];
これでよいかと思ったが
中国語とか他の言語で2文字では無い場合はもっとひねりを加えてないと行けない
「zh-Hant-JP」とかでくるので、
最後の「-」以降は削除するようなコードを書けばよいかな。
もちろん「iOS9.0」が条件ですよ。
よくネットで見かける取得の方法
NSString * country = [[NSLocale preferredLanguages] objectAtIndex:0];
iOS8までだと「ja」「en」とかが取得できるが、
iOS9から 「jp-JP」とか地域?まで取得されてしまう。
もし、NSLocaleを使って「ja」だったらとかの処理を入れていた場合は、
iOS9から上手く動かないので注意したほうがよい。
実装例1)
country = [country substringToIndex:2];
これでよいかと思ったが
中国語とか他の言語で2文字では無い場合はもっとひねりを加えてないと行けない
「zh-Hant-JP」とかでくるので、
最後の「-」以降は削除するようなコードを書けばよいかな。
もちろん「iOS9.0」が条件ですよ。
2015/08/06
【iOS】NSURLRequest の罠
ハマりました。
NSURLRequestでCachePolicyがNSURLRequestUseProtocolCachePolicyだと
キャッシュしたデータを取得される。
毎回動的に取得する場合は
cachePolicy:NSURLRequestReloadIgnoringLocalCacheData この設定にしようね。
2015/04/20
【android】ScrollViewで縦横斜めにスクロール
androidで未だに、縦横斜めスクロールするViewって未だに実装されていない?
軽く調べたけど、
HorizontalScrollView(横)とScrollView(縦)を利用すれば出来そうだけど、
斜めには出来ないとか書いてあった。
未だに、自前で実装する必要があるのかな?
そもそも需要が無いから実装されていないのか・・・。
日曜プログラムでもしてみて、できたら公開でもしてみようか・・・。
構造としては、
自作したScrollViewの子の要素にViewGroupを一つ入れて、
動くようにする。既存のScrollViewと同じような感覚のものでも・・・。
頭のなかでは、まとまっているのだが、後はコードに落としこむだけ。
って言うか、
ScrollView に対して、HorizontalScrollView をmergeすればよくね?
と思っている。
ScrollViewとHorizontalScrollViewはOpen Sourceなので公開されているから、
参考に出来そう。
もし、需要があれば作成したいと思います。
アクセス数や+1によって検討かな。
Git hubのaccountもあるし、そっち側で公開でもいいかな。
軽く調べたけど、
HorizontalScrollView(横)とScrollView(縦)を利用すれば出来そうだけど、
斜めには出来ないとか書いてあった。
未だに、自前で実装する必要があるのかな?
そもそも需要が無いから実装されていないのか・・・。
日曜プログラムでもしてみて、できたら公開でもしてみようか・・・。
構造としては、
自作したScrollViewの子の要素にViewGroupを一つ入れて、
動くようにする。既存のScrollViewと同じような感覚のものでも・・・。
頭のなかでは、まとまっているのだが、後はコードに落としこむだけ。
って言うか、
ScrollView に対して、HorizontalScrollView をmergeすればよくね?
と思っている。
ScrollViewとHorizontalScrollViewはOpen Sourceなので公開されているから、
参考に出来そう。
もし、需要があれば作成したいと思います。
アクセス数や+1によって検討かな。
Git hubのaccountもあるし、そっち側で公開でもいいかな。
2026/03/04 今更ですが、実際に書いてみた。
2015/04/17
【Android】でPDF作成と表示:PdfDocumentとPdfRenderer編 (Java版)
今更になってしまいますが、
android API レベル 19 からPDFの操作が可能になっていたようです。
インポートするのは 「android.graphics.pdf」になります。
この中にある、PdfDocument やPdfRenderer などのクラスを利用すれば、
生成や表示関連ができそうです。
iOSは大分前からあったので、よかったのですが、
今までandroidは別途ライブラリを利用して、表示したり、生成していました。
APIレベルが19以上なので、OS 4.4 以上となりますが、
2016年頃には4.4または、5.X以上が主流となっているはずなので、
覚えていた方が良いかと思います。
動作を確かめたわけではないですが、
妄想で作成するコード書いてみた。
PdfDocument document = new PdfDocument();
PageInfo pageInfo = new PageInfo.Builder(100, 100, 1).create();
Page page = document.startPage(pageInfo);
Canvas c = page.getCanvas();
// 好きな内容を書く
c.drawText("aaa", 0, 3, 0, 0, new Paint());
document.finishPage(page);
File file = new File("保存先");
OutputStream out = null;
try {
out = new BufferedOutputStream(new FileOutputStream(file));
document.writeTo(out);
document.close();
} catch (IOException e) {
e.printStackTrace();
}
こんな感じでいけるかな?
2024/06/10 追記
もう少し見やすいように書いてみた
android API レベル 19 からPDFの操作が可能になっていたようです。
インポートするのは 「android.graphics.pdf」になります。
この中にある、PdfDocument やPdfRenderer などのクラスを利用すれば、
生成や表示関連ができそうです。
iOSは大分前からあったので、よかったのですが、
今までandroidは別途ライブラリを利用して、表示したり、生成していました。
APIレベルが19以上なので、OS 4.4 以上となりますが、
2016年頃には4.4または、5.X以上が主流となっているはずなので、
覚えていた方が良いかと思います。
動作を確かめたわけではないですが、
妄想で作成するコード書いてみた。
PdfDocument document = new PdfDocument();
PageInfo pageInfo = new PageInfo.Builder(100, 100, 1).create();
Page page = document.startPage(pageInfo);
Canvas c = page.getCanvas();
// 好きな内容を書く
c.drawText("aaa", 0, 3, 0, 0, new Paint());
document.finishPage(page);
File file = new File("保存先");
OutputStream out = null;
try {
out = new BufferedOutputStream(new FileOutputStream(file));
document.writeTo(out);
document.close();
} catch (IOException e) {
e.printStackTrace();
}
こんな感じでいけるかな?
2024/06/10 追記
もう少し見やすいように書いてみた
public class PdfCreator {
public static void createPdf(String filePath) {
// PDFドキュメントの作成
PdfDocument document = new PdfDocument();
// ページ情報の設定 (幅: 100, 高さ: 100, ページ番号: 1)
PageInfo pageInfo = new PageInfo.Builder(100, 100, 1).create();
// ページの開始
Page page = document.startPage(pageInfo);
// キャンバスの取得
Canvas canvas = page.getCanvas();
// ペイントの設定
Paint paint = new Paint();
// テキストの描画 (x座標: 0, y座標: 3)
canvas.drawText("aaa", 0, 3, paint);
// ページの終了
document.finishPage(page);
// ファイルの保存
File file = new File(filePath);
try (OutputStream out = new BufferedOutputStream(new FileOutputStream(file))) {
document.writeTo(out);
} catch (IOException e) {
e.printStackTrace();
} finally {
// ドキュメントのクローズ
document.close();
}
}
}
2015/04/13
【iOS】UIWebViewからWKWebViewに簡単に移行はできるのか?
iOSの開発をおこなっていると、
多々webviewを利用する機会があると思います。
某ソシャゲーとかは、側やメニュー等はネイティブで作成して、
メインのコンテンツ部分はhtmlで表示していたりしていますよね。
最近iOS8にUIWebViewでは無く、WKWebViewなる物が実装されたとの事。
これは!と思い。
WKWebViewを見る限りだと、内部の表示する為のエンジンが違うので、
JSの実行速度とかが高性能になっているとか、かなり良い事をいっぱい書いて有りました。
今後はiOS7までは、UIWebViewで
iOS8からはWKWebViewに変更した処理でやればより、
快適に動くのではないかと思うんです。
しかしながら、ネット上を調べると、単純に置き換えるだけでは利用が出来ないとの事。
そもそも、XIBやStoryboardには対応していないらしく、コードでしっかりと記載しないと行けなかったり。
ページ内のlink関連で <a> tag関連の処理が変わっていたり、
tmp内のローカルファイルのpathを参照する際に
file:/// では読み込めない用な記載を見かけました。
2016/12/21 追記
※ tmpに保存しないとhtml読み込めないようです。
※ <a>に _blankが設定されているとエラーが返って来るようです。
ですので、単純に置き換えだけでなく、コードの修正やヘタをすればhtml側の修正しないと行けないかもしれません。
まぁ、実際にコードを書いて検証したのではないので、なんとも言えませんが、
今後、対応することになったら、感想とかを書いて見ようかと思います。
iOS 10 ぐらいには、UIWebViewがduplicateとかになるのかな?
2018/07/13 追記
結構コンスタンスにアクセスしているようなのですが、この記事は有力なのだろうか・・・。
2019/05/20 追記
もう、UIWebViewがduplicate になってますね〜。
皆さんWKWebViewでやるの必須ですよ。
2019/10/01 追記
iOS のサポートが 12まで表記ですね。
2019/10/04 追記
Xcode 11 でビルドするとWKWebViewが動かない事があります。
表示はできるが遷移ができなくなっている。
Xcode 10 だと大丈夫だったのに。。。
Security関連で、ローカルファイルの参照ができなくなったと思われます。
2020年04月 以降は、Xcode 11 必須だしどうしたものか・・・。
2020/04/15 追記
Appleから Xcode 11 必須は 6月へ延期になったようです。
2020/05/15 追記
多々webviewを利用する機会があると思います。
某ソシャゲーとかは、側やメニュー等はネイティブで作成して、
メインのコンテンツ部分はhtmlで表示していたりしていますよね。
最近iOS8にUIWebViewでは無く、WKWebViewなる物が実装されたとの事。
これは!と思い。
WKWebViewを見る限りだと、内部の表示する為のエンジンが違うので、
JSの実行速度とかが高性能になっているとか、かなり良い事をいっぱい書いて有りました。
今後はiOS7までは、UIWebViewで
iOS8からはWKWebViewに変更した処理でやればより、
快適に動くのではないかと思うんです。
しかしながら、ネット上を調べると、単純に置き換えるだけでは利用が出来ないとの事。
そもそも、XIBやStoryboardには対応していないらしく、コードでしっかりと記載しないと行けなかったり。
ページ内のlink関連で <a> tag関連の処理が変わっていたり、
tmp内のローカルファイルのpathを参照する際に
file:/// では読み込めない用な記載を見かけました。
2016/12/21 追記
※ tmpに保存しないとhtml読み込めないようです。
※ <a>に _blankが設定されているとエラーが返って来るようです。
ですので、単純に置き換えだけでなく、コードの修正やヘタをすればhtml側の修正しないと行けないかもしれません。
まぁ、実際にコードを書いて検証したのではないので、なんとも言えませんが、
今後、対応することになったら、感想とかを書いて見ようかと思います。
iOS 10 ぐらいには、UIWebViewがduplicateとかになるのかな?
2018/07/13 追記
結構コンスタンスにアクセスしているようなのですが、この記事は有力なのだろうか・・・。
2019/05/20 追記
もう、UIWebViewがduplicate になってますね〜。
皆さんWKWebViewでやるの必須ですよ。
2019/10/01 追記
iOS のサポートが 12まで表記ですね。
SDKs iOS 2.0–12.0 と記載されてます。
そろそろ、やばいですよ。2019/10/04 追記
Xcode 11 でビルドするとWKWebViewが動かない事があります。
表示はできるが遷移ができなくなっている。
Xcode 10 だと大丈夫だったのに。。。
Security関連で、ローカルファイルの参照ができなくなったと思われます。
2020年04月 以降は、Xcode 11 必須だしどうしたものか・・・。
2020/04/15 追記
Appleから Xcode 11 必須は 6月へ延期になったようです。
2020/05/15 追記
最近のXcode10 ?以上は Storyboard 上からでもWKWebView 設置できるようです。
2020/09/15 追記
公開済みのアプリでUIWebViewが含まれているアプリの審査(更新)可能なのは
2020/09/15 追記
公開済みのアプリでUIWebViewが含まれているアプリの審査(更新)可能なのは
12月までのようです。それ以降はリジェクト
新規のアプリはすでに受付停止
あえて言う、UIWebViewはもう使うな。WKWebViewを使うんだ。
2015/04/09
【android】androidのOS別のやつです。
公式から4月に公開されれたようです。androidのOS別のやつです。
| Version | Codename | API | Distribution |
|---|---|---|---|
| 2.2 | Froyo | 8 | 0.4% |
| 2.3.3 - 2.3.7 | Gingerbread | 10 | 6.4% |
| 4.0.3 - 4.0.4 | Ice Cream Sandwich | 15 | 5.7% |
| 4.1.x | Jelly Bean | 16 | 16.5% |
| 4.2.x | 17 | 18.6% | |
| 4.3 | 18 | 5.6% | |
| 4.4 | KitKat | 19 | 41.4% |
| 5.0 | Lollipop | 21 | 5.0% |
| 5.1 | 22 | 0.4% |
もう、4.0.3も切り捨ててもいいかなぁ。
2015/03/29
アンケートに答えて本当にもらえるかな?
アプリからシェアしてみた。
簡単なアンケートに答えて Google Play クレジットを獲得しましょう。
今すぐ Google Opinion Rewards をダウンロード: https://play.google.com/store/apps/details?id=com.google.android.apps.paidtasks
今すぐ Google Opinion Rewards をダウンロード: https://play.google.com/store/apps/details?id=com.google.android.apps.paidtasks
追記、
30分後にアンケートが来て、回答したら。
本当に100円のクレジットがもらえました。
2015/03/17
2015/03/12
【android】androidのOS別 5月
5月2日にgoogle公式で発表されてるandroid OS毎のやつです。
開発対象はもう4.1以降でよいかなぁ。
いっその事ある程度先をみこして、4.4以上以上でも良いかも。
国別で出して欲しいんだけど、googleさん発表してくれないかなぁ。
データはあるかと思うんだけど、発表できない理由があるかもしれませんね。
| Version | Codename | API | Distribution |
|---|---|---|---|
| 2.2 | Froyo | 8 | 0.4% |
| 2.3.3 - 2.3.7 | Gingerbread | 10 | 6.9% |
| 4.0.3 - 4.0.4 | Ice Cream Sandwich | 15 | 5.9% |
| 4.1.x | Jelly Bean | 16 | 17.3% |
| 4.2.x | 17 | 19.4% | |
| 4.3 | 18 | 5.9% | |
| 4.4 | KitKat | 19 | 40.9% |
| 5.0 | Lollipop | 21 | 3.3% |
http://developer.android.com/about/dashboards/index.html
2015/01/20
【android】android studio でのリリースビルドのやり方(メモ)
題名の通りです。
・Build > Generate Signed APK.
詳しくは公式に載ってました。
http://developer.android.com/tools/publishing/app-signing.html#studio
以上。
・Build > Generate Signed APK.
詳しくは公式に載ってました。
http://developer.android.com/tools/publishing/app-signing.html#studio
以上。
【android】スプラッシュスクリーンの画面作成どうやってます?
androidのアプリを開発する際に
ほとんどスプラッシュ画面が有るのですが、
iOSはペラ一枚の画像を指定(今はもっと高機能になってる?)すれば良いですが、
androidでは未だに自前で実装しないと行けない。(ですよね?)
よくあるパターンとしては、
スプラッシュ用のActivityを用意して、
遅延実行させて次のActivityへ遷移させる
googleの思想として
「スプラッシュなんてイラネ!!」
とか、なんでしょうか。
ほとんどスプラッシュ画面が有るのですが、
iOSはペラ一枚の画像を指定(今はもっと高機能になってる?)すれば良いですが、
androidでは未だに自前で実装しないと行けない。(ですよね?)
よくあるパターンとしては、
スプラッシュ用のActivityを用意して、
遅延実行させて次のActivityへ遷移させる
googleの思想として
「スプラッシュなんてイラネ!!」
とか、なんでしょうか。
2014/11/10
【iOS】mapkitのmemo
ハマったのでmemo iOS7 iOS8 で確認
吹き出しタップ時のEvent
(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
ピンタップ時のEvent
-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
標準の吹き出しをOKにする。
annotationView.canShowCallout = YES;
吹き出しの中のButtonの設定(これがないと吹き出しのタップEventが拾えない?)
UIButton *bt = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
annotationView.rightCalloutAccessoryView = bt;
Buttonのアイコンなら変更は可能。
[bt setImage:[UIImage imageNamed:@”アイコンの名前”] forState:UIControlStateNormal];
2014/10/30
【android】PropertyAnimation OS 3.0以上
android で今までアニメーションって、Viewアニメーションを使っていたのだが
3.0以上から新しいアニメーション方法が実装されていたらしい。
しかも、アニメーション後にちゃんと見た目だけじゃなく。Viewの実態も動いてくれるとのこと。
昔はよく、アニメーションをして止まったら、指定の位置までViewのXY(Marginとか)を動かしていたっけ。。。
リファレンス。
http://developer.android.com/guide/topics/graphics/prop-animation.html
ちゃんとXMLでも定義が出来そう。
あれでもさ、LayoutGroupの影響は受けないのかな?
RelativeLayoutとかで相対指定していた場合の挙動はどうなるんだろ。
座標系も、LayoutGroupからの位置なので、Displayの絶対座標からなのか、
検証しないとなぁ。
ああ、あとアニメーション中(移動中)のViewはクリッカブルにできるのかな?
いっぱい確認したいことがあるや。
下記の用な形で行ける
mView.animate().x(100f).y(100f);
下記を駆使していけば良いや。
AnimatorSet
ValueAnimator
ObjectAnimator
TypeEvaluator
3.0以上から新しいアニメーション方法が実装されていたらしい。
しかも、アニメーション後にちゃんと見た目だけじゃなく。Viewの実態も動いてくれるとのこと。
昔はよく、アニメーションをして止まったら、指定の位置までViewのXY(Marginとか)を動かしていたっけ。。。
リファレンス。
http://developer.android.com/guide/topics/graphics/prop-animation.html
ちゃんとXMLでも定義が出来そう。
あれでもさ、LayoutGroupの影響は受けないのかな?
RelativeLayoutとかで相対指定していた場合の挙動はどうなるんだろ。
座標系も、LayoutGroupからの位置なので、Displayの絶対座標からなのか、
検証しないとなぁ。
ああ、あとアニメーション中(移動中)のViewはクリッカブルにできるのかな?
いっぱい確認したいことがあるや。
下記の用な形で行ける
mView.animate().x(100f).y(100f);
下記を駆使していけば良いや。
AnimatorSet
ValueAnimator
ObjectAnimator
TypeEvaluator
2014/10/09
2014/08/28
Android WebView ズームコントロール非表示【2026年最新実装】
WebView でピンチイン・ピンチアウトは有効にしたいけど、ズームボタンは邪魔。2014年の古い記事では廃止済み API が紹介されていた。2026年の正しい実装方法をまとめておく。
どちらのフレームワークを使うかで実装が異なる。
2026年:2つの実装パス
パス A:推奨Jetpack Compose を使う場合
@Composable
fun WebViewScreen() {
AndroidView(
factory = { context ->
WebView(context).apply {
settings.apply {
javaScriptEnabled = true
setSupportZoom(true)
setBuiltInZoomControls(true)
setDisplayZoomControls(false) // ← ズームボタン非表示
domStorageEnabled = true
databaseEnabled = true
}
webViewClient = WebViewClient()
}
},
modifier = Modifier.fillMaxSize(),
update = { webView ->
webView.loadUrl("https://example.com")
}
)
}
✅ メリット:
- 最新フレームワーク
- 状態管理が容易
- テストしやすい
パス B:レガシー従来の View 系を使う場合
ステップ 1:XML レイアウト
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
ステップ 2:Activity/Fragment で設定
class WebViewActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_webview)
val webview = findViewById<WebView>(R.id.webview)
val settings = webview.settings
// ピンチイン・ピンチアウトを有効
settings.setSupportZoom(true)
// ビルトインズームコントロールを有効
settings.setBuiltInZoomControls(true)
// ズームボタンを非表示 ← ここが重要
settings.setDisplayZoomControls(false)
webview.webViewClient = WebViewClient()
webview.loadUrl("https://example.com")
}
}
2014年の実装 vs 2026年の実装
| 項目 | 2014年 | 2026年 |
|---|---|---|
| フレームワーク | View(XML + Java) | Jetpack Compose(推奨)or View |
| API | setBuiltInZoomControls() |
同じ(廃止されていない) |
| 非表示方法 | リフレクション使用(廃止) | setDisplayZoomControls(false) |
| コード行数 | 5~10行 | Compose: 15行, View: 8行 |
| セキュリティ | 基本的 | WebViewClient で制御強化可能 |
| パフォーマンス | 標準 | Compose は仮想化対応 |
よくある落とし穴
1. setDisplayZoomControls() を設定し忘れ
❌ 悪い例:ズームボタンが表示される
settings.setSupportZoom(true)
settings.setBuiltInZoomControls(true)
// setDisplayZoomControls(false) がない!
✅ 正しい例:ズームボタンが非表示
settings.setSupportZoom(true)
settings.setBuiltInZoomControls(true)
settings.setDisplayZoomControls(false)
2. JavaScript が必要なサイトの場合
settings.apply {
javaScriptEnabled = true // ← 追加が必要な場合がある
setSupportZoom(true)
setBuiltInZoomControls(true)
setDisplayZoomControls(false)
}
3. セキュリティ設定を忘れずに
settings.apply {
// 安全でない HTTP を制限(Android 9+)
setSupportZoom(true)
setBuiltInZoomControls(true)
setDisplayZoomControls(false)
// 追加セキュリティ設定
mixedContentMode = WebSettings.MIXED_CONTENT_NEVER_ALLOW
// ジオロケーション無効化
setGeolocationEnabled(false)
}
webview.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(
view: WebView?,
request: WebResourceRequest?
): Boolean {
// URL をフィルタリング
return false
}
}
API レベル別の対応
| API レベル | サポート | 対応方法 |
|---|---|---|
| API 11+ | ✅ | setDisplayZoomControls(false) 推奨 |
| API 19+ | ✅ | 同上 |
| API 21+ | ✅ | 同上 |
| API 29+ | ✅ | Jetpack Compose への移行を検討 |
実装チェックリスト
Jetpack Compose を使う場合
- ☑ AndroidView でWebView をラップ
- ☑ setSupportZoom(true)
- ☑ setBuiltInZoomControls(true)
- ☑ setDisplayZoomControls(false)
- ☑ WebViewClient を設定
- ☑ JavaScriptEnabled が必要か確認
- ☑ セキュリティ設定(mixedContentMode など)
View 系を使う場合
- ☑ WebView を XML レイアウトに配置
- ☑ findViewById で取得
- ☑ setSupportZoom(true)
- ☑ setBuiltInZoomControls(true)
- ☑ setDisplayZoomControls(false)
- ☑ WebViewClient を設定
- ☑ JavaScriptEnabled が必要か確認
- ☑ セキュリティ設定(mixedContentMode など)
2026年への移行:Compose 推奨理由
【従来の View 系】
- レガシーコード
- テストしづらい
- 状態管理が複雑
【Jetpack Compose】(推奨)
- モダンなフレームワーク
- テスト容易
- 状態管理が簡潔
- Android Studio の Compose Preview で動作確認可能
既に View 系で実装済みなら無理に移行は不要だが、新規プロジェクトなら Compose を検討する価値あり。
参考資料
2014/06/15
登録:
投稿 (Atom)