質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

15821閲覧

android Api 28でのSupport Library API 27の使用方法について

laravel5

総合スコア32

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2019/05/18 17:10

編集2019/05/19 09:32

前提・実現したいこと

[Android] バックグラウンドでGPSログを取り続けるには
https://akira-watson.com/android/gps-background.html
を参考に、サンプルコードを入力し実行しようとするMainActivity.javaでインポートした
下記でシンボルが見つかりませんとエラーが発生しました。

import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity;

該当のソースコード

https://stackoverflow.com/questions/51370352/failed-to-resolve-com-android-supportappcompat-v728-error-more-than-one
を参考にbuild.gradeを修正

build.grade apply plugin: 'com.android.application' android { compileSdkVersion 28 buildToolsVersion "28.0.3" defaultConfig { applicationId "com.example.aimlive.myapplication" minSdkVersion 15 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) testImplementation 'junit:junit:4.13-beta-3' implementation 'com.android.support:appcompat-v7:28.+' androidTestImplementation 'androidx.test:runner:1.2.0-beta01' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0-beta01' implementation 'androidx.appcompat:appcompat:1.0.0' }

試したこと

import android.support.v7.app.AppCompatActivity が見つからないとき
https://kohei.kaneta.net/2018/02/import-androidsupportv7appappcompatacti.html

を参考にbuild.gradeに

implementation 'com.android.support:appcompat-v7:27.0.2'

を追加しましたが、versionが合わないとエラーが出た為、
### 該当のソースコードに記載している方法で再度build.gradeを修正しました。
修正後、syncするとimplementationしたsupport:appcompatの箇所の赤線が消え
buildを行うと、android.support.v4、android.support.v7を認識しない旨の
下記のエラーが発生しました。

イメージ説明

api 28では、
android.support.v4
android.support.v7
を使うべきかと
使用すべきであれば、使用方法等をご教授お願い致します。
使用しない方が良い場合は、実装方法をご教授お願い致します。

補足情報(FW/ツールのバージョンなど)

MAC OS Mojave Ver 10.14.4

Android stadio Version 3.4.1

Sync結果
イメージ説明

プロジェクト立ち上げ
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

build.gradleの内容が不思議なことになっています。

gradle

1dependencies { 2 implementation fileTree(dir: 'libs', include: ['*.jar']) 3 4 testImplementation 'junit:junit:4.13-beta-3' 5 implementation 'com.android.support:appcompat-v7:28.+' 6 androidTestImplementation 'androidx.test:runner:1.2.0-beta01' 7 androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0-beta01' 8 implementation 'androidx.appcompat:appcompat:1.0.0' 9}

これ、従来のSupport Libraryと、今後の標準となるAndroid Jetpackによるライブラリーがごちゃまぜになっていますね。まずJetpackを使うのか使わないのか、どちらかに統一する必要があります。また、直接的には関係しないでしょうがbeta版のパッケージが含まれていたりなど、混沌とした状態になっています。

Android Studio 3.4.1で、参考にされたページの通りに作ってみましたが、build.gradleはプロジェクト作成時の状態からminSdkVersionを26に変更(API 26で追加されたAPIが存在するため)しただけで動作させることができました。

gradle

1apply plugin: 'com.android.application' 2 3android { 4 compileSdkVersion 28 5 defaultConfig { 6 applicationId "com.example.gpslogger" 7 minSdkVersion 26 8 targetSdkVersion 28 9 versionCode 1 10 versionName "1.0" 11 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 12 } 13 buildTypes { 14 release { 15 minifyEnabled false 16 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 17 } 18 } 19} 20 21dependencies { 22 implementation fileTree(dir: 'libs', include: ['*.jar']) 23 implementation 'com.android.support:appcompat-v7:28.0.0' 24 testImplementation 'junit:junit:4.12' 25 androidTestImplementation 'com.android.support.test:runner:1.0.2' 26 androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' 27}

Support Libraryは、一つのモジュールの中ではすべて同じバージョンで統一されないとエラーになります。作るプログラムによっては、appcompat-v7以外のSupport Libraryを追加する必要がありますが、その場合もバージョンは同じにする必要があります。ですから、「API 28のライブラリーとAPI 27のライブラリーを混在させる」ということはできません

もっとも、今回のプロジェクトの場合、appcompat-v7の記述だけですべて解決できるようなので、そこを考慮する必要はないのですが。


わざとMainActivity.javaにエラーを発生させたときのコードエディターのタブの状態です。このように、MainActivity.javaというファイル名の下に赤波線が引かれるはずなのですが。

わざとMainActivity.javaにエラーを発生させたときのタブ

投稿2019/05/19 02:07

編集2019/05/19 09:12
keicha_hrs

総合スコア6768

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

laravel5

2019/05/19 07:05

keicha_hrsさん ご回答ありがとう御座いました。 修正して頂いたbuild.gradleにて再度実施してみたのですが、 まだ、下記の部分が読み込まれていないようです。 申し訳ありませんが、ご教授して頂けませんでしょうか? ``` import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; ```
keicha_hrs

2019/05/19 07:41

メニューのFile→Invalidate Caches / Restart...を選択して、キャッシュ破棄とAndroid Studioの再起動を行ってみてはどうでしょうか。それから、メニューのFile→Sync Project with Gradle Filesを選んだとき、正常にSyncが完了しているでしょうか?
laravel5

2019/05/19 07:55 編集

回答ありがとう御座います! メニューのFile→Invalidate Caches / Restart は既に実施しております! Syncに関しては、エラーなく終わっております。 ビルドするとシンボルを見つけられませんとエラーが発生します。 上記のSync結果にsync後のキャプチャーを記載させて頂いております。 エラーメッセージ(MainActivity.java) エラー: パッケージandroid.support.annotationは存在しません エラー: シンボルを見つけられません シンボル: クラス ActivityCompat 場所: パッケージ android.support.v4.app エラー: パッケージandroid.support.v4.contentは存在しません エラー: パッケージandroid.support.v7.appは存在しません エラー: シンボルを見つけられません シンボル: クラス AppCompatActivity エラー: シンボルを見つけられません シンボル: クラス NonNull 場所: クラス MainActivity .... etc
keicha_hrs

2019/05/19 08:00

applicationIdはコピーしないでください。これは私が適当につけたものなので・・・。ただ、これが異なるからビルドが通らないとか、体勢に関わるものでもありませんが。それでも通らないというのは何でしょうね。日本語化が影響しているのかな・・・?
laravel5

2019/05/19 08:07 編集

ご教授ありがとう御座います。 applicationIdそのまま、コピーしていました。 修正後、再度、sync->ビルドしても動作しませんでした。 日本語化とはandroid studioの日本語化のことでしょうか? ちなみにandroid studioは英語のままです。
keicha_hrs

2019/05/19 08:35

あれ、日本語でメッセージが出ているのはコンパイラーが出力したものか。失礼しました。うーん、手元では問題なく通るので材料が乏しくなってしまいましたね。ちょっと考えてみますね。
keicha_hrs

2019/05/19 09:08

最後に貼り付けていただいた画像ではMainActivity.javaのタブに赤波線が引かれていませんが、MainActivity.javaを開くと相変わらずエラー状態なのですか?エラーが発生しているコードは、タブのファイル名の下にも赤波線が表示されるはずなのですが。
laravel5

2019/05/19 09:36 編集

keicha_hrsさん 有難う御座います。 プロジェクトを立ち上げる際に、 上記に追加しました、プロジェクト立ち上げで Use android.*artifactsのチェックを外し、 再度プロジェクトを新規追加し 実施すると動作しました。 Use android.*artifactsとはどういう物なのでしょうか? 自分はライブラリーの拡張機能程度に思っておらず そのまま追加しました。
keicha_hrs

2019/05/19 10:05 編集

Use androidx.* artifacts ですね。androidxとxがついていたはずです。これがAndroid Jetpackと呼ばれるコンポーネント群によって提供されるライブラリーを利用するかどうかの選択になります。詳細は下記に資料があります。 https://developer.android.com/jetpack ここにチェックを付けてプロジェクトを作成すると、gradle.propertiesというファイルに android.useAndroidX=true android.enableJetifier=true という2行が加わります。「androidxを使うとプロパティを設定しているのに使っていないじゃないか!」ということでimport文がエラーになっていたんですね。この2行を除去してビルドすれば、新たにプロジェクトを起こさなくても恐らく解決できたでしょう。ここに気がつけなかったのは私の失態です。 Android Studio 3.4では"Use androidx.* artifacts"のチェックボックスはオフがデフォルトですが、Android Studio 3.5からはオンがデフォルトになると思われます(現在配布されているベータ版ではオンになっている)。そうすると、今回の質問のように参考サイトからコードをコピーペーストしたときにビルドが通らないというトラブルに遭遇する人が多くなるかもしれませんね。 これは、「import文まではペーストするな」というのが一番の解決法になります。androidxを使うからといってクラスのコード自体ががらっと変化するわけではなく、import文を適切な名称にすればいいだけの話なので、IDEが提供するimport文補完機能を活用すれば、従来のコードをペーストしたプログラムも(ある程度は)ビルドを通せるはずです。
laravel5

2019/05/19 10:12

ご丁寧にUse androidx.*artifactsの解説有難う御座います。 Android Studio 3.5〜は、Android Jetpackのチェックがデフォルトになるということなので、 今回のサンプルもそうですが、今後は出来るだけAndroid Jetpackを使用して書き換えて言った方が良いのでしょうか? ※ Support Library API 27を使用する理由は過去端末までサポートできるようにする為と 他のサイトに記載されておりましたので、過去端末は切り捨てる前提で Android Jetpackで開発をして方が良いのかと思いました。
keicha_hrs

2019/05/19 11:56

> Support Library API 27を使用する理由は過去端末までサポートできるようにする為 それはどこに書いてあったことですか? Support Libraryやandroidxを用いて作ったプログラムは、基本的に過去のAndroidバージョンの端末でも動作はします。ただ、今回のように特定APIレベルで追加された新機能を利用するために、build.gradleのminSdkVersionによってインストールできる端末のバージョンを制約することはあります。それは今までも今後も変わらないことです。
laravel5

2019/05/20 15:11

回答有難う御座います。 > Support Library API 27を使用する理由は過去端末までサポートできるようにする為 それはどこに書いてあったことですか? 記載されていたサイトURL保存していなかった為、探し回ったのですが、 みつかりませんでした。 そのサイトには記載していた為、勘違いして理解しておりました。 Support Libraryやandroidxを用いて作ったプログラムは過去のversionでも動作するのですね! 知りませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問