在我的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);
        }
    }


注册课程,图片摘录:

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);
    }
}

最佳答案

isIntentAvailable(Context, String)移至实用程序类。这在其他一些用例中可能会有所帮助。
创建一个包含所有常见活动方法的抽象类(称为MyAbstractActivity):handleSmallCameraPhoto(Intent)handleGalleryPhoto(Intent)onActivityResult(int, int, Intent)

iUserAvatarSettings / iUserAvatar必须是MyAbstractActivity的一部分。如果针对不同的用例需要不同的实现,请创建一个抽象的getter,例如getUserAvatarButton()
setAvatarPath(String)仅在两个类之一中使用。使它成为MyAbstractActivity中的抽象方法,并根据需要实现。
让其他类继承自MyAbstractActivity。

将OnClickListener转换为一个类。

作为构造函数参数,您传递MyAbstractActivity的子类和一个Button(iUserAvatarSettings / iUserAvatar)。
使用构造函数参数来引用方法和变量,例如userHasProvidedOwnPhoto
iUserAvatar.setOnClickListener(...)部分将保留在MyAbstractActivity中。

现在,您已经删除了代码冗余,但是还有更多工作要做。可能封装目前还不够好。

考虑将方法和变量移至OnClickListener类或从其移开。
考虑将方法和变量移至MyAbstractActivity或从中移出。
请一些更有经验的开发人员进行审查。 (不要让他重构它。)
如果您有具体的重构问题,请回来找她,并询问社区。

07-28 12:32