安卓權威編程指南 挑戰練習 22章 應用圖標
阿新 • • 發佈:2017-07-18
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" 18android: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章 應用圖標