2013-12-23 74 views
0

我有一个gridView的baseadapter,它在没有时创建一个视图。这里是getView部分:如何从另一个类获取imageView

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // Try to reuse the views 
    ImageView view = (ImageView) convertView; 
    boolean checked = (mCheckBox==null)?false:(((CheckBox) mCheckBox).isChecked()); 
    // if convert view is null then create a new instance else reuse it 
    if (view == null) { 
     view = new ImageView(Context); 
     Log.d("GridViewAdapter", "new imageView added"); 
     view.setId(R.id.iconImageView_id); 
    } 
    if(checked == true){ 
     isSdReadable(); 
     Log.i("GridViewAdapter", "checkbox is checked"); 
    } else { 
     Log.i("GridView", "Icons not for use/checkbox not checked"); 
    } 
    view.setImageResource(drawables.get(position)); 
    view.setScaleType(ImageView.ScaleType.CENTER_CROP); 
    view.setLayoutParams(new android.widget.GridView.LayoutParams(70, 70)); 
    view.setTag(String.valueOf(position)); 
    return view; 
} 

,你可以看到,我给视图的新ID iconImageView_id基于在我的价值观节这个XML布局文件:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<item type="id" name="iconImageView_id"/> 
</resources> 

我试图使用imageView在另一个类,以便我可以像这样分配一个位图:

// Load back the image file to confirms it works 
          Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath()); 
          ImageView imageView1 = (ImageView)v.findViewById(R.id.iconImageView_id); 
          imageView1.setImageBitmap(bitmap); 
          Log.i("AppInfoAdapter", "The icon image has been set into the gridView"); 
         } 

但其他类也是baseadapter。

这里就是我试图使用的ImageView类的全断面:

 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(); 
         final int DEST_IMAGE_WIDTH = 100; 
         final int DEST_IMAGE_HEIGHT = 100; 
         ApplicationInfo appInfo = mContext.getApplicationInfo(); 
         Drawable appIcon = pm.getApplicationIcon(appInfo); 
         Bitmap appBmp = Bitmap.createBitmap(DEST_IMAGE_WIDTH, DEST_IMAGE_HEIGHT, Config.ARGB_8888); 

         // Creates a new canvas based on the image specification 
         // created 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 drawn. 
         appIcon.setBounds(0, 0, DEST_IMAGE_WIDTH, DEST_IMAGE_HEIGHT); 
         appIcon.draw(canvas); 

         /// Let's save to a .jpg file ... 
         File file = new File(mContext.getFilesDir().getAbsolutePath() + "/test2.jpg"); 
         FileOutputStream out; 
         try 
         { 
          file.createNewFile(); 
          out = new FileOutputStream(file); 
          appBmp.compress(Bitmap.CompressFormat.JPEG, 80, out); 
          Log.i("AppInfoAdapter", "The icon for use in gridView is saved"); 
          out.close(); 

          // Load back the image file to confirms it works 
          Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath()); 
          ImageView imageView1 = (ImageView)v.findViewById(R.id.iconImageView_id); 
          imageView1.setImageBitmap(bitmap); 
          Log.i("AppInfoAdapter", "The icon image has been set into the gridView"); 
         } 

         catch (FileNotFoundException e1) 
         { 
          e1.printStackTrace(); 
         } 
         catch (IOException e2) 
         { 
          e2.printStackTrace(); 
         } 


        } else { 
         System.out.println("Un-Checked"); 
        } 

       } 
      }); 

    // return view 
    return v; 
} 

所以我得到了NPE,因为我显然不能只是静态地引用视图。

那么我怎样才能让它在我的其他课程中使用该imageView?

这里是堆栈跟踪错误:

FATAL EXCEPTION: main 
12-22 15:58:45.782: E/AndroidRuntime(28793): java.lang.NullPointerException 
12-22 15:58:45.782: E/AndroidRuntime(28793): at com.example.awesomefilebuilderwidget.AppInfoAdapter$1.onClick(AppInfoAdapter.java:200) 
12-22 15:58:45.782: E/AndroidRuntime(28793): at android.view.View.performClick(View.java:2532) 
12-22 15:58:45.782: E/AndroidRuntime(28793): at android.widget.CompoundButton.performClick(CompoundButton.java:99) 
12-22 15:58:45.782: E/AndroidRuntime(28793): at android.view.View$PerformClick.run(View.java:9308) 
12-22 15:58:45.782: E/AndroidRuntime(28793): at android.os.Handler.handleCallback(Handler.java:587) 
12-22 15:58:45.782: E/AndroidRuntime(28793): at android.os.Handler.dispatchMessage (Handler.java:92) 
12-22 15:58:45.782: E/AndroidRuntime(28793): at android.os.Looper.loop(Looper.java:150) 
12-22 15:58:45.782: E/AndroidRuntime(28793): at android.app.ActivityThread.main(ActivityThread.java:4333) 
12-22 15:58:45.782: E/AndroidRuntime(28793): at java.lang.reflect.Method.invokeNative(Native Method) 
12-22 15:58:45.782: E/AndroidRuntime(28793): at java.lang.reflect.Method.invoke(Method.java:507) 
12-22 15:58:45.782: E/AndroidRuntime(28793): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
12-22 15:58:45.782: E/AndroidRuntime(28793): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
12-22 15:58:45.782: E/AndroidRuntime(28793): at dalvik.system.NativeStart.main(Native Method) 

与线200之中:

imageView1.setImageBitmap(bitmap); 

新增:

下面是我处理了两个完整类:

AppInfoAdapter.java:

package com.example.awesomefilebuilderwidget; 

IMPORTS 

public class AppInfoAdapter extends BaseAdapter implements Filterable { 
private Context mContext; 
private List<ResolveInfo> mListAppInfo; 
private PackageManager mPackManager; 
private List<ResolveInfo> originalListAppInfo; 
private Filter filter; 
private String fname; 

public AppInfoAdapter(Context c, List<ResolveInfo> listApp, 
     PackageManager pm) { 
    mContext = c; 
    this.originalListAppInfo = this.mListAppInfo = listApp; 
    mPackManager = pm; 
    Log.d("AppInfoAdapter", "top"); 
} 

@Override 
public int getCount() { 
    Log.d("AppInfoAdapter", "getCount()"); 
    return mListAppInfo.size(); 
} 

@Override 
public Object getItem(int position) { 
    Log.d("AppInfoAdapter", "getItem"); 
    return mListAppInfo.get(position); 
} 

@Override 
public long getItemId(int position) { 
    Log.d("AppInfoAdapter", "getItemId"); 
    return position; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    // get the selected entry 
    final ResolveInfo entry = (ResolveInfo) mListAppInfo.get(position); 

    // reference to convertView 
    View v = convertView; 

    // inflate new layout if null 
    if (v == null) { 
     LayoutInflater inflater = LayoutInflater.from(mContext); 
     v = inflater.inflate(R.layout.layout_appinfo, null); 
     Log.d("AppInfoAdapter", "New layout inflated"); 
    } 

    // 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(); 
         final int DEST_IMAGE_WIDTH = 100; 
         final int DEST_IMAGE_HEIGHT = 100; 
         ApplicationInfo appInfo = mContext.getApplicationInfo(); 
         Drawable appIcon = pm.getApplicationIcon(appInfo); 
         Bitmap appBmp = Bitmap.createBitmap(DEST_IMAGE_WIDTH, DEST_IMAGE_HEIGHT, Config.ARGB_8888); 

         // Creates a new canvas based on the image specification 
         // created 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 drawn. 
         appIcon.setBounds(0, 0, DEST_IMAGE_WIDTH, DEST_IMAGE_HEIGHT); 
         appIcon.draw(canvas); 

         /// Let's save to a .jpg file ... 
         File file = new File(mContext.getFilesDir().getAbsolutePath() + "/test2.jpg"); 
         FileOutputStream out; 
         try 
         { 
          file.createNewFile(); 
          out = new FileOutputStream(file); 
          appBmp.compress(Bitmap.CompressFormat.JPEG, 80, out); 
          Log.i("AppInfoAdapter", "The icon for use in gridView is saved"); 
          out.close(); 

          // Load back the image file to confirms it works 
          Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath()); 
          ImageView imageView1 = (ImageView)v.findViewById(R.id.iconImageView_id); 
          imageView1.setImageBitmap(bitmap); 
          Log.i("AppInfoAdapter", "The icon image has been set into the gridView"); 
         } 

         catch (FileNotFoundException e1) 
         { 
          e1.printStackTrace(); 
         } 
         catch (IOException e2) 
         { 
          e2.printStackTrace(); 
         } 


        } else { 
         System.out.println("Un-Checked"); 
        } 

       } 
      }); 

    // return view 
    return v; 
} 

和GridViewAdapter.java:

package com.example.awesomefilebuilderwidget; 

IMPORTS 

public class GridViewAdapter extends BaseAdapter { 
private Context Context; 

// Keep all Images in array list 
public ArrayList<Integer> drawables = new ArrayList<Integer>(); 

CheckBox mCheckBox=null; 

// Constructor 
public GridViewAdapter(Context c){ 
    Context = c; 
    Log.d("GridViewAdapter", "Constructor is set"); 

    drawables.add(R.drawable.pattern1); 
    Log.d("GridViewAdapter", "pattern1 added"); 

    drawables.add(R.drawable.pattern2); 
    Log.d("GridViewAdapter", "pattern2 added"); 

    drawables.add(R.drawable.trashcan); 
    Log.d("GridViewAdapter", "trashcan added"); 

    drawables.add(R.drawable.ic_launcher); 
    Log.d("GridViewAdapter", "ic_launcher added"); 
} 

public void setCheckBox(CheckBox checkbox){ 
    mCheckBox=checkbox; 
} 

@Override 
// How many items are in the data set represented by this Adapter 
public int getCount() { 
    return drawables.size(); 
} 

@Override 
// Get the data item associated with the specified position in the 
// data set 
public Object getItem(int position) { 
    return drawables.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

public boolean isSdReadable() { 

    boolean mExternalStorageAvailable = false; 
    String state = Environment.getExternalStorageState(); 

    if (Environment.MEDIA_MOUNTED.equals(state)) { 
    // We can read and write the media 
    mExternalStorageAvailable = true; 
    Log.i("isSdReadable", "External storage card is readable."); 
    } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { 
    // We can only read the media 
    Log.i("isSdReadable", "External storage card is readable."); 
    mExternalStorageAvailable = true; 
    } else { 
    // Something else is wrong. It may be one of many other 
    // states, but all we need to know is we can neither read nor write 
    mExternalStorageAvailable = false; 
    } 

    return mExternalStorageAvailable; 
    } 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // Try to reuse the views 
    ImageView view = (ImageView) convertView; 
    boolean checked = (mCheckBox==null)?false:(((CheckBox) mCheckBox).isChecked()); 
    // if convert view is null then create a new instance else reuse it 
    if (view == null) { 
     view = new ImageView(Context); 
     Log.d("GridViewAdapter", "new imageView added"); 
     view.setId(R.id.iconImageView_id); 
    } 
    if(checked == true){ 
     isSdReadable(); 
     Log.i("GridViewAdapter", "checkbox is checked"); 
    } else { 
     Log.i("GridView", "Icons not for use/checkbox not checked"); 
    } 
    view.setImageResource(drawables.get(position)); 
    view.setScaleType(ImageView.ScaleType.CENTER_CROP); 
    view.setLayoutParams(new android.widget.GridView.LayoutParams(70, 70)); 
    view.setTag(String.valueOf(position)); 
    return view; 
} 

} 
+0

请发布完整的堆栈跟踪。 –

+0

同时发布包含此图像视图布局的LayoutFile ...我不认为该资源文件是vlid布局定义。 –

+0

我发布了堆栈跟踪。此imageView在xml中没有布局文件,它在GridView适配器的getView部分中创建(如果没有视图) – user2909006

回答

1

你怎么想两个adapaters在一起吗?只是嘲笑你可能会得到那个NPE,因为这两个适配器指向的视图不一样。 (I.E他们各自产生自己的观点,并且传递的观点在适配器之间不相关)。

如果你真的想这样做,你的方式,那么你可能会发现通过执行以下操作的成功:

定义根布局,的ROOT.xml。

在您的MainActivity构造,infalte这种观点就像这样:

ViewGroup viewRoot = LayoutInfalter.from(this).inflate(R.layout.xml); 
setContentView(viewRoot); 

保持整个应用程序中引用的viewRoot,并添加任何看法应该使用这个父视图(或该父视图中查看)到主持他们的观点。

当你召唤:

ImageView imageView1 = (ImageView)v.findViewById(R.id.iconImageView_id); 

,而不是使用视图(我怀疑是从任一角度heiarchy的pralell部分不包含您的视图(因此NPE来传递作为你的排序是正确的(IE认为存在于这个被称为点),你现在应该有机会只要

viewRoot.findViewById(R.id.iconImageView_id); 

:))使用。

+0

好的,谢谢你的解释,现在我明白为什么要得到NPE。有一个问题,当你说“定义根布局,root.xml”。在这个xml文件中是否必须有任何特定的内容,或者我可以将它留空? – user2909006

+0

还有,我会夸大整个应用程序中的所有类的root.xml文件,还是只是特别夸大类root.java? (如果你可以解释你在这里的意思,我会劝解它的,谢谢!) – user2909006

+0

问题1:只需将线性布局放在那里,它基本上只是容纳所有其他视图。 问题2:一次膨胀此布局,并将任何视图添加到此视图中。这给你一个顶级的元素来搜索。 –

相关问题