English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Androidにfragmentを追加した後のバージョン不適合問題について

Fragmentの生成と紹介

Androidはさまざまなデバイス上で動作しており、小さいスクリーンのスマートフォンから超大画面のタブレットやテレビまであります。スクリーンサイズの差に対応するために、多くの場合、まずスマートフォン用のAppを開発し、そのコピーを用意して、レイアウトを変更してタブレットや超大画面に適応させることを行います。スマートフォンとタブレットの両方に適応するAppを作成することができませんか?もちろんできます。Fragmentがその問題を解決するために登場しました。FragmentはActivityの画面の一部として考えられ、Activityの画面はFragmentで構成されることもあります。さらに素晴らしいことに、Fragmentには独自のライフサイクルがあり、ユーザーのイベントを受け取り処理することができます。これにより、Activityで多くのイベント処理のコードを書く必要がなくなります。さらに重要なことに、Fragmentを動的に追加、交換、削除することができます。

昨日、AndroidのFragmentについて学びました。公式のチュートリアルに従って、BlankFragmentというクラスを作成し、Fragmentを継承しました。その後、コンパイル時にエラーが発生しました:

エラー:タスク':app:processDebugManifest'の実行に失敗しました。
> マニフェスト統合失敗: 属性meta-data#android.support.VERSION@value value=(26.0.0-beta1)から[com.android.support:design:26.0.0-beta1] AndroidManifest.xml:28:13-41
  [com.android.support:support-v4:26.1.0] AndroidManifest.xmlにも存在します:28:13-35 value=(26.1.0).
  提案:'tools:replace="android:value"'を<metaに追加してください。-data> AndroidManifest.xmlのelement:26:9-28:44 オーバーライドする。

検索してみたら、いろんなことが書かれていました。最も怪しいのはmanifestファイルのタグをandroid:nameからclassに変更するというものでした。ログを見るとバージョンに関連しているのは明らかです!やっとバージョンに対応する解決策を見つけましたが、appディレクトリのbuild.gradleに以下のコードを追加する必要があります:

configurations.all {}}
  resolutionStrategy.eachDependency { DependencyResolveDetails details ->
    def requested = details.requested
    if (requested.group == 'com.android.support') {
      if (!requested.name.startsWith("multidex")) {
        details.useVersion '26.0.0-beta1'
      }
    }
  }
}

試してみたら実際に良くなりました。しかし、これでは十分ではありません。

注目してみると、この追加コードの上には、プロジェクトの依存関係ライブラリについて説明されています:

dependencies {
  implementation fileTree(dir: 'libs', include: ['*.jar'])
  implementation 'com.android.support:appcompat-v7:26.0.0-beta1'
  implementation 'com.android.support.constraint:constraint-layout:1.0.2'
  implementation 'com.android.support:design:26.0.0-beta1'
  implementation 'com.android.support:support-v4:26.1.0'
  testImplementation 'junit:junit:4.12'
  androidTestImplementation 'com.android.support.test:runner:0.5'
  androidTestImplementation 'com.android.support.test.espresso:espresso-core:2.2.2'
}

その行の下には赤い線があります:

implementation 'com.android.support:appcompat-v7:26.0.0-beta1'

マウスを指で合わせると表示される:

すべてのcom.android.supportライブラリは同じバージョン指定を使用する必要があります 
(バージョンのミックスはランタイムクラッシュにつながる可能性があります). 
バージョンが見つかりました 26.1.0, 26.0.0-beta1. 例えば、com.android.support:support-compat:26.1.0 
そして com.android.support:animated-vector-drawable:26.0.0-beta1

これは明確に言っています:com.android.supportに依存するすべてのライブラリは同じバージョンを使用する必要があります!Dependency内を見てみましょう、com.android.support:appcompat-v7:26.0.0-beta1と com.android.support:support-v4:26.1.0 の二つのバージョンは矛盾しています!gitの履歴を見てみましょう、26.1.0 という行は新しく追加されたもので、BlankFragment クラスを作成したときに AndroidStudio が自動的に追加したものです。もう一度エラーログを見てみましょう、言っているのは同じ意味ですか?

AndroidStudio は、自動的にバージョン依存関係を追加すると言うなら、バージョン互換性も一括でチェックしてほしいです。そうしないなら、自分でやった方がいいです。半自動化のものは最も嫌いで、最も損をします。

また、gradle ファイルの文法もとても面白いです。コメントは C/C++のスタイル、関数宣言は Python のスタイル、ラムダ式は C# のスタイルに少し似ています。

要約

以上は編集者が皆さんに紹介した Android に fragment を追加した後にバージョン不適合問題に関するものです。皆さんの助けになれば幸いです。何かご不明な点がございましたら、コメントを残してください。編集者は迅速に回答いたします。また、呐喊教程サイトへのサポートに感謝しています。

声明:本文の内容はインターネットから取得しており、著作権者に帰属します。インターネットユーザーが自発的に貢献し、自己でアップロードしたものであり、本サイトは所有権を持ちません。また、人工的な編集処理もなく、関連する法的責任も負いません。著作権に抵触する内容が見つかりましたら、メールで notice#w までご連絡ください。3codebox.com(メールを送信する際には、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認が取れましたら、本サイトは即座に侵害される可能性のある内容を削除します。)

おすすめ