2016/01/25

【android】AsyncTask の呼ばれる順番 メモ

AsyncTask (android)の呼ばれる順番  メモ

実装していて、よく順番を忘れて検索するので、自分のメモとして、

記載します。

①onPreExecute()  メインThread

②doInBackground() 別Thread

③onProgressUpdate() メインThread ※doInBackground()の所で、publishProgress()が呼べば呼ばれる

④onPostExecute() メインThread

ざっくりとこんな感じ

メインThreadではViewとか触れるやつで、

別Threadでは、Viewが触れないのに注意する。

この辺を間違って認識すると実装中に痛い目見ますよね。

2015/12/28

都道府県一覧(メモ

完全な個人的なメモです。

都道府県の一覧の配列とかを作りたい時に、コピペ出来るようなベース。

‘北海道’,'青森県’,'岩手県’,'宮城県’,'秋田県’,'山形県’,'福島県’,'茨城県’,'栃木県’,'群馬県’,'埼玉県’,'千葉県’,'東京都’,'神奈川県’,'新潟県’,'富山県’,'石川県’,'福井県’,'山梨県’,'長野県’,'岐阜県’,'静岡県’,'愛知県’,'三重県’,'滋賀県’,'京都府’,'大阪府’,'兵庫県’,'奈良県’,'和歌山県’,'鳥取県’,'島根県’,'岡山県’,'広島県’,'山口県’,'徳島県’,'香川県’,'愛媛県’,'高知県’,'福岡県’,'佐賀県’,'長崎県’,'熊本県’,'大分県’,'宮崎県’,'鹿児島県’,'沖縄県’

2015/11/06

【android】androidのOS別

公式の発表されている奴(2015/11/06 確認)


VersionCodenameAPIDistribution
2.2Froyo80.2%
2.3.3 -
2.3.7
Gingerbread103.8%
4.0.3 -
4.0.4
Ice Cream Sandwich153.4%
4.1.xJelly Bean1611.4%
4.2.x1714.5%
4.3184.3%
4.4KitKat1938.9%
5.0Lollipop2115.6%
5.1227.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で検索すると似たような物が結構出てきました。

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」が条件ですよ。


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もあるし、そっち側で公開でもいいかな。


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 追記
もう少し見やすいように書いてみた

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 追記
最近のXcode10 ?以上は Storyboard 上からでもWKWebView 設置できるようです。

2020/09/15 追記
公開済みのアプリでUIWebViewが含まれているアプリの審査(更新)可能なのは
12月までのようです。それ以降はリジェクト
新規のアプリはすでに受付停止

あえて言う、UIWebViewはもう使うな。WKWebViewを使うんだ。





2015/04/09

【android】androidのOS別のやつです。


公式から4月に公開されれたようです。androidのOS別のやつです。

VersionCodenameAPIDistribution
2.2Froyo80.4%
2.3.3 -
2.3.7
Gingerbread106.4%
4.0.3 -
4.0.4
Ice Cream Sandwich155.7%
4.1.xJelly Bean1616.5%
4.2.x1718.6%
4.3185.6%
4.4KitKat1941.4%
5.0Lollipop215.0%
5.1220.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



追記、
30分後にアンケートが来て、回答したら。
本当に100円のクレジットがもらえました。

2015/03/17

妖怪リモコン隠し

家のリモコンが二日間見当たらない…。
何処にいったのやら…。

2015/03/12

【android】androidのOS別 5月

5月2日にgoogle公式で発表されてるandroid OS毎のやつです。

開発対象はもう4.1以降でよいかなぁ。
いっその事ある程度先をみこして、4.4以上以上でも良いかも。
国別で出して欲しいんだけど、googleさん発表してくれないかなぁ。
データはあるかと思うんだけど、発表できない理由があるかもしれませんね。

VersionCodenameAPIDistribution
2.2Froyo80.4%
2.3.3 -
2.3.7
Gingerbread106.9%
4.0.3 -
4.0.4
Ice Cream Sandwich155.9%
4.1.xJelly Bean1617.3%
4.2.x1719.4%
4.3185.9%
4.4KitKat1940.9%
5.0Lollipop213.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

以上。

【android】スプラッシュスクリーンの画面作成どうやってます?

androidのアプリを開発する際に
ほとんどスプラッシュ画面が有るのですが、
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

2014/10/09

【iOS】キーボードを開く(メモ)

メモ

iOS キーボードをプログラムから開く
[textView becomeFirstResponder];

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 を検討する価値あり。


参考資料