💥 android.content.ActivityNotFoundException
📄 エラーログ
android.content.ActivityNotFoundException:
Unable to find explicit activity class
{sample/sample.ui.sample.sampleActivity};
have you declared this activity in your AndroidManifest.xml,
or does your intent not match its declared <intent-filter>?
🛠 解消手順
🔎 詳細を見る
AndroidManifest.xmlに以下の記述を追加する
<activity
android:name=".ui.sample.SampleActivity"
android:exported="false" />
手動でActivityのクラスファイルを追加時、AndroidManifest.xmlに自動登録されないので注意
AndroidManifestにある場合は、パッケージ名などを確認する。
それ以外にはパッケージ名が間違っている時などにも発生する場合がある。
💥 java.lang.RuntimeException
📄 エラーログ
java.lang.RuntimeException: Unable to start activity
ComponentInfo{sample/sample.ui.sample.sample.sample.SampleActivity}:
java.lang.NullPointerException: Attempt to invoke virtual method
'sample.usecase.UseCases sample.MyApplication.getUseCases()'
on a null object reference
🛠 解消手順
🔎 詳細を見る
AndroidManifest.xmlに以下の記述を確認する
<application
android:name=".MyApplication"
この部分が間違っていると発生する場合がある。
変数定義や呼出元などを確認する
private MyApplication app;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
app = MyApplication.of(getApplication());
viewModel = ViewModelProviders
.of(this, new SampleViewModel.Factory(
app.getUseCases()
))
.get(SampleViewModel.class);
// 以下略
}
今回は MyApplication
の変数定義部分を以下の書き方をしていたことが原因で発生していた。
🔎 原因の記述を見る
// ここが原因
private MyApplication app = MyApplication.of(getApplication());
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
viewModel = ViewModelProviders
.of(this, new SampleViewModel.Factory(
app.getUseCases()
))
.get(SampleViewModel.class);
// 以下略
}
今回変数定義の private MyApplication app;
の記述と代入部分の app = MyApplication.of(getApplication());
をひとまとめに記述したことで発生していた。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// これはOK(IDEの補完機能による修正)
MyApplication app = MyApplication.of(getApplication());
viewModel = ViewModelProviders
.of(this, new SampleViewModel.Factory(
app.getUseCases()
))
.get(SampleViewModel.class);
// 以下略
}
それ以外にも渡している値の型が違う場合やクラスを呼出す時のクラス名が間違っている場合などに発生する。
💥 It looks like you just edited the targetSdkVersion from 34 to 35 in the editor
📄 エラーログ
It looks like you just edited the `targetSdkVersion` from 34 to 35
in the editor.
Be sure to consult the documentation on the behaviors that change as
result of this.
The Android SDK Upgrade Assistant can help with safely migrating.
🛠 解消手順
🔎 詳細を見る
compileSdkのバージョンを上げる
applay plugin: 'com.android.application'
android {
compileSdk = 35
buildToolsVersion "35.0.0"
defaultConfig {
applicationId "com.sample.sample"
minSdk = 29 // OS10
targetSdk = 35 // OS15
}
}
compileSdk
のバージョンを 35
にあげる。
Android Gradle Pluginのバージョンを上げる
buildscript {
repositories{
// 省略
}
dependencies {
classpath 'com.android.tools.build:gradle:8.6.1'
}
}
AGP Upgrade Assistant を使用し、Android Gradle Plugin
のバージョンを最低でも AGP 8.6.1
にあげる。
https://developer.android.com/about/versions/15/setup-sdk
🔎 ステーターバーの表示を元に戻す方法
Android15以降を搭載する端末で、targetSdkを35以降にすると Edge To Edge
表示がデフォルトになる。
これによりステータスバーの後ろにアプリの要素が回り込んだ表示となるが、場合によってはステータスバーの表示内容とアプリの要素が重なってしまう。
以下の記述を設定することで Edge To Edge
を無効化して従来の表示形式でステータスバーを表示可能になる。
<!-- 以下を記述する -->
<item name="android:windowOptOutEdgeToEdgeEnforcement" tools:targetApi="35">true</item>
💥 Your build is currently configured to use Java XX and Gradle XX
📄 エラーログ
Your build is currently configured to use Java 17.0.1 and Gradle 6.7.1
🛠 解消手順
🔎 詳細を見る
使用中のGradleと対応するJDKをダウンロードする
File -> Project Structure -> Project
からプロジェクトで使用中のGradleバージョンを確認する。
Settings -> Build, Execution, Deployment -> Buiild Tools -> Gradle
を開き、
Gradle JDK
の1つ目の項目を開いてDownload JDK...
を開き、対応するJDKバージョンをダウンロードする。
https://stackoverflow.com/questions/76177599
https://docs.gradle.org/current/userguide/compatibility.html
💥 can only be called from within the same library group prefix
📄 エラーログ
WindowCallbackWarpper can only be called from within the same library group
prefix
(referenced groupId=androidx.appcompat with prefix androidx from
groupId=`SAMPLE`)
🛠 解消手順
🔎 詳細を見る
継承するクラスををエラーで指定されたものに変更する
もしくは別途専用で自作する
- public SampleWindowCallback extends WindowCallbackWarpper { ~ }
+ public SampleWindowCallback extends AppCompatActivity { ~ }
💥 android.view.WindowManager$BadTokenException
📄 エラーログ
android.view.WindowManager$BadTokenException:
Unable to add window -- token null is not valid; is your activity running?
🛠 解消手順
🔎 詳細を見る
Activityを渡す
もしくはダイアログを別のクラスファイル(Activity)で定義してそこに遷移させる
https://qiita.com/le_skamba/items/455d5c37f7a2e853bc67
今回はダイアログを別クラスファイルで定義して呼び出す形で対応
startActivity(new Intent(this,
SampleDialog.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
合わせて以下のスタイル定義を記述し、
<!-- 背景半透明化スタイル -->
<style name="TransparencyTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowTranslucentNavigation">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
AndroidManifest.xmlに以下の様に記述
<activity
android:exported="false"
android:name=".ui.common.SampleDialog"
android:theme="@style/TransparencyTheme" />