查看返回null

时间:2013-09-08 13:31:11

标签: android view android-asynctask

我的代码概要是:

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的内部类时,它的工作正常...... !!

2 个答案:

答案 0 :(得分:0)

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

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

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

编辑:

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

答案 1 :(得分: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]);
       }*/
   }

}
相关问题