Android開発ノート(八十二)システムソフトウェア互換性


統一テーマとスタイルAndroidコントロールの多くの属性にはデフォルト値があります.例えば、文字のデフォルト黒、編集ボックスのデフォルト透明背景などですが、androidはオープンソースなので、各メーカーが独自に修正して補うので、デフォルト値が頼りにならないことが多いです.例を次に示します.
1、一部の低バージョンのAndroidでは、文字色textColorを指定しない場合、デフォルトの文字色は白です.
2、編集ボックスには、デフォルトの透明な背景にベースラインを追加するものもあれば、デフォルトの白いフィレットの背景もあります.
3、テーマHoloのデフォルトは薄いグレーの背景ですが、一部のブランドの携帯電話では深いグレーの背景に変更されています.
4、ViewのgetDrawingCacheメソッドを呼び出して指定したコントロールをスクリーンショットします.デフォルトの背景はUIで見た透明な背景ではなく黒です.驚いていませんか.だから、スクリーンショットの前に背景色を設定します.
したがって、appを異なるデバイスで同じ表示スタイルにするためには、自分で所望の各種属性値を設定する必要があります.また、できるだけシステムが持参したテーマを使わずに、テーマスタイルをカスタマイズする可能性がある場合は、デバイスメーカーがデフォルト属性値を変更しても、appは統一されたスタイルを維持します.
SDK対応各バージョンのAndroidは一定時間ごとに新しいバージョンと新しいSDKが発売され、携帯電話のAndroidバージョンもそれぞれ異なり、最初の2.2から4.0から5.0から6.0まで、SDKのAPIの更新が頻繁で、時にはappが高バージョンのapiを使用するとともに、低バージョンの携帯電話と互換性を持ちたい場合があります.
1、AndroidManifest.xmlのuses-sdkラベルは、互換性のあるsdkの最低バージョン番号minSdkVarsionを指定するとともに、コンパイル用のsdkターゲットバージョン番号targetSdkVarsionを指定します.
2、コードの中で現在の設備のsdkバージョン番号を判断し、すなわちBuildを取得する.VERSION.SDK_INTの値は、現在のバージョン番号が指定されたバージョンより小さい場合、低バージョンの処理ロジックをとると判断する.現在のバージョン番号が指定したバージョンより大きい場合は、高いバージョンの処理ロジックが使用されます.
3、コードの中に高バージョンapiを呼び出すところがあり、対応方法の前に「@TargetApi()」のラベルまたは「@SuppressLint("NewApi")」のラベルを付ける.この2つのラベルの違いは以下の通りである.
@TargetApi()は、新しいapiの開始時にのみ使用できるメソッドレポートのandroid lintエラーをブロックします.
@SuppressLint("NewApi")新しいapiでしか使用できないメソッドのandroid lintエラーをすべてブロックします.
注意、TargetApi方式でもNewApi方式でもADTのコンパイルエラーしか解消できず、app内部処理の場合はBuildによる.VERSION.SDK_INTは分岐判断をする.
supportパッケージのAndroid対応sdkにはandroid-support-v 4を含むいくつかのサポートパッケージが追加されています.jar、android-support-v7-***.jar、android-support-v13.JArなどは、低バージョンのAndroidでも高バージョンの新しいコントロールを使用できるようにサポートパッケージを発売することを目的としています.次に、パッケージでよく使用されるコントロールをいくつか説明します.
android.support.v4.view.ViewPager、android.support.v4.app.Fragment
android.support.v7.app.ActionBar、android.support.v7.app.ActionBarActivity
android.support.v13.app.FragmentTabHost
v 4のコントロールでは、コード内のimport関連クラスで良いのですが、v 7のコントロールではimportだけでは足りません.ただし、importはパッケージv 7のコントロールクラスをサポートしており、コンパイル時には問題ありませんが、実行時に「java.lang.NoClassDefFoundError:android.support.v 7.appcompat.R$styleable」とエラーが発生します.これは、v 7の完全なパッケージにjarファイルのほかにリソースファイルがあるため、v 7パッケージをライブラリエンジニアリングとして参照する必要があります.
android-support-v 7-appcompat.jarの場合、ADTでメニュー「File」——「Import」——「Existing Android Code Into Workspace」——「Next」の順に選択し、sdkインストールディレクトリの下のappcompatパス、例えば「sdkextrasandroidsupportv 7appcompat」を選択します.しかし、導入後、コンパイルは「android:Widget.Material.ActionButton」が見つからず、project.propertiesの「target=android-19」を「target=android-21」に変更し、ライブラリエンジニアリングも自分のエンジニアリングも変更することに注意します.
これでコンパイルはやっと大丈夫です.ブロガーは喜んでappを起動しましたが、意外にもページに入っても異常に終了し、ログは「Caused by:java.lang.IllegalStateException:You need to use a Theme.AppCompat theme(or descendant)with this activity」と間違っていました.本当に紆余曲折ですね.この間違いの原因は、ActionBarActivityの派生類がv 7のappcompatテーマを使用しなければならないことです.具体的な解決策はAndroidManifestを修正することです.xmlは、指定されたクラスのラベルを見つけて、「android:theme=「@style/theme.AppCompat.Light」という属性を加えて、再コンパイルして実行するとappが正常に使用されます.
5.0対応の水波アニメーションAndroid 5.0の後に水波アニメーションRippleDrawableを追加して、今4.Xシリーズの携帯電話で水波効果を使うと、水波コントロールをカスタマイズします.このうち、ブロガーの検証を経て、以下の3つの水波コントロールが利用でき、その効果はそれぞれ千秋で、具体的には以下のように紹介されています.
1、RevealLayout
RevealLayoutはLinearLayoutから継承され、ビューバックグラウンドの水波として使用することも、単一のコントロールの水波として使用することもできます.
RevealLayoutラベルは、レイアウトファイルで直接使用できます.
RevealLayoutのコードをダウンロードしてhttps://github.com/kyze8439690/RevealLayout
2、RippleView
RippleViewはRelativeLayoutから継承され、ビューバックグラウンドの水波としてのみ使用でき、単一のコントロールの水波としても使用できます.
RippleViewラベルは、レイアウトファイルで直接使用できます.
RippleViewのコードをダウンロードしてhttps://github.com/traex/RippleEffect
3、MaterialRippleLayout
MaterialRippleLayoutはFrameLayoutから継承され、ビューの背景水波としてのみ使用できますが、ビューにボタンのような他のコントロールがある場合、水波はボタンで遮られます.
MaterialRippleLayoutはレイアウトファイルで直接使用できません.コードで次のように呼び出すには、次の手順に従います.
    	MaterialRippleLayout.on(layout1)
        .rippleColor(Color.BLACK)
        .rippleAlpha(0.2f)
        .rippleHover(true)
        .create();
MaterialRippleLayoutのコードをダウンロードしてhttps://github.com/balysv/material-ripple
Android開発ノートの完全なディレクトリを確認します