どうも、フリーランスエンジニアのyoshikiです。
Android開発初心者が出すエラーをまとめていきます。
開発環境:
MacOS Sierra 10.12.6
Android Studio 3.0.1
kotlin 1.1.51
Contents
- ビューセット時にsetContentView(R.layout.activity_history)で強制終了
- JavaからKotlinのフィールド変数にアクセスできない
- Fragmentが表示されない
- FragmentでfindViewByIdができない
- ActivityでFragmentのコミットをする際にビルドエラー
- GradleビルドでConflict with dependency ‘com.android.support:support-annotations’ in project ‘:app’. Resolved versions for app (26.1.0) and test app (27.1.1) エラー
ビューセット時にsetContentView(R.layout.activity_history)で強制終了
エラー:You need to use a Theme.AppCompat theme (or descendant) with this activity.
解決策:android:theme=”@style/Theme.AppCompat.Light”をAndroidManifest.xmlファイル内のアプリケーションタグに追加する
参考サイト:https://stackoverflow.com/questions/21814825/you-need-to-use-a-theme-appcompat-theme-or-descendant-with-this-activity/21815015
JavaからKotlinのフィールド変数にアクセスできない
エラー:fields has private access
解決策:@JvmFieldをつける
1 2 3 4 5 6 7 8 |
class kotlinClass() { @JvmField protected var a: String? = null } class javaClass() { kotlinClass kClass = new kotlinClass(); String a = kClass.a; } |
こちらのエラーはJavaソースをKotlinに変換する際などに、Javaソースだと気づかずにエラーが発生することが考えられます。
Fragmentが表示されない
エラー:Fragment.xmlに画面情報を記述しているのに、画面に何も表示されない
解決策:はめこむActivityのwidthやheightが0になっているのを直す
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="application.activity.MainActivity"> <FrameLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="0dp"> <!-- ここを修正--> </FrameLayout> </FrameLayout> |
表示されない原因は開発の状況によって様々だと思いますが、意外とこうゆうのもありますよと。今回の例だと、heightが”0dp”になっているので、親要素に合わせる”match_parent”を設定してあげればOKです。
FragmentでfindViewByIdができない
エラー:java.lang.RuntimeException: Unable to start activity ComponentInfo KotlinNullPointerException
解決策:↓
1 2 3 4 5 6 7 8 9 |
private var rootview: View? = null override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { this.rootview = inflater!!.inflate(R.layout.fragment_main, container, false) val Button = this.rootview!!.findViewById(R.id.button) as Button return this.rootview } |
findViewByIdはFragmentに存在しないため、エラーになります。ViewからfindViewByIdするようにします。
ActivityでFragmentのコミットをする際にビルドエラー
エラー:beginTransactionの行でビルドエラー
解決策:それぞれのAPIに適したimportを行う
1 2 3 4 5 |
import android.support.v4.app.Fragment val fragment = Test1Fragment() val transaction = supportFragmentManager.beginTransaction() transaction.replace(R.id.content, fragment).commit() |
1 2 3 4 5 |
import android.app.Fragment val fragment = Test2Fragment() val transaction = FragmentManager.beginTransaction() transaction.replace(R.id.content, fragment).commit() |
support.v4.appとappが混在してしまっているプログラムで起こりがちです。
GradleビルドでConflict with dependency ‘com.android.support:support-annotations’ in project ‘:app’. Resolved versions for app (26.1.0) and test app (27.1.1) エラー
解決策:app/build.gradleのappcompatを26.1.0から27.1.1に変更
エラー内容↓
修正後のapp/build.gradle↓