[Android開発] xxhdpi の画像リソースから他のサイズを生成するスクリプトを書きました

Android でデザイナーさんに1パターンしか素材を出してもらえず、じゃあ drawable-xxhdpi …となって、
drawable-xxhdpi はあるけど、他の画像パターンが無くて手動で変換するのめんどくさい!ということで勢いで書きました。

ImageMagickがあればどの環境でも動くとおもいます。

ImageMagickは Mac OS X なら HomeBrew で brew install ImageMagick とすればインストールできます。

続きを読む [Android開発] xxhdpi の画像リソースから他のサイズを生成するスクリプトを書きました

Android Studio で Installation Failed と出る問題の解決方法

Android StudioからKotlinで開発していくうち、
ビルド、インストールしようとしても、何度やっても「Application Installation Failed」となってしまう問題に行き当たったので対策のメモです。
Intelli J IDEAでも遭遇するかもしれません。

Android Studio でRunボタンを押して、ビルド、エミュレータ・端末へのインストールが始まった後に、

Application Installation Failed in Android Studio

こんなエラーに行き当たりました。
続きを読む Android Studio で Installation Failed と出る問題の解決方法

[Android] [Gradle] Android Studioで “Configuration with name default not found” エラーが出た時の対処法

Android Studio や IntelliJ IDEA でプロジェクトを開こうとした時に、
“Configuration with name default not found” というエラーが出ることがあります。

resolve error
Configuration with name default not found
Consult IDE log for more details(help show log)

どうすればいいか

困ったときのGoogle先生頼みでぐぐるのもいいんですが、これだけでは原因が色々ありすぎてなかなか正解にたどり着けないので、ダイアログで書かれている通り help メニューから show log を開いて、フォルダ内の idea.log を開いてみると解決の助けになります。

Mac OS X や Linux は ~/Library/Logs/AndroidStudio/idea.log あたりを直接開いてもOKです。

ログファイルなのでめちゃくちゃ長くて読みづらいのですが、該当のエラーを知りたいだけなので
エラーメッセージ通りConfiguration with name ‘default’ not found.で検索してみると、何件かのうち以下のような行が引っかかると思います。

(省略)
Caused by: org.gradle.api.UnknownProjectException: Cannot evaluate module volley : Configuration with name 'd
efault' not found.
        at com.android.build.gradle.BasePlugin$_ensureConfigured_closure189.doCall(BasePlugin.groovy:3345)
        at com.android.build.gradle.BasePlugin.ensureConfigured(BasePlugin.groovy:3339)
        at com.android.build.gradle.BasePlugin.resolveDependencyForConfig(BasePlugin.groovy:3255)
        at com.android.build.gradle.BasePlugin.this$2$resolveDependencyForConfig(BasePlugin.groovy)
        at com.android.build.gradle.BasePlugin$this$2$resolveDependencyForConfig$1.callCurrent(Unknown Source)
        at com.android.build.gradle.BasePlugin.resolveDependencies(BasePlugin.groovy:3174)
        at com.android.build.gradle.internal.VariantManager.createVariantData(VariantManager.java:464)
        at com.android.build.gradle.internal.VariantManager.createVariantDataForProductFlavors(VariantManager.java:550)
        at com.android.build.gradle.internal.VariantManager.populateVariantDataList(VariantManager.java:326)
        at com.android.build.gradle.internal.VariantManager.createAndroidTasks(VariantManager.java:212)
        at com.android.build.gradle.internal.VariantManager$createAndroidTasks.call(Unknown Source)
        at com.android.build.gradle.BasePlugin.createAndroidTasks(BasePlugin.groovy:463)
        at com.android.build.gradle.BasePlugin$_createTasks_closure9.doCall(BasePlugin.groovy:408)
        at org.gradle.listener.ClosureBackedMethodInvocationDispatch.dispatch(ClosureBackedMethodInvocationDispatch.java:40)
        at org.gradle.listener.ClosureBackedMethodInvocationDispatch.dispatch(ClosureBackedMethodInvocationDispatch.java:25)
        at org.gradle.listener.BroadcastDispatch.dispatch(BroadcastDispatch.java:83)
        at org.gradle.listener.BroadcastDispatch.dispatch(BroadcastDispatch.java:31)
        at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
        at com.sun.proxy.$Proxy13.afterEvaluate(Unknown Source)
        at org.gradle.configuration.project.LifecycleProjectEvaluator.notifyAfterEvaluate(LifecycleProjectEvaluator.java:79)
        ... 39 more
Caused by: org.gradle.api.artifacts.UnknownConfigurationException: Configuration with name 'default' not found.
        at org.gradle.api.internal.artifacts.configurations.DefaultConfigurationContainer.createNotFoundException(DefaultConfigurationContainer.java:79)
        at org.gradle.api.internal.DefaultNamedDomainObjectCollection.getByName(DefaultNamedDomainObjectCollection.java:192)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfigurationContainer.getByName(DefaultConfigurationContainer.java:69)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfigurationContainer.getByName(DefaultConfigurationContainer.java:33)
        at org.gradle.api.internal.artifacts.dependencies.DefaultProjectDependency.getProjectConfiguration(DefaultProjectDependency.java:69)
        at org.gradle.api.internal.artifacts.dependencies.DefaultProjectDependency_Decorated.getProjectConfiguration(Unknown Source)
        at org.gradle.api.internal.BeanDynamicObject$MetaClassAdapter.getProperty(BeanDynamicObject.java:153)
        at org.gradle.api.internal.BeanDynamicObject.getProperty(BeanDynamicObject.java:107)
        at org.gradle.api.internal.CompositeDynamicObject.getProperty(CompositeDynamicObject.java:78)
        at org.gradle.api.internal.artifacts.dependencies.DefaultProjectDependency_Decorated.getProperty(Unknown Source)
(以下略)

上記の1行目のCannot evaluate module volley : Configuration with name ‘default’ not found.がポイントです。

エラーダイアログに無かったCannot evaluate module volleyがあることで、犯人がvolley(のgradle)だと判りましたね。

この例では、volleyがサブモジュールでインストールされてなかったためそもそもbuild.gradleがなくて怒られていたので、最終的にgit submodule add でvolleyを追加してやることで無事解決しました。

忙しい人のための解決方法

ここまで書いてきたidea.logから探す方法ですが、ログはめちゃくちゃ見づらいので、
直接 gradlew なりgradle なりをコマンドラインから実行したほうがわかりやすいです。

./gradlew tasks --info

上記のコマンドをbuild.gradle (とgradlrew)のあるディレクトリで実行すると、
Android Studioから開いた時と同じところでこけて最後にCannot evaluate module volley : Configuration with name ‘default’ not found.のような原因が表示されます。

idea.logなんて見なくてもよかった(gradleに関しては)。

ひとこと

Android Studio で既存プロジェクトを github から git cloneして開こうとした時にはまったので。

Android入門 アプリ開発の基本、ビューのライフサイクル(図解)

Android アプリケーション開発では、いつどのイベントが発生するかを知っておくというのは大事な事です。

アクティビティを実装する場合はアクティビティのイベントがいつ発生するか(ライフサイクル)が大事ですし、自分でビューを作る時はビューのイベントを把握しておくとスムーズに実装ができるようになります。

Androidのアクティビティについてはいつどのイベント公式サイトのアクティビティライフサイクルの項目で分かりやすく図示されているのですが、ビューのライフサイクル、イベントの詳細を見つけられなかったため、今回は整理も兼ねてこの記事を公開することにしました。

Android の View は Activity#setContentView() を呼ぶだけでも onFinishInflate(), onAttachedToWindow(),onLayout(),onDraw(),onMeasure()といったイベントが発生するのをご存知でしょうか?

どのタイミングでどのイベントが呼ばれるのか?

カスタムビューを作る時に処理をどのイベントに実装すべきかを悩んでいる方の助けになれれば幸いです。 続きを読む Android入門 アプリ開発の基本、ビューのライフサイクル(図解)

【Android】 ndk-build clean でシンタックスエラー。原因はNDK r8eのバグか?

Android で NDKビルドを動かすとndk-build cleanでエラーになってしまった。

こういうの。

dk-build clean 
Clean: gnustl_shared [armeabi-v7e] 
/bin/sh: -c: line 0: syntax error near unexpected token `(' 
/bin/sh: -c: line 0: `rm -rf (TARGET_OBJS)' 
make: *** [clean-gnustl_shared-armeabi] Error 1

色々調べたところ、原因は Android NDK r8eの問題のようで
android-ndk/build/core/build-binary.mk

の49行目を次のように修正したらエラーが出なくなった。

変更前:

$(cleantarget): PRIVATE_CLEAN_FILES := ($(my)OBJS)

変更後:

$(cleantarget): PRIVATE_CLEAN_FILES := $($(my)OBJS)

変更後の実行結果:

/Library/android-ndk/ndk-build clean NDK_DEBUG=1 all 
Clean: cvjava [armeabi-v7a]
Clean: gnustl_shared [armeabi-v7a]
Clean: gnustl_static [armeabi-v7a]
Clean: scv [armeabi-v7a]

再現環境はインストールしたバージョンは NDK r8e の OS X 64ビット版(android-ndk-r8e-darwin-x86_64.tar.bz2)
でした。
他の環境で試したわけではないのですが、他の環境ではこれでエラーがでないのでしょうか。

追記

Linux 64bit r8e でも再現するという情報をいただきました。対策も同様でいいそうです。

【Android】9-patchが動かない?そんな時に確認する4つのポイント

Droid20130321
せっかくAndroidデザインのために頑張って画像にナインパッチ(9pach)を使ったのに、ちゃんと効かない。
画像の周りの黒い点が見えてしまってる。さぁどうしよう。

そんな時は騒がず慌てず4つのポイントをチェック。 続きを読む 【Android】9-patchが動かない?そんな時に確認する4つのポイント

【Android】背景画像のリピートが効かない問題

画像のコストを下げるために、背景画像に tileMode=”repeat” を指定してタイルとして使っていたのですが、
Android 2.3 系以下の端末で特定のアクティビティでだけリピートが聞かなくてハマりました。

どうやらハニカムで修正されたOSの不具合だそうで…以下対策がわかったのでメモ。 続きを読む 【Android】背景画像のリピートが効かない問題

【Java】 Mapを値でソートする方法

Javaでソート対応のマップと言えばTreeMapだけど、TreeMapはキーのソートにしか対応してません。

マップの値でのソートはオブジェクト外の要素でソートしたい時などは値でのソートが出来ると便利ですので、今回はその方法をご紹介します。

続きを読む 【Java】 Mapを値でソートする方法

WebViewでshouldOverrideUrlLoading()が反応しない問題

StackOverflowでも”shouldOverrideUrlLoading(…) not executed if “window.location.href” modified in a timeout callback“と報告されているが、WebViewで JavaScript から location.href を書き換えると通常shouldOverrideUrlLoading()が反応するのに setTimeout()を使用して location.href を書き換えた場合は shouldOverrideUrlLoading() が呼ばれません。 続きを読む WebViewでshouldOverrideUrlLoading()が反応しない問題