Accessing Android Resources By Name at Runtime

本文介绍了一种在Android应用程序中获取特定图片资源ID的方法。通过使用`getIdentifier`方法并指定资源名称、类型及包名,可以有效地获取到资源的ID。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

For example: I have a file bug.png in the "/res/drawable/ ", so i get its ResourceID with the following code:

 

int resID = getResources( ) .getIdentifier ( "org.anddev.android.testproject:drawable/bug" , null , null ) ;
// or
int resID = getResources( ) .getIdentifier ( "bug" , "drawable" , "org.anddev.android.testproject" ) ;

 

 

08-04 15:13:41.002 5314 5314 W tek.inputmethod: Accessing hidden method Ldalvik/system/VMRuntime;->setHiddenApiExemptions([Ljava/lang/String;)V (blocked,core-platform-api, reflection, denied) 08-04 15:13:41.286 5352 5352 W utmethod.assist: Accessing hidden method Ldalvik/system/VMRuntime;->setHiddenApiExemptions([Ljava/lang/String;)V (blocked,core-platform-api, reflection, denied) 08-04 15:13:47.672 5471 5735 W ngdong.app.mall: Long monitor contention with owner RunnerWrapper_338 (6150) at void java.lang.Runtime.loadLibrary0(java.lang.ClassLoader, java.lang.Class, java.lang.String)(Runtime.java:1084) waiters=0 in void java.lang.Runtime.loadLibrary0(java.lang.ClassLoader, java.lang.Class, java.lang.String) for 220ms 08-04 15:13:57.146 1750 2440 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: binder:1750_9 08-04 15:13:57.146 1750 2440 E AndroidRuntime: java.lang.StackOverflowError: stack size 991KB 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at android.graphics.drawable.VectorDrawable$VPath.<init>(VectorDrawable.java:1638) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at android.graphics.drawable.VectorDrawable$VFullPath.<init>(VectorDrawable.java:1898) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at android.graphics.drawable.VectorDrawable$VGroup.<init>(VectorDrawable.java:1330) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at android.graphics.drawable.VectorDrawable$VectorDrawableState.<init>(VectorDrawable.java:994) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at android.graphics.drawable.VectorDrawable.<init>(VectorDrawable.java:364) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at android.graphics.drawable.VectorDrawable.<init>(Unknown Source:0) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at android.graphics.drawable.VectorDrawable$VectorDrawableState.newDrawable(VectorDrawable.java:1085) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at android.graphics.drawable.Drawable$ConstantState.newDrawable(Drawable.java:1532) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at android.content.res.DrawableCache.getInstance(DrawableCache.java:45) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:658) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at android.content.res.Resources.loadDrawable(Resources.java:1004) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at android.content.res.Resources.getDrawableForDensity(Resources.java:994) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at android.content.res.Resources.getDrawable(Resources.java:933) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at android.content.Context.getDrawable(Context.java:948) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityRecord.lambda$updateEnterpriseThumbnailDrawable$0(ActivityRecord.java:645) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityRecord.$r8$lambda$365UxoHaJfIpMBzIwgtkcWR0vGE(ActivityRecord.java:0) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityRecord$$ExternalSyntheticLambda31.get(R8$$SyntheticClass:0) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at android.app.admin.ParcelableResource.loadDefaultDrawable(ParcelableResource.java:275) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at android.app.admin.DevicePolicyResourcesManager.getDrawable(DevicePolicyResourcesManager.java:214) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityRecord.updateEnterpriseThumbnailDrawable(ActivityRecord.java:643) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityRecord.<init>(ActivityRecord.java:2301) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityRecord.<init>(ActivityRecord.java:0) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityRecord$Builder.build(ActivityRecord.java:11354) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityStarter.executeRequest(ActivityStarter.java:1431) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:805) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1310) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1261) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityTaskManagerService.startActivity(ActivityTaskManagerService.java:1236) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at android.app.Instrumentation.execStartActivity(Instrumentation.java:1887) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at android.app.ContextImpl.startActivity(ContextImpl.java:1132) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.SplitScreenHelper.startSplitActivities(SplitScreenHelper.java:73) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1746) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityStarter.executeRequest(ActivityStarter.java:1475) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:805) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1310) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1261) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityTaskManagerService.startActivity(ActivityTaskManagerService.java:1236) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at android.app.Instrumentation.execStartActivity(Instrumentation.java:1887) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at android.app.ContextImpl.startActivity(ContextImpl.java:1132) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.SplitScreenHelper.startSplitActivities(SplitScreenHelper.java:73) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1746) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityStarter.executeRequest(ActivityStarter.java:1475) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:805) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1310) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1261) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityTaskManagerService.startActivity(ActivityTaskManagerService.java:1236) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at android.app.Instrumentation.execStartActivity(Instrumentation.java:1887) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at android.app.ContextImpl.startActivity(ContextImpl.java:1132) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.SplitScreenHelper.startSplitActivities(SplitScreenHelper.java:73) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1746) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityStarter.executeRequest(ActivityStarter.java:1475) 08-04 15:13:57.146 1750 2440 E AndroidRuntime: at com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:805)这段报错的原因,怎么解决,修改为:public void startSplitActivities(Intent primaryIntent, Intent secondaryIntent,ActivityTaskManagerService atmService) { //public void enterSplitScreen(Activity primary, Activity secondary) { // 创建一个WindowContainerTransaction来执行操作 WindowContainerTransaction wct = new WindowContainerTransaction(); // 创建第一个TaskFragment IBinder fragmentToken1 = new Binder(); //TaskFragment taskFragment1 = mOrganizer.createTaskFragment( // wct, null, fragmentToken1, null); TaskFragment taskFragment1 = new TaskFragment(atmService, fragmentToken1, true, true); // 创建第二个TaskFragment IBinder fragmentToken2 = new Binder(); //TaskFragment taskFragment2 = mOrganizer.createTaskFragment( // wct, null, fragmentToken2, null); TaskFragment taskFragment2 = new TaskFragment(atmService, fragmentToken2, true, true); // 关键修复:获取 WindowContainerToken 的正确方式 WindowContainerToken wcToken1 = taskFragment1.mRemoteToken.toWindowContainerToken();//getOrganizerToken(); WindowContainerToken wcToken2 = taskFragment2.mRemoteToken.toWindowContainerToken();//getOrganizerToken(); // 设置两个TaskFragment为相邻关系 wct.setAdjacentTaskFragments(fragmentToken1, fragmentToken2, null); // 获取屏幕尺寸 int displayWidth = mContext.getResources().getDisplayMetrics().widthPixels; int displayHeight = mContext.getResources().getDisplayMetrics().heightPixels; // 设置第一个TaskFragment在左侧,占据屏幕宽度的一半 Rect bounds1 = new Rect(0, 0, displayWidth / 2, displayHeight); wct.setBounds(wcToken1, bounds1); // 设置第二个TaskFragment在右侧,占据屏幕宽度的一半 Rect bounds2 = new Rect(displayWidth / 2, 0, displayWidth, displayHeight); wct.setBounds(wcToken2, bounds2); // 启动第一个Activity到第一个TaskFragment中 ActivityOptions options1 = ActivityOptions.makeBasic(); options1.setLaunchWindowingMode(WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW); options1.setLaunchTaskFragmentToken(fragmentToken1); mContext.startActivity(primaryIntent, options1.toBundle()); // 启动第二个Activity到第二个TaskFragment中 ActivityOptions options2 = ActivityOptions.makeBasic(); options2.setLaunchWindowingMode(WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW); options2.setLaunchTaskFragmentToken(fragmentToken2); mContext.startActivity(secondaryIntent, options2.toBundle()); // 应用事务 //mOrganizer.applyTransaction(wct); mOrganizer.applyTransaction(wct, TaskFragmentOrganizer.TASK_FRAGMENT_TRANSIT_OPEN, false); /* // 获取屏幕尺寸 Display display = primary.getDisplay(); int displayWidth = display.getWidth(); int displayHeight = display.getHeight(); // 创建 WindowContainerTransaction WindowContainerTransaction wct = new WindowContainerTransaction(); // 创建两个 TaskFragment IBinder fragmentToken1 = new android.os.Binder(); IBinder fragmentToken2 = new android.os.Binder(); mOrganizer.createTaskFragment(wct, fragmentToken1, primary.getActivityToken()); mOrganizer.createTaskFragment(wct, fragmentToken2, secondary.getActivityToken()); // 设置边界(左右分屏) Rect bounds1 = new Rect(0, 0, displayWidth / 2, displayHeight); Rect bounds2 = new Rect(displayWidth / 2, 0, displayWidth, displayHeight); wct.setBounds(fragmentToken1, bounds1); wct.setBounds(fragmentToken2, bounds2); // 设置启动选项 ActivityOptions options1 = ActivityOptions.makeBasic(); options1.setLaunchWindowingMode(WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW); ActivityOptions options2 = ActivityOptions.makeBasic(); options2.setLaunchWindowingMode(WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW); // 将 Activity 放入对应的 TaskFragment wct.reparentActivityToTaskFragment(fragmentToken1, primary.getActivityToken()); wct.reparentActivityToTaskFragment(fragmentToken2, secondary.getActivityToken()); // 应用事务 mOrganizer.applyTransaction(wct, TaskFragmentOrganizer.TASK_FRAGMENT_TRANSIT_OPEN, false); */ }
08-05
分析以下代码的报错信息:------------------------- PROCESS STARTED (7432) for package com.example.myapplication ---------------------------- 2025-07-09 13:27:09.041 7432-7432 e.myapplicatio com.example.myapplication W ClassLoaderContext classpath size mismatch. expected=0, found=1 (PCL[] | PCL[/data/data/com.example.myapplication/code_cache/.overlay/base.apk/classes3.dex*4250602868]) 2025-07-09 13:27:09.042 7432-7432 e.myapplicatio com.example.myapplication W Found duplicate classes, falling back to extracting from APK : /data/app/~~dh0o8WK_fXecSV_JJz78RQ==/com.example.myapplication-RE5zX8NpQzXhviy1xPMobA==/base.apk 2025-07-09 13:27:09.042 7432-7432 e.myapplicatio com.example.myapplication W NOTE: This wastes RAM and hurts startup performance. 2025-07-09 13:27:09.042 7432-7432 e.myapplicatio com.example.myapplication W Found duplicated class when checking oat files: 'Lcom/example/myapplication/ListActivity$1;' in /data/data/com.example.myapplication/code_cache/.overlay/base.apk/classes3.dex and /data/app/~~dh0o8WK_fXecSV_JJz78RQ==/com.example.myapplication-RE5zX8NpQzXhviy1xPMobA==/base.apk!classes3.dex 2025-07-09 13:27:09.172 7432-7432 NetworkSecurityConfig com.example.myapplication D No Network Security Config specified, using platform default 2025-07-09 13:27:09.173 7432-7432 NetworkSecurityConfig com.example.myapplication D No Network Security Config specified, using platform default 2025-07-09 13:27:09.201 7432-7456 libEGL com.example.myapplication D loaded /vendor/lib/egl/libEGL_emulation.so 2025-07-09 13:27:09.202 7432-7456 libEGL com.example.myapplication D loaded /vendor/lib/egl/libGLESv1_CM_emulation.so 2025-07-09 13:27:09.204 7432-7456 libEGL com.example.myapplication D loaded /vendor/lib/egl/libGLESv2_emulation.so 2025-07-09 13:27:09.246 7432-7432 AppCompatDelegate com.example.myapplication D Checking for metadata for AppLocalesMetadataHolderService : Service not found 2025-07-09 13:27:09.305 7432-7432 e.myapplicatio com.example.myapplication W Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (greylist, reflection, allowed) 2025-07-09 13:27:09.305 7432-7432 e.myapplicatio com.example.myapplication W Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (greylist, reflection, allowed) 2025-07-09 13:27:09.397 7432-7454 HostConnection com.example.myapplication D HostConnection::get() New Host Connection established 0xe9a68250, tid 7454 2025-07-09 13:27:09.403 7432-7454 HostConnection com.example.myapplication D HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_native_sync_v2 ANDROID_EMU_native_sync_v3 ANDROID_EMU_native_sync_v4 ANDROID_EMU_dma_v1 ANDROID_EMU_direct_mem ANDROID_EMU_host_composition_v1 ANDROID_EMU_host_composition_v2 ANDROID_EMU_vulkan ANDROID_EMU_deferred_vulkan_commands ANDROID_EMU_vulkan_null_optional_strings ANDROID_EMU_vulkan_create_resources_with_requirements ANDROID_EMU_YUV_Cache ANDROID_EMU_vulkan_ignored_handles ANDROID_EMU_has_shared_slots_host_memory_allocator ANDROID_EMU_vulkan_free_memory_sync ANDROID_EMU_vulkan_shader_float16_int8 ANDROID_EMU_vulkan_async_queue_submit ANDROID_EMU_sync_buffer_data ANDROID_EMU_vulkan_async_qsri ANDROID_EMU_read_color_buffer_dma GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_host_side_tracing ANDROID_EMU_gles_max_version_2 2025-07-09 13:27:09.404 7432-7454 OpenGLRenderer com.example.myapplication W Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without... 2025-07-09 13:27:09.411 7432-7454 EGL_emulation com.example.myapplication D eglCreateContext: 0xe9a68170: maj 2 min 0 rcv 2 2025-07-09 13:27:09.414 7432-7454 EGL_emulation com.example.myapplication D eglMakeCurrent: 0xe9a68170: ver 2 0 (tinfo 0xe9db64d0) (first time) 2025-07-09 13:27:09.438 7432-7454 Gralloc4 com.example.myapplication I mapper 4.x is not supported 2025-07-09 13:27:09.439 7432-7454 HostConnection com.example.myapplication D createUnique: call 2025-07-09 13:27:09.439 7432-7454 HostConnection com.example.myapplication D HostConnection::get() New Host Connection established 0xe9a6acc0, tid 7454 2025-07-09 13:27:09.467 7432-7454 HostConnection com.example.myapplication D HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_native_sync_v2 ANDROID_EMU_native_sync_v3 ANDROID_EMU_native_sync_v4 ANDROID_EMU_dma_v1 ANDROID_EMU_direct_mem ANDROID_EMU_host_composition_v1 ANDROID_EMU_host_composition_v2 ANDROID_EMU_vulkan ANDROID_EMU_deferred_vulkan_commands ANDROID_EMU_vulkan_null_optional_strings ANDROID_EMU_vulkan_create_resources_with_requirements ANDROID_EMU_YUV_Cache ANDROID_EMU_vulkan_ignored_handles ANDROID_EMU_has_shared_slots_host_memory_allocator ANDROID_EMU_vulkan_free_memory_sync ANDROID_EMU_vulkan_shader_float16_int8 ANDROID_EMU_vulkan_async_queue_submit ANDROID_EMU_sync_buffer_data ANDROID_EMU_vulkan_async_qsri ANDROID_EMU_read_color_buffer_dma GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_host_side_tracing ANDROID_EMU_gles_max_version_2 2025-07-09 13:27:10.478 7432-7432 AndroidRuntime com.example.myapplication D Shutting down VM 2025-07-09 13:27:10.479 7432-7432 AndroidRuntime com.example.myapplication E FATAL EXCEPTION: main Process: com.example.myapplication, PID: 7432 android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? at android.view.ViewRootImpl.setView(ViewRootImpl.java:1068) at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:409) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:109) at android.app.Dialog.show(Dialog.java:340) at android.app.AlertDialog$Builder.show(AlertDialog.java:1131) at com.example.myapplication.MyBaseAdapter$1.onClick(MyBaseAdapter.java:55) at android.view.View.performClick(View.java:7448) at android.view.View.performClickInternal(View.java:7425) at android.view.View.access$3600(View.java:810) at android.view.View$PerformClick.run(View.java:28305) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 2025-07-09 13:27:10.509 7432-7432 Process com.example.myapplication I Sending signal. PID: 7432 SIG: 9 ---------------------------- PROCESS ENDED (7432) for package com.example.myapplication ----------------------------
07-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值