Как обновить активность после загрузки изображения в Android - PullRequest
0 голосов
/ 20 мая 2018

У меня есть действие, в котором пользователь может обновить некоторые данные, связанные с его профилем (например, его имя), и он также может загрузить новое изображение профиля.

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

Чтобы увидеть новое изображение профиля, пользовательНеобходимо закрыть приложение и снова открыть.

Как я могу решить эту проблему?Я использую функцию updateInfo (), но, кажется, она не работает так, как мне бы хотелось.

Не могли бы вы мне помочь, пожалуйста?

    public class ProfileActivity extends BaseActivity implements ProfileView {

    @BindView(R.id.avatar)
    ImageView p_avatar;
    @BindView(R.id.ib_back)
    ImageButton ibBack;
    @BindView(R.id.txt_title)
    TextView txtTitle;
    @BindView(R.id.ib_right)
    ImageButton ibRight;
    @BindView(R.id.toolbar)
    Toolbar toolbar;
    @BindView(R.id.et_fullname)
    EditText etFullname;
    @BindView(R.id.et_email)
    EditText etEmail;
    @BindView(R.id.btn_update)
    Button btnUpdate;
    @BindView(R.id.txt_logout)
    TextView txtLogout;
    @BindView(R.id.ll_main)
    LinearLayout llMain;

    private static final String TAG = "ProfileActivity";
    private String userName = null, userEmail = null;
    private ProfilePresenter profilePresenter;
    private Dialog dialog;
    Bitmap FixBitmap;
    Bitmap bitmap_to_save;
    ImageView ShowSelectedImage;
    String converted_img;
    ByteArrayOutputStream byteArrayOutputStream;
    byte[] byteArray ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_profile);
        ButterKnife.bind(this);
        byteArrayOutputStream = new ByteArrayOutputStream();

        init_view();
        upDateInfo();
    }


    private void init_view() {
        txtTitle.setText(R.string.profileActivity_title);
        ibRight.setImageResource(R.drawable.ic_edit);

        dialog = commonUtils.createCustomLoader(ProfileActivity.this, false);
        profilePresenter = new ProfilePresenterImpl(this);

        upDateInfo();
    }

    private void upDateInfo() {
        if (Conts.USERINFO != null) {
            String subName = firstTwoChar(Conts.USERINFO.getName());
           // Picasso.get().load("http://www.server.com/uploads/avatars/73.png").transform(transformation).into(p_avatar);

            final int radius = 30;
            final int margin = 1;
            final RoundedCornersTransformation transformation = new RoundedCornersTransformation(radius, margin);
            Picasso.get().load("http://www.server.com/uploads/avatars/"+Conts.USERINFO.getId()).transform(transformation).into(p_avatar);


            etFullname.setText(Conts.USERINFO.getName().toLowerCase());
            etFullname.setEnabled(false);
            etEmail.setText(Conts.USERINFO.getEmail());
            etEmail.setEnabled(false);
            btnUpdate.setVisibility(View.INVISIBLE);
        }
    }

    @OnClick({R.id.ib_back, R.id.ib_right, R.id.btn_update, R.id.txt_logout, R.id.avatar})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.ib_back:
                onBackPressed();
                break;
            case R.id.ib_right:
                etFullname.setEnabled(true);
                etFullname.setSelection(etFullname.getText().toString().length());
                btnUpdate.setVisibility(View.VISIBLE);
                Log.d(TAG, "validate ID: " + Conts.USERINFO.getId());
                return;
            case R.id.avatar:
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent, "Select Image From Gallery"), 1);
                return;
            case R.id.btn_update:
                if (validate()) {
                    if (!commonUtils.isNetworkAvailable()) {
                        Toast.makeText(this, "No Internet Connection", Toast.LENGTH_SHORT).show();
                        return;
                    }
                    profilePresenter.dataListAPI(Conts.USERINFO.getId(), userName, Conts.USERINFO.getEmail(), converted_img);
                }
                break;
            case R.id.txt_logout:
                get_dialog();
                break;
        }
    }


    @Override
    protected void onActivityResult(int RC, int RQC, Intent I) {

        super.onActivityResult(RC, RQC, I);

        if (RC == 1 && RQC == RESULT_OK && I != null && I.getData() != null) {

            Uri uri = I.getData();

            try {

                FixBitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
                bitmap_to_save = scaleBitmapAndKeepRation(FixBitmap, 320, 320);


                RoundedBitmapDrawable roundedBitmapDrawable = RoundedBitmapDrawableFactory.create(getResources(), bitmap_to_save);
                final float roundPx = (float) bitmap_to_save.getWidth() * 0.15f;
                roundedBitmapDrawable.setCornerRadius(roundPx);
                roundedBitmapDrawable.setAntiAlias(true);
                p_avatar.setImageDrawable(roundedBitmapDrawable);


                bitmap_to_save.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);

                byteArray = byteArrayOutputStream.toByteArray();

                converted_img = Base64.encodeToString(byteArray, Base64.DEFAULT); // this is the image string to send to the server!


            } catch (IOException e) {

                e.printStackTrace();
            }
        }
        else {
            Toast.makeText(this, "An error has occurred!", Toast.LENGTH_SHORT).show();

        }
    }

    public static Bitmap scaleBitmapAndKeepRation(Bitmap TargetBmp, int reqHeightInPixels, int reqWidthInPixels)
    {
        Matrix m = new Matrix();
        m.setRectToRect(new RectF(0, 0, TargetBmp.getWidth(), TargetBmp.getHeight()), new RectF(0, 0, reqWidthInPixels, reqHeightInPixels), Matrix.ScaleToFit.CENTER);
        Bitmap scaledBitmap = Bitmap.createBitmap(TargetBmp, 0, 0, TargetBmp.getWidth(), TargetBmp.getHeight(), m, true);
        return scaledBitmap;
    }


    @Override
    public void onBackPressed() {
        super.onBackPressed();
    }

    private void get_dialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setCancelable(false);

        View view = LayoutInflater.from(this).inflate(R.layout.dialog_logout, null);

        builder.setView(view);
        final AlertDialog alertDialog = builder.create();
        alertDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
        alertDialog.show();

        TextView txtyes, txtno;

        txtyes = view.findViewById(R.id.txt_yes);
        txtno = view.findViewById(R.id.txt_no);

        txtyes.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                alertDialog.dismiss();
                sharedPref.setBoolean(Conts.IsLogin, false);
                sharedPref.clearAllPref();
                Conts.USERINFO = null;

                Intent iLogin = new Intent(ProfileActivity.this, MainActivity.class);
                iLogin.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(iLogin);
            }
        });

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

    public String firstTwoChar(String str) {
        return str.length() < 2 ? str : str.substring(0, 2);
    }

    @Override
    public void showLoader() {
        dialog.show();
    }

    @Override
    public void hideLoader() {
        if (dialog != null)
            dialog.dismiss();
    }

    @Override
    public void showError(String msg) {
        Snackbar snackbar = Snackbar
                .make(llMain, msg, Snackbar.LENGTH_INDEFINITE)
                .setAction("RETRY", new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        //  nothing anything
                    }
                });

        snackbar.show();

        // Changing message text color
        snackbar.setActionTextColor(Color.RED);

        // Changing action button text color
        View sbView = snackbar.getView();
        TextView textView = (TextView) sbView.findViewById(android.support.design.R.id.snackbar_text);
        textView.setTextColor(Color.WHITE);
        snackbar.show();
    }

    @Override
    public Context getContextAppp() {
        return this;
    }

    @Override
    public void onBackPress() {

    }

    @Override
    public void successResponse(Data data) {
        if (data != null) {
            Toast.makeText(this, "Profile updated successfully", Toast.LENGTH_SHORT).show();

            UserInfo userInfo = new UserInfo(data.getId(), data.getName(), data.getEmail());
            Conts.USERINFO = userInfo;
            String userinfo = gson.toJson(Conts.USERINFO, UserInfo.class);
            sharedPref.setDataInPref(Conts.UserInfo, userinfo);

            startActivity(getIntent());
            Intent iPlace = new Intent(ProfileActivity.this, AddPlaceActivity.class);
            iPlace.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
            Toast.makeText(this, "Profile saved!", Toast.LENGTH_SHORT).show();
            startActivity(iPlace);



        }
    }

    @Override
    public void errorResponce(String msg) {
        if (msg != null) {
            Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
        }
    }

    private boolean validate() {
        commonUtils.hideKeyboard(this);

        if (etFullname.getText().toString().trim().isEmpty()) {
            Toast.makeText(this, "Please enter Fullname", Toast.LENGTH_SHORT).show();
        } else if (etFullname.getText().toString().trim().length() <= 2) {
            Toast.makeText(this, "Minimum 3 character require", Toast.LENGTH_SHORT).show();
        } else if (etFullname.getText().toString().trim().length() > 30) {
            Toast.makeText(this, "Maximum 30 character require", Toast.LENGTH_SHORT).show();
        }
        /*else if (etEmail.getText().toString().trim().isEmpty()) {
            Toast.makeText(this, "Please enter Email", Toast.LENGTH_SHORT).show();
        } else if (!validation.checkEmail(etEmail)) {
            Toast.makeText(this, "Please enter valid Email", Toast.LENGTH_SHORT).show();
        }
*/
        if (!etFullname.getText().toString().trim().isEmpty() && etFullname.getText().toString().trim().length() > 2 && etFullname.getText().toString().trim().length() <= 30) {
            userName = etFullname.getText().toString().trim();
        } else {
            userName = null;
        }

        /*if (!etEmail.getText().toString().trim().isEmpty() && validation.checkEmail(etEmail)) {
            userEmail = etEmail.getText().toString().trim();
        } else {
            userEmail = null;
        }
*/
        if (userName != null /*&& userEmail != null*/) {
            Log.d(TAG, "validate: " + userName);
            return true;
        } else {
            return false;
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

После обновления информации в callback методе onResponse необходимо вызвать updateInfo(), чтобы обновить пользовательский интерфейс после успешного завершения обновления информации.Убедитесь, что вы передаете новые значения с сервера, особенно в static переменные, потому что они будут сохранять значения, пока приложение работает.Если вы не обновите их новыми значениями, они сохранят старые.

В настоящее время таким способом вы пытаетесь обновить информацию только в onCreate(), который вызывается, когда необходимо создать Activity.В этом сценарии, когда вы выходите из приложения и снова входите в него, только нажав кнопку Back, в то время как при нажатии кнопки Home он не будет работать, пока приложение не будет уничтожено операционной системой.

Вы также можете использовать метод onResume, который вызывается после того, как Activity возвращается из паузы, и это произойдет, когда вы создадите новый Activity после его выхода.

0 голосов
/ 20 мая 2018

Когда вы возвращаетесь к активности вашего профиля, стек задач вашего приложения возвращает активность вашего профиля, которая уже находится в памяти.Таким образом, вы должны сообщить свой профиль деятельности, что он был обновлен.В обратном вызове onStart активности вашего профиля проверьте, обновлен ли он.Если это так, загрузите новое изображение.Короче говоря, поместите ваш метод upDateInfo () в onStart ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...