1. 程式人生 > >安卓權威編程指南 挑戰練習 22章 應用圖標

安卓權威編程指南 挑戰練習 22章 應用圖標

main nag tex col 應用圖標 final version enter 最好

本章使用了 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 }

安卓權威編程指南 挑戰練習 22章 應用圖標