Java Android Studio对话框,包含所有可绘图项
我正在android studio中制作一个应用程序,我想知道是否有办法制作一个弹出对话框,其中包含一个类似Google Play商店的GridView,其中包含drawable文件夹中的所有drawable。 在应用程序中,用户应单击按钮,然后显示对话框,允许他/她选择自己的个人资料图像。Java Android Studio对话框,包含所有可绘图项,java,android,dialog,Java,Android,Dialog,我正在android studio中制作一个应用程序,我想知道是否有办法制作一个弹出对话框,其中包含一个类似Google Play商店的GridView,其中包含drawable文件夹中的所有drawable。 在应用程序中,用户应单击按钮,然后显示对话框,允许他/她选择自己的个人资料图像。 关于如何遍历所有drawables而不必手动执行此操作的任何提示?使用R.drawables类并使用反射获取其字段。 差不多。然后使用获取资源id。如果您感兴趣,我可以发布一些代码 一些让您开始的代码(不
关于如何遍历所有drawables而不必手动执行此操作的任何提示?使用R.drawables类并使用反射获取其字段。 差不多。然后使用获取资源id。如果您感兴趣,我可以发布一些代码
一些让您开始的代码(不知羞耻地从中复制并修改为静态类)
使用R.drawables类并使用反射获取其字段。 差不多。然后使用获取资源id。如果您感兴趣,我可以发布一些代码
一些让您开始的代码(不知羞耻地从中复制并修改为静态类)
为什么
drawinable
s?它不能仅仅是存储上的一个文件夹吗?或者可能是assets
文件夹?@Rotwang我希望用户能够选择项目中使用的任何图标资源,我在drawable文件夹中有图标,它应该从匹配的屏幕分辨率中进行选择。@Rotwang没有像foreach循环之类的方法吗?遍历文件夹中的每一项?据我所知,没有。这就是为什么我建议使用“常规”文件夹,而不是drawables
。对于可绘图项
,您必须知道它们的所有名称。无论如何,我不明白将你的应用程序使用的图形(包括背景、按钮等等)分享给用户有什么意义。只共享一组预定义的头像不是更好吗?和/或他们(用户)自己的照片?嗯,@pellucide似乎有正确的答案。为什么drawable
s?它不能仅仅是存储上的一个文件夹吗?或者可能是assets
文件夹?@Rotwang我希望用户能够选择项目中使用的任何图标资源,我在drawable文件夹中有图标,它应该从匹配的屏幕分辨率中进行选择。@Rotwang没有像foreach循环之类的方法吗?遍历文件夹中的每一项?据我所知,没有。这就是为什么我建议使用“常规”文件夹,而不是drawables
。对于可绘图项
,您必须知道它们的所有名称。无论如何,我不明白将你的应用程序使用的图形(包括背景、按钮等等)分享给用户有什么意义。只共享一组预定义的头像不是更好吗?和/或他们(用户)自己的照片?嗯,@pellucide似乎有正确的答案。
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));
}