我想使用ProfileActivity.java
库中弹出的Retrofit
来更改Dialog
内部的用户密码。
场景是Dialog
将在用户单击Edit Button
中的MainActivity.java
之后显示。
我已经成功显示了Dialog
并在其上加上了if-else,但是问题是我无法将数据发送到{{1}中的Retrofit
方法}。
我不知道如何调用ProfileActivity.java
方法以及在何处调用方法,这会使应用程序崩溃。
这是我的代码 ProfileActivity.java ,其中Retrofit
方法位于底部:
Retrofit
这是我的 ChangePassDialog.java
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();
}
});
}
}
和 Dialog.xml
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;
}
}
日志猫
<?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>
感谢任何帮助!
答案 0 :(得分:1)
profileActivity =新的ProfileActivity();
您无法获得像这样的ProfileActivity对象,并且永远不会这样做。它将初始化与您的跑步活动无关的ProfileActivity的新实例。
这样做吧。
profileActivity =(ProfileActivity)getActivity();
选项2。
喜欢这个
将public void changePassApi()
方法放在对话框片段中
答案 1 :(得分:0)
首先,永远不要直接创建任何活动的实例。
profileActivity = new ProfileActivity();
(永远不要这样做)onAttach()
中获取活动参考,并将其类型转换为Callbacks,并确保在null
中将其设置为onDetach()
以防止泄漏(最佳实践)示例片段回调实现。
主机活动:
public class MainActivity extends AppCompatActivity implements LoginFragment.Callbacks {
.
.
.
@Override
public void changePassword(String newPassword) {
//do retrofit call
}
.
.
.
}
对话框片段:
public class LoginFragment extends DialogFragment {
private Callbacks mCallbacks;
private Button btnOk;
.
.
.
private void setViews() {
btnOk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCallbacks.changePassword("1234");
}
});
}
.
.
.
@Override
public void onAttach(Context context) {
super.onAttach(context);
mCallbacks = (Callbacks) context;
}
@Override
public void onDetach() {
super.onDetach();
mCallbacks = null;
}
public interface Callbacks {
void changePassword(String newPassword);
}
}
提示: 此外,调用Callback方法时,您可以处理类型转换异常和回调引用为空的检查。