我的代码概要是:
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的内部类时,它的工作正常...... !!
答案 0 :(得分:0)
您应该在正确的上下文中使用findViewById()
一次。使用代码可以实现这三种方法:
iv
onCreate()
findViewById()
中为这两个类构建两个实例
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]);
}*/
}
}