我在从对话框中获取数据到调用活动时遇到问题。一直关注Android文件,但没有运气。我只想捕获某人在对话框的编辑文本框中输入的字符串。这是我的设置。
public class CrossoverMainActivity extends Activity implements CrossoverSaveDialog.NoticeDialogListener {
final CrossoverSaveDialog dialog_save = new CrossoverSaveDialog();
@Override
public void onDialogPositiveClick(DialogFragment dialog) {
// User touched the dialog's positive button
}
@Override
public void onDialogNegativeClick(DialogFragment dialog) {
// User touched the dialog's negative button
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
if (id == R.id.action_save) {
dialog_save.show(getFragmentManager(), "Dialog_save");
return true;
}
if (id == R.id.action_delete) {
CrossoverDeleteDialog dialog_delete = new CrossoverDeleteDialog();
//Fragment fragment = new Fragment();
dialog_delete.show(getFragmentManager(), "Dialog_delete");
return true;
}
return super.onOptionsItemSelected(item);
}
}
然后,在另一个.java文件中,我有我的对话框:
public class CrossoverSaveDialog extends DialogFragment {
public interface NoticeDialogListener {
void onDialogPositiveClick(DialogFragment dialog);
void onDialogNegativeClick(DialogFragment dialog);
}
// Use this instance of the interface to deliver action events
NoticeDialogListener mListener;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
View dialogSave = inflater.inflate(R.layout.crossover_save_dialog, null);
builder.setView(dialogSave);
builder.setPositiveButton(R.string.dialog_save, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
mListener.onDialogPositiveClick(CrossoverSaveDialog.this);
}
})
.setNegativeButton(R.string.dialog_cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
mListener.onDialogNegativeClick(CrossoverSaveDialog.this);
}
});
return builder.create();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// Verify that the host activity implements the callback interface
try {
// Instantiate the NoticeDialogListener so we can send events to the host
mListener = (NoticeDialogListener) activity;
} catch (ClassCastException e) {
// The activity doesn't implement the interface, throw exception
throw new ClassCastException(activity.toString()
+ " must implement NoticeDialogListener");
}
}
}
以下是我的两个问题:
我遇到的问题是编译器抱怨我没有实现我界面的方法......我似乎是这样。我有什么东西在这里失踪吗?
我必须为第二个对话框执行此操作,该对话框与我在此处显示的对话框不同。但是,我会以同样的方式做到这一点。我只是查看回调方法的对话框来确定正在使用哪个对话框?这样我就可以处理每个对话框的逻辑。或者,我是否应该让每个对话框都有一个单独的界面,使用它的每个独特的方法,并只实现它们中的每一个?
答案 0 :(得分:0)
您必须将您的活动设置为新成员“mListener”的监听器
所以在Dialogclass中你应该为你的监听器创建一个getter / setter:
public NoticeDialogListener getListener() { return mListener; }
public void setListener (NoticeDialogListener listener) { mListener=listener; }
在你的活动中你会做
CrossoverDeleteDialog dialog_delete = new CrossoverDeleteDialog();
dialog_delete.setListener(this);
dialog_delete.show(getFragmentManager(), "Dialog_delete");
答案 1 :(得分:0)
我实际上在这里找到了答案。
@blender:也许我误解了这一点,但我认为我不需要这样做吗?我的意思是,我已经在我的活动课程中实现了界面,并且我在对话课程中通过onAttach加入了这个界面我不是吗?
无论如何,这是大错。我正在导入android.support.v4.app.DialogFragment。然后,在我的主要活动中,我导入了android.app.DialogFragment。这导致我的主要活动中的两个方法回调实际上没有被编译器注册。我使用Android Studio,因此当您自动导入内容时,很容易忽略您没有导入正确名称空间的事实。卫生署!
其次,我发现你可以在onDialogPositiveClick(DialogFragment对话框)中调用dialog.getTag()。您可以针对它显示的任何对话框进行检查。通过这种方式,您可以使用相同的界面方法拥有多个对话框,并且只需合并您的"检查"那里的逻辑。
即,我有这一行:
dialog_save.show(getFragmentManager(), "Dialog_save");
所以我可以这样做来检查我点击了哪个对话框:
@Override
public void onDialogPositiveClick(DialogFragment dialog) {
// User touched the dialog's positive button
if (dialog.getTag().equals("Dialog_save"){
//..do stuff...
}
if (dialog.getTag().equals("Dialog_cancel"){
//..do stuff...
}
}