저는 이것이 꽤 일반적인 질문이라는 것을 알고 있습니다. 그러나 몇 가지 유사한 게시물을 살펴 보았습니다. 몇 가지 가이드를 따라 갔지만 여전히 작동하지 않습니다.DialogFragment 인터페이스에서 콜백을받지 못하는 액티비티
당신이 볼 수 있듯이, 버튼을 누를 때NavigationView mDrawerList = (NavigationView) findViewById(R.id.main_navigation);
Menu navMenu = mDrawerList.getMenu();
topChannelMenu = navMenu.addSubMenu("Stuff");
final Button addButton = (Button) findViewById(R.id.add_button);
addButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyDialog addDialog = new MyDialog();
addDialog.show(getSupportFragmentManager(), "AddDialog");
addDialog.setDialogResult(new AddDialog.MyDialogListener() {
@Override
public void onDialogPositiveClick(MyObject objectToSend) {
topChannelMenu.add(objectToSend.toString()); //Not getting called
Log.d(TAG, "Item added");
}
});
}
});
(탐색 서랍에 위치), 대화 상자 (관련 클래스 아래에 포함) 열립니다
다음은 주요 활동에 대한 내 코드입니다. 사용자가 일부 데이터를 입력하고 긍정적 인 대화 상자 버튼을 누르면 데이터가 액티비티로 전송되도록 프롬프트됩니다. 나는이 답변에서 권장하는 해결책을 사용하려고 시도했다 : How can I pass values between a Dialog and an Activity?. 나는 아마도 Intent를 사용할 수 있다는 것을 알고 있지만 Observer Pattern을 구현하고 싶습니다. 이해해야하는 부분이기 때문에 Observer Pattern을 구현하고 싶습니다.
다음 MyDialog에 대한 코드입니다 : 내가 인터페이스를 사용하여 너무 큰 아니에요
public class MyDialog extends DialogFragment {
MyDialogListener mListener;
public interface MyDialogListener{
public void onDialogPositiveClick(MyObject objectToSend);
}
@Override
@NonNull
public Dialog onCreateDialog(Bundle savedInstanceState){
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
View view = inflater.inflate(R.layout.add_plant_dialog, null);
edit1 = (EditText) view.findViewById(R.id.res1_edit);
edit2 = (EditText) view.findViewById(R.id.res2_edit);
edit3 = (EditText) view.findViewById(R.id.res3_edit);
builder.setView(view);
builder.setPositiveButton(R.string.add, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String selectedName = edit1.getText().toString();
String selectedSpec = edit2.getText().toString();
String selectedTemp = edit3.getText().toString();
MyObject userObject = new Plant(selectedName, selectedSpec);
mDBHandler = new DBHandler(getActivity(), null, null, 1);
mDBHandler.addToDB(userObject);
mListener.onDialogPositiveClick(userObject);
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
//return createdDialog;
return builder.create();
}
@Override
public void onAttach(Activity activity){
super.onAttach(activity);
// Verify that activity implements the listener
try {
// Instantiate the MyDialogListener so we can send events to host
mListener = (MyDialogListener) activity;
} catch (ClassCastException e){
throw new ClassCastException(activity.toString() + " must implement " +
"MyDialogListener interface");
}
}
public void setDialogResult(MyDialogListener listener){
mListener = listener;
}
}
, 그래서이 올바르게하는 방법을 구현하지 않는 단순한 실수인지 확실하지 않다, 또는 경우 이것은 DialogFragment의 수명주기와 관련이있는 더 미묘한 것입니다. 나는 정말 어떤 도움을 주셔서 감사합니다. 미리 감사드립니다.
발생하는 문제점은 무엇입니까? – Ginandi
첫 번째 코드 단편에 주석 처리 된 행은 실행되지 않습니다. onDialogPositiveClick (MyObject objectToSend)이 액티비티에서 호출되지 않습니다. –