java - 对话框 fragment 使用改造更改密码

标签 java android android-fragments retrofit2

<分区>

我想使用 Retrofit 库从弹出的 Dialog 中更改 ProfileActivity.java 中的用户密码。
场景是用户单击 MainActivity.java 中的 Edit 按钮 后将显示 Dialog

我已经成功地显示了 Dialog 并将 if-else 放在上面,但问题是我无法将数据发送到 Retrofit 方法在 ProfileActivity.java 中。

我不知道如何以及在何处调用 Retrofit 方法,导致应用程序崩溃。

这是我的代码 ProfileActivity.javaRetrofit 方法在底部:

public class ProfileActivity extends AppCompatActivity implements ChangePassDialog.ChangePassDialogListener {

    private String oldPassExtra, newPassExtra;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_profile);

    Button btnEditPass = findViewById(R.id.btn_editPass);

        btnEditPass.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ChangePass changePassDialog = new ChangePass();
                changePassDialog.show(getSupportFragmentManager(),"Pass Dialog Changer");


      }
        });    
    }

    public void changePassApi(String oldPass, String newPass) {
        RestApi api = RetroFit.getInstanceRetrofit();
        Call<ResponseRegister> registerCall = api.changePassword(
                oldPass,
                newPass
        );
        registerCall.enqueue(new Callback<ResponseRegister>() {
            // If response success
            @Override
            public void onResponse(Call<ResponseRegister> call, Response<ResponseRegister> response) {
                if (response.isSuccessful()) {
                    String result = response.body().getResult();
                    String msg = response.body().getMsg();
                    if (result.equals("1")) {
                        Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
                    }
                } else {
                    Toast.makeText(getApplicationContext(), "Connection Failed!", Toast.LENGTH_LONG).show();
                }
            }

            // if response fail
            @Override
            public void onFailure(Call<ResponseRegister> call, Throwable t) {
                Toast.makeText(getApplicationContext(), "Connection Problem", Toast.LENGTH_LONG).show();
            }
        });
    }
}

这是我的 ChangePassDialog.java

    public class ChangePass extends DialogFragment {
    ProfileActivity profileActivity;
    private EditText edtOldPass, edtNewPass;
    private TextView okPass, cancelPass;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.dialog_changepass, container, false);
        okPass = view.findViewById(R.id.ok_pass);
        cancelPass = view.findViewById(R.id.cancel_pass);
        edtOldPass = view.findViewById(R.id.edit_passOld);
        edtNewPass = view.findViewById(R.id.edit_passNew);

        profileActivity = new ProfileActivity();

        cancelPass.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getDialog().dismiss();
            }
        });

        okPass.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String inputOld = edtOldPass.getText().toString().trim();
                String inputNew = edtNewPass.getText().toString().trim();
                if (inputOld.isEmpty()) {
                    edtOldPass.requestFocus();
                    edtOldPass.setError("Field password lama tidak boleh kosong");
                    // Toast.makeText(getActivity(),"hallo",Toast.LENGTH_SHORT).show();
                } else if (inputNew.isEmpty()) {
                    edtNewPass.requestFocus();
                    edtNewPass.setError("Field password baru tidak boleh kosong");
                } else if (inputOld.equals(inputNew)) {
                    edtNewPass.requestFocus();
                    edtNewPass.setError("Password tidak boleh sama");
                } else {
                    profileActivity.changePassApi(inputOld, inputNew);
                }
            }
        });
        return view;
    }
}

Dialog.xml

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:id="@+id/edit_passOld"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/activity_vertical_margin"
        android:layout_marginBottom="10dp"
        android:hint="Password lama"
        android:inputType="textPassword"
        android:paddingStart="25dp"
        android:paddingLeft="25dp"
        android:paddingEnd="0dp"
        android:paddingRight="0dp" />

    <EditText
        android:id="@+id/edit_passNew"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/edit_passOld"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:hint="Password baru"
        android:inputType="textPassword"
        android:paddingStart="25dp"
        android:paddingLeft="25dp"
        android:paddingEnd="0dp"
        android:paddingRight="0dp" />

    <TextView
        android:id="@+id/ok_pass"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/edit_passNew"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_marginTop="30dp"
        android:layout_marginEnd="25dp"
        android:layout_marginBottom="@dimen/activity_vertical_margin"
        android:layout_marginRight="25dp"
        android:text="OK"
        android:textColor="@color/purple"
        android:textSize="16sp" />

    <TextView
        android:id="@+id/cancel_pass"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/edit_passNew"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_marginBottom="@dimen/activity_vertical_margin"
        android:layout_marginStart="25dp"
        android:layout_marginLeft="25dp"
        android:layout_marginTop="30dp"
        android:text="CANCEL"
        android:textColor="@color/purple"
        android:textSize="16sp" />
</RelativeLayout>

日志猫

01-25 14:40:15.630 2102-2102/com.supermalkarawaci.redeempointapps E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.supermalkarawaci.redeempointapps, PID: 2102
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
    at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:107)
    at com.supermalkarawaci.redeempointapps.activity.ProfileActivity$4.onResponse(ProfileActivity.java:340)
    at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5480)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

感谢任何帮助!

最佳答案

profileActivity = new ProfileActivity();

你不能像这样获取 ProfileActivity 对象,也永远不要这样做。它会初始化 ProfileActivity 的全新实例,这与您的运行 Activity 无关。

像这样。

profileActivity = (ProfileActivity) getActivity();

选项 2.

更喜欢这个

将您的 public void changePassApi() 方法放在您的 Dialog fragment 中

关于java - 对话框 fragment 使用改造更改密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54360786/

相关文章:

java - 如何从java中的父类(super class)方法停止/退出子类方法的执行

java - 仅加密图像文件的内容而不是整个文件

android - bluestacks 卡在加载 channel 上

java - NavigationComponents - 抽屉导航无法导航

来自 Google Play 控制台的 java.lang.IllegalStateException 崩溃报告

java - 修复 java.lang.NoSuchMethodError : com. amazonaws.util.StringUtils.trim

java - Android Firebase : invalid case sensitive name

android - 在 fragment 中显示后退箭头

java - 在 Quartz 中使用 JobStoreCMT - 防止自动提交

java - 使用 Jackson 解析器获取整个 JSON 对象