2017-06-29 4 views
0

私はアンドロイドスタジオでアプリを作っています。私たちは、Drawableフォルダ内のすべての描画可能なものを含むGooglePlay StoreのようなGridViewを含むポップアップダイアログを作成する方法があるのだろうかと思いました。 アプリでは、ユーザーがボタンをクリックしてダイアログが表示され、プロフィール画像を選択できるようになります。 すべてのドロウアブルを繰り返し処理する方法について、手動でこれを行う必要はありませんか?すべての描画可能なものを含むAndroidスタジオのダイアログ

+0

なぜ「ドロアブル」なのですか?単にストレージ上のフォルダにできませんでしたか?または 'assets'フォルダですか? –

+0

@Rotwang 私は、プロジェクトで使用されているアイコンリソースを選ぶことができるようにしたい、そして私はdrawableフォルダにアイコンを持っていて、それは一致する画面解像度から選択する必要があります。 – Mike

+0

@Rotwangにはforeachループなどの何かの方法がありますか?そのフォルダ内のすべてのアイテムを繰り返し処理するには? – Mike

答えて

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

関連する問題