2013-09-08 2 views
0

Outline моего кода:Посмотреть возвращение нулевой

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), а его рабочий отлично в MyGestureDetector ... почему? также, когда я делаю ConnectTask внутренним классом MainActivity, тогда он отлично работает ... !!

+0

В AsyncTask вы показываете "MyBitMap" - но где вы загрузить растровое изображение в "MyBitMap"? –

+2

Я сейчас играю главную роль в вашем коде и получаю больше вопросов: почему вы создаете экземпляр 'MyImageView()' в 'onCreate()'? Почему вы называете 'findViewById' каждый раз, когда вам нужен вид? Почему не только в 'onCreate()' один раз и сохранить ссылку? Почему в любом случае вы создаете пользовательское представление? Пожалуйста, помогите нам помочь вам (с помощью ...) – jboi

+0

@jboi Поскольку MyImageView предоставляет мне всю функциональность масштабирования масштабирования отправки сообщений на сервер, который работает на Java и получает сообщения. Я просто кратко рассказал о части моего проекта, где что-то не так. – Satyajeet

ответ

0

Вы должны использовать findViewById() только один раз в нужном контексте. Три способа вы могли бы добиться этого с помощью кода:

  • Изменения активности, чтобы содержать свой GestureListener и AsynkTask как внутренние классы и ссылаются на поле iv вашей деятельности
  • Держите GestureListener и AsynkTask как отдельные классы и добавить MyImageView как параметр для своего конструктора. Постройте два экземпляра для этих двух классов в onCreate() после findViewById()
  • Поместите GestureListener и AsynkTask как внутренние классы MyImageView и добавьте MyImageView в качестве параметра в свой конструктор. При построении двух экземпляров из MyImage просто перейдите this.

findViewById() является контекстно-зависимым. Это означает, что он ищет представление, начинающееся с текущего контекста. Если текущий контекст - это Activity, он выполняет поиск по соответствующему XML-макету. Если контекст представляет собой представление, он просто ищет этот вид вниз. В вашем случае есть хорошая вероятность, что findViewById() выполняет поиск вниз по виду только для id - и не может найти его. Я говорю «хороший шанс», потому что ИМО один в onDoubleTap() тоже не должен работать.

EDIT:

Когда я создал свой первый пользовательский вид, я использовал учебник, предоставленную Android documentation. Он также имеет приятный и полезный раздел о контексте.

+0

Я решил проблему, взяв одну ссылку MyImageView in и установив ее из MainActivity setIv (MyImageView tiv) {iv = tiv} ... Но все еще путался, почему iv работал отлично в MyGestureDetector, а не в ConnectTask (даже не в конструкторе как ConnectTask, так и MyImageView). – Satyajeet

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]); 
     }*/ 
    } 

} 
+0

спасибо за ответ, но я получаю изображение с сервера, поэтому не могу получить ID. – Satyajeet

+0

Нет проблем, чтобы сменить идентификатор изображения в строку и загрузить растровое изображение из url;), но нормально не проблема –