Activity 没有收到来自 DialogFragment 接口的回调
Activity not receiving callback from DialogFragment interface
我知道这是一个很常见的问题,但是,我浏览了很多类似的帖子,遵循了一些指南,但仍然无法解决这个问题。
下面是我主要的代码 activity:
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");
}
});
}
});
如您所见,按下了一个按钮(位于导航抽屉中),这会打开一个对话框(相关 class 包含在下面)。用户输入一些数据,并按下一个肯定的对话按钮,这应该会提示将数据发送到 activity。我尝试使用此答案中推荐的解决方案: How can I pass values between a Dialog and an Activity? 。我知道我可能可以使用 Intent,但我真的很想实现观察者模式,因为这是我一直在努力理解的东西。
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 的生命周期有关的更微妙的事情.我真的很感激任何帮助。提前谢谢你。
您不需要通过方法显式设置侦听器。确保您的主机 activity 实现了该接口,它将在片段的 onAttach 方法中获取引用。
我知道这是一个很常见的问题,但是,我浏览了很多类似的帖子,遵循了一些指南,但仍然无法解决这个问题。
下面是我主要的代码 activity:
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");
}
});
}
});
如您所见,按下了一个按钮(位于导航抽屉中),这会打开一个对话框(相关 class 包含在下面)。用户输入一些数据,并按下一个肯定的对话按钮,这应该会提示将数据发送到 activity。我尝试使用此答案中推荐的解决方案: How can I pass values between a Dialog and an Activity? 。我知道我可能可以使用 Intent,但我真的很想实现观察者模式,因为这是我一直在努力理解的东西。
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 的生命周期有关的更微妙的事情.我真的很感激任何帮助。提前谢谢你。
您不需要通过方法显式设置侦听器。确保您的主机 activity 实现了该接口,它将在片段的 onAttach 方法中获取引用。