繁体   English   中英

Android:可绘制图标是不可见的

[英]Android: Drawable Icon is invisible

我正在尝试获取设备上安装的应用程序列表,并在 RecyclerView 中显示它们及其图标。

以下代码用于获取应用程序:

Intent intent = new Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> installedApps= packageManager.queryIntentActivities(intent, 0);

        installedApps.forEach(p-> {
            String appName = p.loadLabel(packageManager).toString();
            String appPackageName = p.activityInfo.packageName;
            Drawable icon = p.loadIcon(packageManager);
            ApplicationInfo info = p.activityInfo.applicationInfo;

            App_Object appObject = new App_Object(appName, appPackageName, icon, info);
            if(!List_AllApps.contains(appObject)) {
                List_AllApps.add(appObject);
            }
        });
        
List_AllApps.sort(Comparator.comparing(o -> o.app_name));

这里的问题是,一些 Drawable 是不可见的,无法显示,即使它们不为空。

我发现所说的 Drawable 确实有一个 icon.getIntrinsicHeight() 和一个 icon.getIntrinsicWidth() 为 0,这导致它们不可见。

我已经尝试将 Drawables 转换为 ShapeDrawables,因为您可以在那里使用 setIntrinsicWidth() 和 setIntrinsicHeight() 但我没有成功。 我还尝试设置未显示的 Drawables 的边界,并尝试将它们转换为 BitmapDrawables 但没有任何结果。

这里奇怪的是,有时图标会在没有对代码进行任何更改的情况下显示,所以我真的很困惑我还能尝试解决什么问题(getIntrinsicWidth() 和 getIntrinsicHeight() 然后大于 0 并且有所需的值)。

如何解决这个问题? 我可以以任何其他方式调整它们的大小以便它们显示出来吗?

这是在 Recyclerview 中为 Imageview 设置 Drawable 时的样子的图片Image

任何帮助深表感谢!

要显示设备上安装的应用程序列表,您可以使用包管理器的 GET_META_DATA。

 public void getInstalledApplication() { PackageManager pm = getPackageManager(); List < ApplicationInfo > packages = pm.getInstalledApplications(PackageManager.GET_META_DATA); //You have all list of packages in the device. for (ApplicationInfo packageInfo: packages) { //Check if the application is updated or not if ((packageInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) { addToInstalledApps(packageInfo, pm); } else if ((packageInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {//This application is installed in the device system's image } else { addToInstalledApps(packageInfo, pm); } } }

现在您可以获取设备的 appName 和 appIcon。 下面是方法。

 public void addToInstalledApps(ApplicationInfo packageInfo, PackageManager pm) { int stringId = packageInfo.labelRes; String appName = null; Drawable appIcon = null; try { appName = (String) pm.getApplicationLabel(packageInfo); appIcon = pm.getApplicationIcon(packageInfo); } catch (Exception e) { try { appName = stringId == 0 ? (packageInfo.nonLocalizedLabel != null ? packageInfo.nonLocalizedLabel.toString() : null) : getString(stringId); } catch (Exception ex) { ex.printStackTrace(); } //Exception e.printStackTrace(); } if(pm.getLaunchIntentForPackage(packageInfo.packageName) != null && CommonUtil.isValidString(appName)){ //Now you can design your model and insert data as you want. AppDetailsModel appDetailsModel = new AppDetailsModel(packageInfo.packageName, packageInfo.sourceDir, pm.getLaunchIntentForPackage(packageInfo.packageName), appName, appIcon); appDetailsModelList.add(appDetailsModel); } }

由于其大小为 0,您面临这个问题。尝试使用此代码。 它可能有助于增加尺寸。

 private void checkAllPackageData() { PackageManager packageManager = getActivity().getPackageManager(); Intent intent = new Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER); List<ResolveInfo> installedApps= packageManager.queryIntentActivities(intent, 0); for (ResolveInfo p : installedApps){ String appName = p.loadLabel(packageManager).toString(); String appPackageName = p.activityInfo.packageName; Drawable icon = p.loadIcon(packageManager); ApplicationInfo info = p.activityInfo.applicationInfo; try { Bitmap bitmap= ((BitmapDrawable) icon).getBitmap(); System.out.println("Before "+ bitmap.getHeight()); Bitmap bitmap1= bitmap.copy(Bitmap.Config.ARGB_8888, true); Bitmap bitmap2 = getResizedBitmap(bitmap1,35,35); System.out.println(bitmap2.getHeight()); } catch (Exception e) { e.printStackTrace(); } } } public Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight) { int width = bm.getWidth(); int height = bm.getHeight(); float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; // CREATE A MATRIX FOR THE MANIPULATION Matrix matrix = new Matrix(); // RESIZE THE BIT MAP matrix.postScale(scaleWidth, scaleHeight); // "RECREATE" THE NEW BITMAP Bitmap resizedBitmap = Bitmap.createBitmap( bm, 0, 0, width, height, matrix, false); bm.recycle(); return resizedBitmap; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM