安卓权威编程指南 挑战练习 22章 应用图标

本章使用了 ResolveInfo.loadLabel(...) 方法,在启动器应用中显示了各个activity的名
称。 ResolveInfo 类还提供了另一个名为 loadIcon() 的方法。可以使用该方法为每个应用加载
显示图标。你要接受的挑战就是,为NerdLauncher应用中显示的所有应用添加对应的图标。

首先增加一个RecyclerView的条目布局,代码如下:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3               xmlns:tools="http://schemas.android.com/tools"
 4               android:orientation="horizontal"
 5               android:layout_width="match_parent"
 6               android:layout_height="wrap_content">
 7         <TextView
 8             android:id="@+id/item_text"
 9             tools:text="asd"
10             android:textSize="20sp"
11             android:layout_gravity="center"
12             android:layout_width="0dp"
13             android:layout_height="wrap_content"
14             android:layout_weight="2"/>
15
16         <ImageView
17             android:id="@+id/item_icon"
18             android:layout_width="0dp"
19             android:layout_height="wrap_content"
20             android:layout_weight="1"/>
21 </LinearLayout>

较之前只增加了一个ImageView用来显示App的Icon。

接下来直接修改NerdLauncherFragment中的ActivityHolder类和ActivityAdapter类就可以了。代码如下:

 1 //用来显示activity标签名
 2     private class ActivityHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
 3
 4         private ResolveInfo mResloveInfo;
 5         private TextView mNameTextView;
 6         private ImageView mIconImageView;
 7
 8         public ActivityHolder(View itemView){
 9             super(itemView);
10             mNameTextView = (TextView)itemView.findViewById(R.id.item_text);
11             mIconImageView = (ImageView)itemView.findViewById(R.id.item_icon);
12             mNameTextView.setOnClickListener(this);
13             mIconImageView.setOnClickListener(this);
14         }
15
16         public void bindActivity(ResolveInfo resloveInfo){
17             mResloveInfo = resloveInfo;
18             PackageManager pm = getActivity().getPackageManager();
19             String appName =  mResloveInfo.loadLabel(pm).toString();
20             Drawable appIcon = mResloveInfo.loadIcon(pm);
21             mIconImageView.setImageDrawable(appIcon);
22             mNameTextView.setText(appName);
23         }
24
25         @Override
26         public void onClick(View v){
27             ActivityInfo activityInfo = mResloveInfo.activityInfo;
28             /*
29            *     发送了ACTION_MAIN操作。发送的intent是否包含操作,对大多数app来说没什么区别。
30             *    不过,有些应用的启动行为可能会有所不同。取决于不同的启动要求,同样的activity可能会显示不同的用户界面。开发人员最好能明确启动意图,以便让activity完成它应该完成的任务。
31              */
32             Intent i = new Intent(Intent.ACTION_MAIN)
33                     .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
34                     .setClassName(activityInfo.applicationInfo.packageName,activityInfo.name);
35
36             startActivity(i);
37         }
38     }
39
40     private class ActivityAdapter extends RecyclerView.Adapter<ActivityHolder> {
41
42         private final List<ResolveInfo> mActivities;
43
44         public ActivityAdapter(List<ResolveInfo> activities){
45             mActivities = activities;
46         }
47
48         @Override
49         public ActivityHolder onCreateViewHolder(ViewGroup parent, int viewType){
50             LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
51             View view = layoutInflater.inflate(R.layout.nerd_launcher_item,parent,false);
52             return new ActivityHolder(view);
53         }
54
55         @Override
56         public void onBindViewHolder(ActivityHolder activityHolder, int position){
57             ResolveInfo resolveInfo = mActivities.get(position);
58             activityHolder.bindActivity(resolveInfo);
59         }
60
61         @Override
62         public int getItemCount(){
63             return mActivities.size();
64         }
65     }
66 }
时间: 2024-08-26 08:14:39

安卓权威编程指南 挑战练习 22章 应用图标的相关文章

安卓权威编程指南 挑战练习 24章 预加载以及缓存

24.7 挑战练习:预加载以及缓存 应用中并非所有任务都能即时完成,对此,大多用户表示理解.不过,即使是这样,开发者们也一直在努力做到最好.为了让应用反应更快,大多数现实应用都通过以下两种方式增强自己的代码:? 增加缓存层 ? 预加载图片 缓存指存储一定数目 Bitmap 对象的地方.这样,即使不再使用这些对象,它们也依然存储在那里. 缓存的存储空间有限,因此,在缓存空间用完的情况下,需要某种策略对保存的对象做一定的取舍.许多缓存机制使用一种叫作LRU(least recently used,最

安卓权威编程指南 挑战练习 25章 深度优化 PhotoGallery 应用

你可能已经注意到了,提交搜索时, RecyclerView 要等好一会才能刷新显示搜索结果.请接受挑战,让搜索过程更流畅一些.用户一提交搜索,就隐藏软键盘,收起 SearchView 视图(回到只显示搜索按钮的初始状态).再来个挑战.用户一提交搜索,就初始化 RecyclerView ,显示一个搜索结果加载状态界面(使用状态指示器).下载到JSON数据之后,就删除状态指示器.也就是说,一旦开始下载图片, 就不应显示加载状态了 1.提交搜索,隐藏软键盘,收起SearchView: 将SearchV

安卓权威编程指南 挑战练习(第26章 在 Lollipop 设备上使用 JobService)

26.11 挑战练习:在 Lollipop 设备上使用 JobService 请创建另一个 PollService 实现版本.新的 PollService 应该继承 JobService 并使用 JobScheduler 来运行.在 PollService 启动代码中,检查系统版本是否为Lollipop:如果是,就 使用 JobScheduler 计划运行 JobService :如果不是,依然使用 AlarmManager 实现. JobService类: 1 package com.bign

安卓权威编程指南-笔记(第21章 XML drawable)

在Andorid的世界里,凡事要在屏幕上绘制的东西都可以叫drawable,比如抽象图形,Drawable的子类,位图图形等,我们之前用来封装图片的BitmapDrawable就是一种drawable. 本章我们还会看到更多的drawable:state list drawable.shape drawable和layer list drawable. 这三个drawable都定义在XML文件中,可以归为一类,统称为XML drawable. shape drawable 使用ShapeDraw

安卓权威编程指南 - 第五章学习笔记(两个Activity)

学习安卓编程权威指南第五章的时候自己写了个简单的Demo来加深理解两个Activity互相传递数据的问题,然后将自己的学习笔记贴上来,如有错误还请指正. IntentActivityDemo学习笔记 题目:ActivityA登录界面(用户名.密码.登陆按钮),ActivityB(Edit,返回按键:SubmitButton).A界面输入用户名和密码传到B中,B验证用户输入的用户名和密码,如果错误就返回A,并用Toast 显示用户名和密码错误:如果正确,就在第二个 activity中显示一个Edi

安卓权威编程指南-笔记(第26章 服务的作用)

1. IntentService IntentService也是一个context(Service是Context的子类),并能够响应intent. 一个最基本的IntentService实例如下: public class PollService extends IntentService { private static final String TAG = "PollService"; public static Intent newIntent(Context context)

安卓权威编程指南-笔记(第27章 broadcast intent)

本章需求:首先,让应用轮询新结果并在有所发现时及时通知用户,即使用户重启设备后还没有打开过应用.其次,保证用户在使用应用时不出现新结果通知. 1. 一般intent和broadcast intent 许多系统组件需要知道某些事件的发生(WIFI信号时有时无,电话的呼入等),为满足这样的需求,Andorid提供了broadcast intent 组件. broadcast intent的工作原理类似于之前学过的intent,但不同的是broadcast intent可以被多个叫做broadcast

安卓权威编程指南-笔记(第25章 搜索)

1. SearchView SearchView是个操作视图,所谓操作视图,就是可以内置在工具栏中的视图.SearchView可以让整个搜索界面完全内置在应用的工具栏中. 1.1 SearchView的配置 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ap

安卓权威编程指南-笔记 (第29章定制视图与触摸事件)

1.定制视图 Android自带众多优秀的标准视图与组件,但有时为追求独特的应用视觉效果,我们仍需创建定制视图. 定制视图分为两大类别: 简单视图: 简单视图内部也可以很复杂,之所以归为简单类别,是因为简单视图不包括子视图,而且简单视图几乎总是会执行定制绘制. 聚合视图:聚合视图由其他视图对象组成,聚合视图通常管理着子视图,但不负责执行定制绘制,图形绘制任务都委托给了各个子视图. 创建定制视图的所需的三大步骤: 选择超类.对于简单定制视图而言,View是个空白画布,因此它作为超类最常见,对于聚合