0

我的代码大纲是:

public class MainActivity extends Activity {
Client client;
MyImageView iv;
Bitmap b;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    MyImageView iv = new MyImageView(this);
    Bitmap bMap = BitmapFactory.decodeResource(getResources(), R.drawable.untitled);
    iv=(MyImageView)findViewById(R.id.ImageView1);}
    iv.setImageBitmap(bMap);
}

XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/parent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<com.example.zooming.MyImageView
    android:id="@+id/ImageView1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:adjustViewBounds="true"
    android:clickable="true"
    android:scaleType="matrix" />
</LinearLayout>

MyImgaeView.java

MyImageView extends View {
    public MyImageView(Context ct){
       super(ct);
       //some other works
       gestureDetector = new GestureDetector(new MyGestureDetector());
       new ConnectTask().execute("");
       }
     //Other code
     class MyGestureDetector extends SimpleOnGestureListener {
         @Override
         public boolean onDoubleTap(MotionEvent event) {  
                iv=(MyImageView)findViewById(R.id.ImageView1);
                Bitmap bMap = BitmapFactory.decodeResource(getResources(), R.drawable.sample);
                iv.setImageBitmap(bMap);
                    return true;
         }

   }
   class connectTask extends AsyncTask<String,Bitmap,Bitmap> 
   {
       @Override
       protected Bitmap doInBackground(String... message) {
               //some code to get the bitmap
               publishProgress(mybitmap);
       return null;
       }

       @Override
       public void onProgressUpdate(Bitmap... values) {
       super.onProgressUpdate(values);
       iv=(MyImageView)findViewById(R.id.ImageView1);
       if(iv==null)
           Log.i("Exception",ex.toString());
       iv.setImageBitmap(values[0]);
       }
   }

}

iv 在 ConnectTask(AsynTask) 中总是返回 null 而它在 MyGestureDetector 中工作正常......为什么?同样,当我将 ConnectTask 设置为 MainActivity 的内部类时,它的工作正常......!!

4

2 回答 2

0

请尝试这样的事情:

MyImageView extends View {

    public MyImageView(Context ct){
       super(ct);

       //some other works
       gestureDetector = new GestureDetector(new MyGestureDetector());

       //no it have to be in other place
       //new ConnectTask().execute("");
       }

//function which set image after task, of course you can in parameter set bitmap, string 
//or whatever you want

public void setImageInThread(int id_image){
   new ConnectTask().execute(id_image);
}


   class connectTask extends AsyncTask<Integer,Void,Bitmap> 
   {
       @Override
       protected Bitmap doInBackground(Ingeter... message) {
               //some code to get the bitmap
             //  publishProgress(mybitmap);  do you really need this?
       //here you can load/decode image
       Bitmap bitmapa = BitmapFactory.decodeResource(getResources(), message[0]);
       return bitmapa;
       }

        @Override
        protected void onPostExecute(Bitmap toShow) {
            if(toShow == null)
              return; //is error

            MyImageView.this.setImageBitmap(toShow);
        }


       /*@Override
       public void onProgressUpdate(Bitmap... values) {
       super.onProgressUpdate(values);
       iv=(MyImageView)findViewById(R.id.ImageView1);
       if(iv==null)
           Log.i("Exception",ex.toString());
       iv.setImageBitmap(values[0]);
       }*/
   }

}
于 2013-09-08T15:00:50.493 回答
0

您应该findViewById()在正确的上下文中只使用一次。您可以使用代码实现此目的的三种方法:

  • 更改 Activity 以包含您的 GestureListener 和 AsynkTask 作为内部类并引用iv您的 Activity字段
  • 将 GestureListener 和 AsynkTask 保留为独立类,并将 MyImageView 作为参数添加到它们的构造函数中。onCreate()在之后为这两个类构造两个实例findViewById()
  • 将 GestureListener 和 AsynkTask 作为 MyImageView 的内部类,并将 MyImageView 作为参数添加到它们的构造函数中。在 MyImage 中构造两个实例时,只需传递this.

findViewById()是上下文相关的。这意味着它从当前上下文开始搜索视图。如果当前上下文是一个 Activity,它会通过相应的 XML 布局进行搜索。如果上下文是一个视图,它只是从该视图向下搜索。在您的情况下,很有可能findViewById()只在视图中搜索 id - 并且找不到它。我说“一个好机会”,因为 IMO 中的一个onDoubleTap()也不应该起作用。

编辑:

当我创建我的第一个自定义视图时,我使用了Android 文档提供的教程。它还有一个关于上下文的很好且有用的部分。

于 2013-09-08T14:43:42.243 回答