私はアンドロイドスタジオでアプリを作っています。私たちは、Drawableフォルダ内のすべての描画可能なものを含むGooglePlay StoreのようなGridViewを含むポップアップダイアログを作成する方法があるのだろうかと思いました。 アプリでは、ユーザーがボタンをクリックしてダイアログが表示され、プロフィール画像を選択できるようになります。 すべてのドロウアブルを繰り返し処理する方法について、手動でこれを行う必要はありませんか?すべての描画可能なものを含むAndroidスタジオのダイアログ
0
A
答えて
2
R.drawablesクラスを使用し、リフレクションを使用してフィールドを取得します。 のようなものthis。次に、getResources().getIdentifier()を使用してリソースIDを取得します。あなたは(hereから臆面もなくコピーされ、静的クラスにそれを作るために修正)を始めるためにいくつかのコード
興味を持っている場合、私はあなたが次に
package com.example.android.util;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.util.Log;
import java.lang.reflect.Field;
public class ResourceReflectionUtils {
private static final String TAG = ResourceReflectionUtils.class.getName();
private final static String RESOURCE_LOCATION_DRAWABLES = ".R.drawable";
private final static String RESOURCE_LOCATION_LAYOUT = ".R.layout";
private final static String RESOURCE_LOCATION_STRING = ".R.string";
public static Class<?> getResourceClass(Context context, final String suffix) throws PackageManager.NameNotFoundException {
PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
try {
final Class<?> rClassBase = Class.forName(info.packageName + ".R");
final Class<?>[] subClassTable = rClassBase.getDeclaredClasses();
for (Class<?> subClass : subClassTable) {
if (subClass.getCanonicalName().endsWith(suffix)) {
return subClass;
}
}
} catch (ClassNotFoundException e) {
Log.e(TAG, "getResourceClass() ClassNotFoundException: " + e.getMessage(), e);
}
Log.e(TAG, "getResourceClass() Unable to find Sublass: " + suffix);
return null;
}
public static void logFields(Context context, String subclassname) {
try {
final Field[] fields = getResourceClass(context, subclassname).getFields();
for (Field field : fields) {
Log.d(TAG, "logFields() Field: '" + field.getName() + "'");
}
} catch (NullPointerException | PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
public void logSubClasses(String baseClass) {
Log.d(TAG, "logSubClasses() Getting subclasses for '" + baseClass + "' ============= ");
try {
final Class<?> rClass = Class.forName(baseClass);
final Class<?>[] subClassTable = rClass.getDeclaredClasses();
for (final Class<?> subclass : subClassTable) {
Log.d(TAG, "logSubClasses() Class: " + subclass.getCanonicalName());
}
} catch (Exception e) {
Log.e(TAG, "logSubClasses() Error: " + e.getMessage(), e);
}
}
public static int[] getDrawableIds(Context context) {
return getIds(context, RESOURCE_LOCATION_DRAWABLES);
}
public static int[] getIds(Context context, String subclass) {
int[] ids = null;
try {
final Field[] fields = getResourceClass(context, subclass).getFields();
ids = new int[fields.length];
int ii = 0;
for (Field field : fields) {
field.setAccessible(true);
ids[ii] = field.getInt(null);
Log.d(TAG, "logFields() Field: '" + field.getName() + "'");
ii++;
}
} catch (NullPointerException | PackageManager.NameNotFoundException | IllegalAccessException e) {
e.printStackTrace();
return null;
}
return ids;
}
protected static int reflectDrawable(Context context, String fieldName, int defaultValue, boolean reportFailure) {
return reflectResource(context, RESOURCE_LOCATION_DRAWABLES, fieldName, defaultValue, reportFailure);
}
private static int reflectResource(Context context, String resourceLocation, String fieldName, int defaultValue, boolean reportFailure) {
int error = 0;
try {
final Field field = getResourceClass(context, resourceLocation).getField(fieldName);
return field.getInt(null);
} catch (NoSuchFieldException e) {
error = 1;
} catch (IllegalAccessException e) {
error = 2;
} catch (NullPointerException e) {
error = 3;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
if (reportFailure) {
Log.w(TAG, "reflectResource() Resource '" + fieldName + "' not available! (" + error +")");
}
return defaultValue;
}
}
いくつかのコードを投稿することができるかもしれ
int ids[] = ResourceReflectionUtils.getDrawableIds(this);
for(int id: ids) {
Log.i(TAG, context.getResources().getResourceName(id));
}
+2
デモンストレーションする作業コードを追加しました。 – pellucide
関連する問題
- 1. Androidスタジオはすべての描画可能なコンテンツを表示します
- 2. Android - 描画可能なパス
- 3. dpサイズの線を含むImageView用のベクター描画可能
- 4. Androidのギャラリー描画可能なエラー
- 5. アンドロイドのテキストビューで描画可能なサイドベクトル描画可能ベクトル
- 6. Androidベクター描画可能エディタ
- 7. Androidミラーベクトル描画可能
- 8. Android XML描画可能な透明グラデーション
- 9. Androidカスタムボタン描画可能なXMLファイル
- 10. android xml描画可能なパラメータ
- 11. Androidライブラリのベクトル描画可能ファイルv24.0.0
- 12. Androidの描画可能XXX-hdpi
- 13. Androidの長い描画可能リスト
- 14. ブロードキャストレシーバーでAndroidのイメージビューア描画可能
- 15. androidのデータURLに描画可能
- 16. Androidの描画可能で、ベクトル
- 17. Androidスタジオで描画可能なディレクトリが見つかりません
- 18. Androidがダウンロード可能な描画可能ファイルをArraylist <Integer>
- 19. Android:描画可能な方法画像の名前
- 20. Androidのは、ライン描画可能な潜在的なICSのバグ
- 21. Androidスタジオ:ズーム可能画像ビュー
- 22. 描画可能なビットマップ、描画可能な未知のサイズ/寸法
- 23. Android:描画可能なフォルダから画像をビジュアルにする
- 24. カスタムビルドタイプで描画可能なものが見つからない
- 25. リストビューのクリック可能なアイテム - Androidスタジオ
- 26. Androidスタジオでの検索可能なアクティビティ
- 27. Androidカスタム描画可能なペイントストロークの異なる幅
- 28. Android - 変更可能な画像の警告ダイアログ
- 29. すべての可能性を含むベクトルを作る方法
- 30. Androidのフローティングボタンの変更可能な描画イメージ
なぜ「ドロアブル」なのですか?単にストレージ上のフォルダにできませんでしたか?または 'assets'フォルダですか? –
@Rotwang 私は、プロジェクトで使用されているアイコンリソースを選ぶことができるようにしたい、そして私はdrawableフォルダにアイコンを持っていて、それは一致する画面解像度から選択する必要があります。 – Mike
@Rotwangにはforeachループなどの何かの方法がありますか?そのフォルダ内のすべてのアイテムを繰り返し処理するには? – Mike