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()適切なコンテキストで 1 回だけ使用してください。コードでこれを実現するには、次の 3 つの方法があります。

  • アクティビティを変更して、GestureListener と AsyncTask を内部クラスとして含み、ivアクティビティのフィールドを参照します。
  • GestureListener と AsyncTask をスタンドアロン クラスとして保持し、MyImageView をパラメーターとしてコンストラクターに追加します。onCreate()の後に、この 2 つのクラスの 2 つのインスタンスを構築します。findViewById()
  • GestureListener と AsyncTask を MyImageView の内部クラスとして配置し、MyImageView をパラメーターとしてそれらのコンストラクターに追加します。MyImage 内から 2 つのインスタンスを構築するときは、this.

findViewById()状況依存です。これは、現在のコンテキストから始まるビューを検索することを意味します。現在のコンテキストがアクティビティの場合、対応する XML レイアウトを検索します。コンテキストがビューの場合、そのビューから下に向かって検索するだけです。あなたの場合findViewById()、IDのみをビューで検索している可能性が高く、それを見つけることができません。onDoubleTap()IMO の 1 つも機能しないはずなので、「良いチャンス」と言います。

編集:

初めてカスタム ビューを作成したときは、Android ドキュメントで提供されているチュートリアルを使用しました。また、コンテキストに関する便利で役立つセクションもあります。

于 2013-09-08T14:43:42.243 に答える