2010-11-25 11 views
9

Android:APIのバージョンに応じてコードを作成する方法は?アンドロイドで

>Build.VERSION_CODES.DONUT)私は(Build.VERSION.SDK)簡単にSDKのバージョンを取得しますが、プラットフォームが1.6よりも新しい場合、私は唯一のLabeledIntentを使用する必要があり、私は反射が必要であるとし(私はthis linkを読みましたが、それはありますクラスや私にとっては明確ではない)。

これはコードですが、パッケージには、条件が適用されていない場合でも存在する場合は1.6私のアンドロイドで、コンパイラが確認するので、それは私に例外を与える:私はITを解決しHOW

Intent theIntent=....; 
     if(Integer.parseInt(Build.VERSION.SDK) > Build.VERSION_CODES.DONUT) 
    {  
try{ 
      Intent intentChooser = Intent.createChooser(intent,"Choose between these programs"); 
       Parcelable[] parcelable = new Parcelable[1]; 
       parcelable[0] = new android.content.pm.LabeledIntent(theIntent, "", "Texto plano", 0); 
       intentChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, parcelable); 
    activity.startActivity(intentChooser); 
    } 
    catch(Exception e) 
    { 
    activity.startActivity(theIntent); 
    } 

    } else 
    { 
    activity.startActivity(intentMedicamento); 
    } 

、いくつかのメモを正しい答えに戻る

@Commonswareは私にそれを行う方法を示しています。 APIレベルに応じて、API LEVELを使用する1つのクラスまたは別のAPI LEVELを使用する別のクラスをインスタンス化するようにブリッジクラスを作成します。 初心者が忘れる可能性がある唯一の唯一の詳細は、あなたが参照するために築いた最新のSDKであなたのアプリケーションをコンパイルする必要があるということです。

public abstract class LabeledIntentBridge { 
public abstract Intent BuildLabeledIntent(String URL, Intent theintent); 

public static final LabeledIntentBridge INSTANCE=buildBridge(); 

private static LabeledIntentBridge buildBridge() { 
    int sdk=new Integer(Build.VERSION.SDK).intValue(); 

    if (sdk<5) { 
    return(new LabeledIntentOld()); 
    } 

    return(new LabeledIntentNew()); 
} 
} 

だから LabeledIntentNewに、私は、私は私の場合、私は何もしないことなく、意図自体を返す、コントロールの別の種類を実装することができます LabeledIntentOldではAPIレベル5でのみ利用可能 LabeledIntentを参照するすべてのコードが含まれてもっと。

このクラスの呼び出しは次のように行われます。

LabeledIntentBridge.INSTANCE.BuildLabeledIntent(URLtest,theIntent); 
+0

プロジェクトではどのフレームワークバージョンを使用していますか? – Flo

+0

@ Flo.-私のAndroidManifestはminSdkVersion = "4"を定義しています。 LabeledIntentはAPI LEVEL 5のSDKにのみ含まれています。 – netadictos

+0

はい、あなたのプロジェクトで実際にどのフレームワークのバージョンが使用されていますか? minSdkVersionはマニフェストファイルのメタ情報です。プロジェクトを作成したら、作成ダイアログでフレームワークのバージョンを選択しておく必要があります。 – Flo

答えて

2

は、ラッパークラスのパターンdocumented in the page you linked to aboveに従ってください。

+0

私ははっきり見えません。リンクでは、Debug.class.getMethod()メソッドを使用します。これは、LabeledIntentクラスを取得するメソッドですか?いくつかのコードを提供するためのThx。 – netadictos

+0

@netadictos:問題の別のアプローチについては、https://github.com/commonsguy/cw-advandroid/tree/master/Contacts/Spinners/を参照してください。 – CommonsWare

+0

これは、別の方法で私はあなたのスピナーを作成する方法を助けることができますが、Android 1.6を使用するとき、それはクラスandroid.provider.ContactsContractを認識しないため、あなたが私に示すコードは互換性がありません。それは2.2のためにコンパイルする必要があり、1.6の携帯電話で動作しますか? – netadictos

1

あなたは反射を使用する必要があります... アイデアは良いですが、あなたのコードでは1.6で利用できないLabeledIntentを参照してください。したがって、1.6のデバイスに対してアプリが実行されると、クラスを見つけられずクラッシュする可能性があります。

したがって、1.6で動作しているときにLabeledIntentを参照しない場所にコードを記述することが考えられます。これを行うには、LabeledIntentを拡張して関数内で呼び出すラッパークラス(LabeledIntentWrapper)を記述します。 1.6では、デバイスは既知のクラスLabeledIntentWrapperへの参照を参照します。

+0

問題は、とにかくLabeledIntentへの参照を使用していることです。だからこそ私はリフレクションについて言及していますが、それは不可欠ですが、実際にはパラメータを持つため実装する方法がわかりません。 – netadictos

関連する問題