2013-12-14 1 views
0

У меня есть listView из установленных пользователями приложений. В каждом элементе списка он имеет имя приложения, имя пакета, значок и флажок в конце. Когда флажок установлен, я хочу, чтобы он взял значок приложения из этого элемента listView (т. Е., Если проверено приложение для «Новости», оно примет значок приложения «Новости»), а затем превратит его в растровое изображение.onClick метод checkbox превращает значок в растровое изображение

Пожалуйста, обратите внимание, что я загружая необходимую информацию, как это:

/ load controls from layout resources 
    ImageView ivAppIcon = (ImageView) v.findViewById(R.id.ivIcon); 
    TextView tvAppName = (TextView) v.findViewById(R.id.tvName); 
    TextView tvPkgName = (TextView) v.findViewById(R.id.tvPack); 
    final CheckBox addCheckbox = (CheckBox) v 
      .findViewById(R.id.addCheckbox); 
    Log.d("AppInfoAdapter", "Controls from layout Resources Loaded"); 

    // set data to display 
    ivAppIcon.setImageDrawable(entry.loadIcon(mPackManager)); 
    tvAppName.setText(entry.activityInfo.loadLabel(mPackManager)); 
    tvPkgName.setText(entry.activityInfo.packageName); 

    Log.d("AppInfoAdapter", "Data Set To Display"); 

Я уже пытался это один из способов, но я подозревал, что он не работает так, как я думаю, что это, так что я хочу второе мнение. Вот то, что я сейчас делаю:

addCheckbox 
      .setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        if (addCheckbox.isChecked()) { 
         System.out.println("Checked"); 
         PackageManager pm = mContext.getPackageManager(); 
         Drawable icon = null; 
         try { 
          icon = pm 
          .getApplicationIcon(entry.activityInfo.packageName); 
         } catch (NameNotFoundException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
         Drawable default_icon = pm.getDefaultActivityIcon(); 
         if (icon instanceof BitmapDrawable 
           && default_icon instanceof BitmapDrawable) { 
          BitmapDrawable icon_bd = (BitmapDrawable) icon; 
          Bitmap icon_b = icon_bd.getBitmap(); 
          BitmapDrawable default_bd = (BitmapDrawable) pm 
            .getDefaultActivityIcon(); 
          Bitmap default_b = default_bd.getBitmap(); 
          if (icon_b == default_b) { 
           // It's the default icon 
           scaleDownBitmap(default_b, 100, v.getContext()); 
           Log.d("AppInfoAdapter", "Scale Bitmap Chosen"); 

Но после того, как думать об этом, я могу сделать так ?:

if (addCheckbox.isChecked()) { 
         System.out.println("Checked"); 
         ImageView imgV = (ImageView) findViewById(R.id.ivIcon); 
         imgV.buildDrawingCache(); 
         Bitmap default_b = imgV.getDrawingCache(); 
           // It's the default icon 
           scaleDownBitmap(default_b, 100, v.getContext()); 
           Log.d("AppInfoAdapter", "Scale Bitmap Chosen"); 

или даже что-то вроде этого:

if (addCheckbox.isChecked()) { 
         System.out.println("Checked"); 
         Bitmap default_b = ((BitmapDrawable)ivAppIcon.getDrawable()).getBitmap(); 
           // It's the default icon 
           scaleDownBitmap(default_b, 100, v.getContext()); 
           Log.d("AppInfoAdapter", "Scale Bitmap Chosen"); 

I нужно второе мнение о путях этого. Пожалуйста помоги!

ответ

0

Я считаю, что у вас возникли проблемы с преобразованием Drawable в bitmap? Я не могу (пока) опубликовать комментарий и спросить вас об этом. Поэтому я буду рисковать полным ответом:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    final int DEST_IMAGE_WIDH = 100; 
    final int DEST_IMAGE_HEIGHT = 100; 
    PackageManager   pm = getPackageManager(); 
    ApplicationInfo  appInfo = getApplicationInfo(); 
    Drawable   appIcon = pm.getApplicationIcon(appInfo); 
    Bitmap    appBmp = Bitmap.createBitmap(
       DEST_IMAGE_WIDH 
      , DEST_IMAGE_HEIGHT 
      , Config.ARGB_8888 
      ); 
    // Creates a new canvas based on the image specifications 
    // create just above. 
    Canvas canvas    = new Canvas(appBmp); 
    // (optional) Fills the entire canvas 
    canvas.drawColor(Color.WHITE); 
    // You need to set bounds otherwise a 0,0 sized image would be draw. 
    appIcon.setBounds(0, 0, DEST_IMAGE_WIDH, DEST_IMAGE_HEIGHT); 
    appIcon.draw(canvas); 

    /// Let's save to a .jpg file ... 
    File file = new File(getFilesDir().getAbsolutePath() + "/test2.jpg"); 
    FileOutputStream out; 
    try 
    { 
     file.createNewFile(); 
     out = new FileOutputStream(file); 
     appBmp.compress(Bitmap.CompressFormat.JPEG, 80, out); 
     out.close(); 

     // Load back the image file to confirms it works 
     Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath()); 
     ImageView imageView1 = (ImageView)findViewById(R.id.imageView1); 
     imageView1.setImageBitmap(bitmap);    
    } 
    catch (FileNotFoundException e1) 
    { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    catch (IOException e2) 
    { 
     // TODO Auto-generated catch block 
     e2.printStackTrace();   
    } 
} 
+0

Да, это была проблема, с которой я столкнулся (ну ... ее часть). Тем не менее, я действительно подтверждаю полный ответ, потому что это помогло мне преодолеть то, что я полностью пытаюсь сделать (единственное отличие состоит в том, что я получаю растровое изображение из потока в другом классе). Я не смогу проверить это до завтра, поэтому я буду держать вас в курсе. Еще раз спасибо! :) – user2909006