2013-12-03 3 views
1

В моем приложении для Android есть по крайней мере 4 места, где пользователь может щелкнуть фотографию, а затем получить диалог «сделайте снимок или выберите из галереи, чтобы изменить изображение» в каждом из этих мест его различная активность с разными переменными и разными именами элементов xml, и у меня есть очень похожий код, повторяющийся через мое приложение.Очень жесткая объектно-ориентированная «трансплантация» в андроиде

Я хочу взять его в отдельный класс, но настолько запутан в коде, что он чувствует себя как трансплантация сердца. Мои объектно-ориентированные навыки и навыки Java не так велики (3 месяца опыта), и, возможно, в Android существует некоторое обходное решение, о котором я не знаю.

Я приведу два примера из разных классов, чтобы вы получили представление о том, сколько повторений существует. Я буду очень признателен, если кто-то может помочь мне создать отдельный объект из этого

класса

Настройки, изображения чейнджера выдержки:

iUserAvatarSettings.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       final Dialog dialog = new Dialog(Settings.this, R.style.no_title_dialog); 
       if (!userHasProvidedOwnPhoto) { 
        dialog.setContentView(R.layout.signup_avatar_upload_dialog); 
       } else { 
        dialog.setContentView(R.layout.signup_avatar_upload_dialog_2); 
        bDeleteAvatar = (Button) dialog.findViewById(R.id.bDeleteAvatar); 
        try { 
         bDeleteAvatar.setTypeface(font1); 
        } catch (Exception e) { 
        } 
        bDeleteAvatar.setOnClickListener(new OnClickListener() { 

         @Override 
         public void onClick(View v) { 
          setAvatarPath("default_avatar"); 
          userHasProvidedOwnPhoto = false; 
          if (userSex.equals("Male") || userSex.equals("")) { 
           iUserAvatarSettings.setImageResource(R.drawable.avatar_default_male); 

          } else { 
           iUserAvatarSettings.setImageResource(R.drawable.avatar_default_female); 
          } 
          dialog.dismiss(); 
         } 
        }); 
       } 
       Button bTakeAPhoto = (Button) dialog.findViewById(R.id.bTakeAPhoto); 
       Button bSelectPhotoFromFile = (Button) dialog.findViewById(R.id.bSelectPhotoFromFile); 
       Button bCancelAvatarUpload = (Button) dialog.findViewById(R.id.bCancelAvatarUpload); 
       try { 
        bTakeAPhoto.setTypeface(font1); 
        bSelectPhotoFromFile.setTypeface(font1); 
        bCancelAvatarUpload.setTypeface(font1); 
       } catch (Exception e) { 
       } 

       bTakeAPhoto.setOnClickListener(new OnClickListener() { 
        @Override 
        public void onClick(View v) { 

         if (isIntentAvailable(Settings.this, MediaStore.ACTION_IMAGE_CAPTURE)) { 
          Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
          startActivityForResult(takePictureIntent, TAKE_IMAGE_WITH_CAMERA); 

          dialog.dismiss(); 

         } else { 
          toastMaker.toast(net.asdqwe.activities.Settings.this, Configurationz.ErrorMessages.DEVICE_UNABLE_TO_TAKE_PHOTOS, Toast.LENGTH_LONG); 
          dialog.dismiss(); 
          userHasProvidedOwnPhoto = false; 
         } 
        } 
       }); 

       bSelectPhotoFromFile.setOnClickListener(new OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         Intent getImageFromGallery = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
         getImageFromGallery.setType("image/*"); 
         startActivityForResult(getImageFromGallery, PICK_IMAGE); 
         //avatarPath = saveUserAvatar.getUserAvatar().toString(); 
         //setAvatarPath(saveUserAvatar.getUserAvatar().toString()); // this remains under question 
         dialog.dismiss(); 
        } 
       }); 

       bCancelAvatarUpload.setOnClickListener(new OnClickListener() { 
        @Override 
        public void onClick(View v) { 

         dialog.dismiss(); 
        } 
       }); 
       dialog.show(); 
      } 
     }); // end of image button on click handling 

    public static boolean isIntentAvailable(Context context, String action) { 
     final PackageManager packageManager = context.getPackageManager(); 
     final Intent intent = new Intent(action); 
     List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); 
     return list.size() > 0; 
    } 

    private void handleSmallCameraPhoto(Intent intent) { 

     try { 
      Bundle extras = intent.getExtras(); 
      mImageBitmap = (Bitmap) extras.get("data"); 
      iUserAvatarSettings.setImageBitmap(mImageBitmap); 
      saveUserAvatar.SaveImage(this, mImageBitmap); 
      userHasProvidedOwnPhoto = true; 
      setAvatarPath(saveUserAvatar.getUserAvatar().toString()); 
     } catch (Exception e) { 
      toastMaker.toast(net.asdqwe.activities.Settings.this, Configurationz.ErrorMessages.TAKING_PHOTO_FAILED, Toast.LENGTH_LONG); 
      userHasProvidedOwnPhoto = false; 
     } 

    } 

    private void handleGalleryPhoto(Intent intent) { 
     try { 
      Uri _uri = intent.getData(); 
      Cursor cursor = getContentResolver().query(_uri, new String[] { android.provider.MediaStore.Images.ImageColumns.DATA }, null, null, null); 
      cursor.moveToFirst(); 
      final String imageFilePath = cursor.getString(0); 
      cursor.close(); 
      mImageBitmap2 = BitmapFactory.decodeFile(imageFilePath); 
      iUserAvatarSettings.setImageBitmap(mImageBitmap2); 
      saveUserAvatar.SaveImage(this, mImageBitmap2); 
      userHasProvidedOwnPhoto = true; 
      setAvatarPath(saveUserAvatar.getUserAvatar().toString()); 
     } catch (Exception e) { 
      toastMaker.toast(net.zxcasd.activities.Settings.this, Configurationz.ErrorMessages.PICKING_PHOTO_FROM_GALLERY_FAILED, Toast.LENGTH_LONG); 
      userHasProvidedOwnPhoto = false; 
     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (requestCode == TAKE_IMAGE_WITH_CAMERA && resultCode == RESULT_OK && null != data) { 
      handleSmallCameraPhoto(data); 

     } else if (requestCode == PICK_IMAGE && resultCode == RESULT_OK && null != data) { 
      handleGalleryPhoto(data); 
     } 
    } 

Signup класс, изображение выдержка:

iUserAvatar.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      final Dialog dialog = new Dialog(Signup.this, R.style.no_title_dialog); 
      if (!userHasProvidedOwnPhoto) { 
       dialog.setContentView(R.layout.signup_avatar_upload_dialog); 
      } else { 
       dialog.setContentView(R.layout.signup_avatar_upload_dialog_2); 
       bDeleteAvatar = (Button) dialog.findViewById(R.id.bDeleteAvatar); 
       try { 
        bDeleteAvatar.setTypeface(font1); 
       } catch (Exception e) { 
       } 
       bDeleteAvatar.setOnClickListener(new OnClickListener() { 

        @Override 
        public void onClick(View v) { 
         userHasProvidedOwnPhoto = false; 
         if (userSex.equals("Male") || userSex.equals("")) { 
          iUserAvatar.setImageResource(R.drawable.avatar_default_male); 
         } else { 
          iUserAvatar.setImageResource(R.drawable.avatar_default_female); 
         } 
         dialog.dismiss(); 
        } 
       }); 
      } 
      Button bTakeAPhotoSignupPage = (Button) dialog.findViewById(R.id.bTakeAPhoto); 
      Button bSelectPhotoFromFileSignupPage = (Button) dialog.findViewById(R.id.bSelectPhotoFromFile); 
      Button bCancelAvatarUpload = (Button) dialog.findViewById(R.id.bCancelAvatarUpload); 
      try { 
       bTakeAPhotoSignupPage.setTypeface(font1); 
       bSelectPhotoFromFileSignupPage.setTypeface(font1); 
       bCancelAvatarUpload.setTypeface(font1); 
      } catch (Exception e) { 
      } 
      bTakeAPhotoSignupPage.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 

        if (isIntentAvailable(Signup.this, MediaStore.ACTION_IMAGE_CAPTURE)) { 
         Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
         startActivityForResult(takePictureIntent, TAKE_IMAGE_WITH_CAMERA); 
         dialog.dismiss(); 

        } else { 
         toastMaker.toast(net.asdqwe.activities.Signup.this, Configurationz.ErrorMessages.DEVICE_UNABLE_TO_TAKE_PHOTOS, Toast.LENGTH_LONG); 
         dialog.dismiss(); 
         userHasProvidedOwnPhoto = false; 
        } 
       } 
      }); 

      bSelectPhotoFromFileSignupPage.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Intent getImageFromGallery = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
        getImageFromGallery.setType("image/*"); 
        startActivityForResult(getImageFromGallery, PICK_IMAGE); 
        dialog.dismiss(); 
       } 
      }); 

      bCancelAvatarUpload.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        // and deal with photo 
        dialog.dismiss(); 
       } 
      }); 
      dialog.show(); 
     } 
    }); 

public static boolean isIntentAvailable(Context context, String action) { 
    final PackageManager packageManager = context.getPackageManager(); 
    final Intent intent = new Intent(action); 
    List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); 
    return list.size() > 0; 
} 
private void handleSmallCameraPhoto(Intent intent) { 

    try { 
     Bundle extras = intent.getExtras(); 
     mImageBitmap = (Bitmap) extras.get("data"); 
     iUserAvatar.setImageBitmap(mImageBitmap); 
     saveUserAvatar.SaveImage(this, mImageBitmap); 
     userHasProvidedOwnPhoto = true; 
    } catch (Exception e) { 
     toastMaker.toast(net.asdqwe.activities.Signup.this, Configurationz.ErrorMessages.TAKING_PHOTO_FAILED, Toast.LENGTH_LONG); 
     userHasProvidedOwnPhoto = false; 
    } 

} 

private void handleGalleryPhoto(Intent intent) { 
    try { 
     Uri _uri = intent.getData(); 
     Cursor cursor = getContentResolver().query(_uri, new String[] { android.provider.MediaStore.Images.ImageColumns.DATA }, null, null, null); 
     cursor.moveToFirst(); 
     final String imageFilePath = cursor.getString(0); 
     cursor.close(); 
     mImageBitmap2 = BitmapFactory.decodeFile(imageFilePath); 
     iUserAvatar.setImageBitmap(mImageBitmap2); 
     saveUserAvatar.SaveImage(this, mImageBitmap2); 
     userHasProvidedOwnPhoto = true; 
    } catch (Exception e) { 
     toastMaker.toast(net.asdqwe.activities.Signup.this, Configurationz.ErrorMessages.PICKING_PHOTO_FROM_GALLERY_FAILED, Toast.LENGTH_LONG); 
     userHasProvidedOwnPhoto = false; 
    } 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == TAKE_IMAGE_WITH_CAMERA && resultCode == RESULT_OK && null != data) { 
     handleSmallCameraPhoto(data); 

    } else if (requestCode == PICK_IMAGE && resultCode == RESULT_OK && null != data) { 
     handleGalleryPhoto(data); 
    } 
} 
+0

Что вы пробовали в своем [рефакторинге] (http://www.methodsandtools.com/archive/archive.php?id=4) усилиях до сих пор? Вы используете IDE? Предоставляет ли он инструменты для рефакторинга? –

+0

Ну, у меня есть две идеи на данный момент - выньте эти три метода в конце каждого отрывка в отдельный класс, а также используйте один и тот же диалог xml для обоих случаев. Im, использующий Eclipse IDE, и я havent использовал его инструменты рефакторинга (если они есть) –

+1

Каждый раз, когда вы создаете 'новый OnClickListener()', они могут быть отдельным классом, который расширяет класс OnClickListener. Затем вы можете вызвать 'новый extendedListener()' и не должны отталкивать метод с переопределением. – DoubleDouble

ответ

2
  1. Переместите isIntentAvailable(Context, String) в класс утилиты. Это может быть полезно в некоторых случаях использования.
  2. Создать абстрактный класс (обозначаться как MyAbstractActivity), который содержит все общие методы активность: handleSmallCameraPhoto(Intent), handleGalleryPhoto(Intent) и onActivityResult(int, int, Intent)
    • iUserAvatarSettings/iUserAvatar должны быть частью MyAbstractActivity. Если вам нужны разные реализации для разных вариантов использования, создайте абстрактный геттер, т. Е. getUserAvatarButton().
    • setAvatarPath(String) используется только в одном из двух классов. Сделайте его абстрактным методом в MyAbstractActivity и реализуйте его по мере необходимости.
    • Пусть другие классы наследуют от MyAbstractActivity.
  3. Преобразование OnClickListener в класс.
    • В качестве аргументов конструктора вы передаете подкласс MyAbstractActivity и кнопки (iUserAvatarSettings/iUserAvatar).
    • Используйте аргументы конструктора для ссылки на методы и переменные, такие как userHasProvidedOwnPhoto.
    • Часть iUserAvatar.setOnClickListener(...) останется в MyAbstractActivity.
  4. Теперь вы удалили избыточность кода, но будет больше. Вероятно, инкапсуляция сейчас недостаточно хороша.
    • Подумайте о способах и переменных перемещения к классу OnClickListener или от него.
    • Подумайте о методах и переменных перемещения к MyAbstractActivity или от него.
    • Попросите еще одного опытного разработчика сделать обзор. (Не просите его реорганизовать его.)
    • Если у вас есть конкретный вопрос рефакторинга, верните ее и попросите сообщество.
1

Вы можете проверить мой проект Android Image Helper на Github

Деятельность с функцией выбора изображения будет выглядеть примерно так:

public class ImageUploaderActivity extends Activity implements ImageChooseCallback { 
    ImageUploadEngine uploadEngine; 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     uploadEngine = new ImageUploadEngine.Builder(this, savedInstanceState).build(); 
     //... 
     someButton.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       uploadEngine.performImageAsk(R.string.app_name, R.string.newphoto, R.string.oldphoto, R.string.choose, R.drawable.ic_launcher); 
      } 
     }); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     uploadEngine.onSaveInstanceState(outState); 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if(uploadEngine.onActivityResult(requestCode, resultCode, data)) return; 
     super.onActivityResult(requestCode, resultCode, data); 
    } 

    @Override 
    public void onCanceled(ImageUploadEngine engine) { 
     //notifying you that the user has canceled the request 
    } 

    @Override 
    public void onChosen(ImageUploadEngine engine, String path, boolean newPicture) { 
     //notifying you that the user has selected an image 
    } 

    @Override 
    public void onError(ImageUploadEngine engine, Exception ex) { 
     //notifying you that an error has occurred 
    } 
} 

uploadEngine также предоставляет функции performImageTake и performImageChoose в случае диалоговое окно по умолчанию (на выбор) не соответствует вашим потребностям.

FYI:

Этот проект призван обеспечить простой в использовании инструмент для андроид разработчикам использовать, когда нужно пользователю выбрать изображение на их телефон андроид и загрузить его. Если у процесса есть какие-либо ошибки на определенных телефонах, они должны обрабатываться внутри библиотеки, чтобы обеспечить одинаковое взаимодействие пользователей со всеми телефонами.

0

Вот мой подход к реорганизации вашего кода. Я попытался дать некоторое обоснование и моему дизайну.

1) Вы можете абстрагировать диалог в виде виджета.

Вы можете создать PhotoPickerDialog, который расширяет Dialog и обеспечивает необходимую функциональность. Затем вы можете повторно использовать этот виджет в разных местах/мероприятиях.

public class PhotoPickerDialog extends Dialog { 

    //private fields 
    private Typeface buttonFont = Typeface.DEFAULT; 
    private Button bTakeAPhoto; 
    private Button bSelectPhotoFromFile; 
    private Button bCancelAvatarUpload; 
    private IMediaHelper mMediaHelper; 

    public PhotoPickerDialog(Context context) { 
     super(context); 
     initView(); 
    } 

    public PhotoPickerDialog(Context context, int theme) { 
     super(context, theme); 
     initView(); 
    } 

    protected PhotoPickerDialog(Context context, boolean cancelable, OnCancelListener cancelListener) { 
     super(context, cancelable, cancelListener); 
     initView(); 
    } 

    protected void setLayoutResource() { 
     setContentView(R.layout.signup_avatar_upload_dialog); 
    } 

    protected void initView() { 
     setLayoutResource(); 

     bTakeAPhoto = (Button) findViewById(R.id.bTakeAPhoto); 
     bSelectPhotoFromFile = (Button) findViewById(R.id.bSelectPhotoFromFile); 
     bCancelAvatarUpload = (Button) findViewById(R.id.bCancelAvatarUpload); 

     bCancelAvatarUpload.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       dismiss(); 
      } 
     }); 
    } 

    /** 
    * Set the type face of the button, in case you want to have different 
    * font at different times. 
    */ 
    public void setButtonFont(Typeface font) { 
     buttonFont = font; 
     bTakeAPhoto.setTypeface(buttonFont); 
     bSelectPhotoFromFile.setTypeface(buttonFont); 
     bCancelAvatarUpload.setTypeface(buttonFont); 
    } 

    /** 
    * Set the media helper object which implements the functionality to 
    * take and pick photo. So the task delegated to this media helper. 
    */ 
    public void setMediaHelper(IMediaHelper mediaHelper) { 
     mMediaHelper = mediaHelper; 
     bTakeAPhoto.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mMediaHelper.takePhoto(); 
       dismiss(); 
      } 
     }); 

     bSelectPhotoFromFile.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mMediaHelper.pickPhoto(); 
       dismiss(); 
      } 
     }); 
    } 
} 

Поскольку вам нужны два разных типа диалогов в зависимости от того, есть ли у пользователя аватарная фотография уже или нет. Создадим PhotoPickerDialogWithDelete, который расширяет PhotoPickerDialog. Затем нам нужно только override несколько методов и добавить обратный вызов delete, чтобы сделать наш новый тип диалога без повторной записи большого количества кода.

public class PhotoPickerDialogWithDelete extends PhotoPickerDialog { 
    private Button bDeleteAvatar; 

    public PhotoPickerDialogWithDelete(Context context) { 
     super(context); 
    } 

    public PhotoPickerDialogWithDelete(Context context, int theme) { 
     super(context, theme); 
    } 

    protected PhotoPickerDialogWithDelete(Context context, boolean cancelable, OnCancelListener cancelListener) { 
     super(context, cancelable, cancelListener); 
    } 

    @Override 
    protected void setLayoutResource() { 
     setContentView(R.layout.signup_avatar_upload_dialog_2); 
    } 

    @Override 
    protected void initView() { 
     super.initView(); 
     bDeleteAvatar = (Button) findViewById(R.id.bDeleteAvatar); 
    } 

    @Override 
    public void setButtonFont(Typeface font) { 
     super.setButtonFont(font); 
     bDeleteAvatar.setTypeface(font); 
    } 

    public void setOnDeleteListener(final View.OnClickListener listener) { 
     bDeleteAvatar.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       dismiss(); 
       listener.onClick(v); 
      } 
     }); 
    } 
} 

2) Перемещение фотографий намерения функциональных возможностей, связанное с abstract базового класса MediaSupportActivity.

Все мероприятия, которые должны поддерживать принятие/собирание фото просто нужно extend из этого класса и реализовать два простых метода handleSmallCameraPhoto(Bitmap) и handleGalleryPhoto(Bitmap). Им не нужно явно заботиться о том, как брать/выбирать фотографии, но заботиться только о том, как их обрабатывать (что может быть различным для разных видов деятельности).

public abstract class MediaSupportActivity extends Activity implements IMediaHelper { 

    private static final int TAKE_IMAGE_WITH_CAMERA = 1; 
    private static final int PICK_IMAGE = 2; 

    protected abstract void handleSmallCameraPhoto(Bitmap image); 
    protected abstract void handleGalleryPhoto(Bitmap image); 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (requestCode == TAKE_IMAGE_WITH_CAMERA && resultCode == RESULT_OK && null != data) { 
      Bundle extras = data.getExtras(); 
      Bitmap bitmap = (Bitmap) extras.get("data"); 
      handleSmallCameraPhoto(bitmap); 
     } 
     else if (requestCode == PICK_IMAGE && resultCode == RESULT_OK && null != data) { 
      Uri _uri = data.getData(); 
      Cursor cursor = getContentResolver().query(_uri, new String[] { android.provider.MediaStore.Images.ImageColumns.DATA }, null, null, null); 
      cursor.moveToFirst(); 
      final String imageFilePath = cursor.getString(0); 
      cursor.close(); 
      Bitmap bitmap = BitmapFactory.decodeFile(imageFilePath); 
      handleGalleryPhoto(bitmap); 
     } 
    } 

    @Override 
    public void takePhoto() { 
     Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     startActivityForResult(takePictureIntent, MediaSupportActivity.TAKE_IMAGE_WITH_CAMERA); 
    } 

    @Override 
    public void pickPhoto() { 
     Intent getImageFromGallery = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
     getImageFromGallery.setType("image/*"); 
     startActivityForResult(getImageFromGallery, MediaSupportActivity.PICK_IMAGE); 
    } 
} 

3) Существует интерфейс IBBMediaHelper, который определил два метода: takePhoto() и pickPhoto().Проезжает IBBMediaHelper экземпляра диалога, с тем чтобы этот диалог не имеет полный доступ к другим свойствам и методам MediaSupportActivity

public interface IMediaHelper { 

    public void takePhoto(); 

    public void pickPhoto(); 
} 

4) Вот пример, как использовать вышеуказанные классы вместе:

public class MainActivity extends MediaSupportActivity { 

    Button iUserAvatarSettings; 
    private boolean userHasProvidedOwnPhoto = false; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     iUserAvatarSettings = (Button) findViewById(R.id.button); 
     iUserAvatarSettings.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       final PhotoPickerDialog dialog; 
       if (!userHasProvidedOwnPhoto) { 
        dialog = new PhotoPickerDialog(MainActivity.this); 
       } 
       else { 
        dialog = new PhotoPickerDialogWithDelete(MainActivity.this); 
        ((PhotoPickerDialogWithDelete)dialog).setOnDeleteListener(onAvatarDelete); 
       } 
       dialog.setButtonFont(Typeface.MONOSPACE); 
       dialog.setMediaHelper(MainActivity.this); 
       dialog.show(); 
      } 
     }); 
    } 

    @Override 
    protected void handleSmallCameraPhoto(Bitmap image) { 
     // sample code 
     ImageView imageView = (ImageView) findViewById(R.id.imageView); 
     imageView.setImageBitmap(image); 
    } 

    @Override 
    protected void handleGalleryPhoto(Bitmap image) { 
     // sample code 
     ImageView imageView = (ImageView) findViewById(R.id.imageView); 
     imageView.setImageBitmap(image); 
    } 

    private OnClickListener onAvatarDelete = new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // this is executed when delete is clicked 
      // check for male/female and update the avatar 
      // etc. etc. 
     } 
    }; 
} 

Update: Вы также можете создать аватар виджет AvatarWidget класса, который содержит ImageView и PhotoPickerDialog. Этот класс инкапсулирует логику отображения аватара, нажимая на него, чтобы отобразить меню и установить аватар по умолчанию при щелчке по удалению. Затем в основном действии просто объявите виджет аватара с помощью кода или XML и вызовите сеттеры на нем при получении изображения.

Смежные вопросы