2011-08-11 11 views
2

私はDrawable-mdpiフォルダに(my_image.png)というイメージを持っています。ValueからResource.Idを取得するには?

androidアプリケーションがWebサービスとやりとりします。それは "my_image"を返すかもしれません。私のアンドロイドアプリケーションは、この画像をロードする必要があります。

私はMonodroidを使用していますが、私はまだ結果は常に"0"あるこの

int abc = Resources.GetIdentifier("my_image","drawable",null); 

を試してみました。それは周り探し

 // aapt resource value: 0x7f020000 
     public const int my_image = 2130837504; 

(リソースファイルから)であるべきとAndroid方法は似ているように思えるとき

int i = this.getResources().getIdentifier("txt_asecondtext", "strings", this.getPackageName()); 

私の代わりにnullのパッケージ名を渡してみましたが、それは何もしませんでした。

+0

私は、あなたの最後のサンプルラインが動作していない理由を理解したと思います。 'strings'は' string'でなければなりません – gtcompscientist

答えて

5

問題が二つある:

  1. あなたが必要Resources.GetIdentifier()コールにパッケージ名を指定し、nullは使用しないでください。
  2. 正しいパッケージ名を使用する必要があります。

正しいパッケージ名を取得することを確認する簡単な方法は、Android.Content.Context.PackageNameプロパティを使用することです:あなたは/ビルドを見て、その後、Context.PackageNameを使用することはできませんしたくない場合は

int id = Resources.GetIdentifier ("my_image", "drawable", PackageName); 

を出力、例えばファイルobj\Debug\android\AndroidManifest.xmlを入力し、属性値/manifest/@packageの値を使用します。例えば、AndroidManifest.xmlが含まれていてもよい:

int id = Resources.GetIdentifier ("my_image", "drawable", 
     "MonoAndroidApplication2.MonoAndroidApplication2"); 

[email protected]については、加入者が、 How to use Resources.GetIdentifier()スレッドを見て、followup message

<?xml version="1.0" encoding="utf-8"?> 
<manifest 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:versionCode="1" 
     android:versionName="1.0" 
     package="MonoAndroidApplication2.MonoAndroidApplication2"> 
    <!-- ... --> 
</manifest> 

をこのように、あなたの代わりに使用することができます。

+0

あなたが行ったように(「MonoAndroidApplication2.MonoAndroidApplication2」)、パッケージ名を使用しても機能しませんでした。たとえば、2つの異なる部分文字列を2つに変更する必要がありました。 "MonoForAndroid.MonoAndroidApplication2" –

+0

'com.android.internal.R.string.ime_action_done'のようなものにアクセスする必要がある場合はどうすればいいですか? –

3

あなただけ適切にあなたの要求をフォーマットする必要があります。

の代わりに:

int i = this.getResources().getIdentifier("txt_asecondtext", "strings", this.getPackageName()); 

試してみてください。

int i = getResources().getIdentifier("[fully qualified package]:drawable/[resource name]", null, null); 

のでResource "my_image" のパッケージに "com.example" それは次のようになります。

int i = getResources().getIdentifier("com.example:drawable/my_image", null, null); 

UPDATE:私は私はあなたのエラーを指摘してきたと信じていますが、上記の行ったよう

int i = getResources().getIdentifier(
    getPackageName() + ":drawable/" + resource_name, null, null); 
Log.d("EXAMPLE", "Just making sure that these IDs match: '" + i + "' == '" + R.drawable.resource_name + "'."); 

これもフォーマットすることができ、:は私も(それを証明ログラインを含む次の作品は私を形成することをテストしました: int i = getResources()。getIdentified(リソース名、 "drawable"、getPackageName());このような私は、文字列ressourceについては

+0

いいえ、何もしていないようです。まだゼロが印刷されています。 – chobo2

+0

私は自分のコードでこれをテストしたところ、うまくいったので、同じ方法で設定していることを確認しましょう。あなたは現在あなたが試みているラインであなたの質問を更新できますか? – gtcompscientist

+1

"Resources.getSystem()。getIdentifier(name、defType、defPackage)"は使用しないでくださいが、現在のContextのResourcesオブジェクトを使用してください。 –

1

String s = "nameToFetch"; 
String text = getString(getResources().getIdentifier("str_" + s, "string", getPackageName())); 

だから私はあなたが呼び出す必要があり、あなたの描画可能なためだと思う:

String s = "nameToFetch"; 
Drawable drawable = getDrawable(getResources().getIdentifier("d_" + s, "drawable", getPackageName()));