Android将对话框中的参数传递给调用活动

时间:2015-06-21 01:26:18

标签: java android interface

我在从对话框中获取数据到调用活动时遇到问题。一直关注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");
        }
    }
}

以下是我的两个问题:

  • 我遇到的问题是编译器抱怨我没有实现我界面的方法......我似乎是这样。我有什么东西在这里失踪吗?

  • 我必须为第二个对话框执行此操作,该对话框与我在此处显示的对话框不同。但是,我会以同样的方式做到这一点。我只是查看回调方法的对话框来确定正在使用哪个对话框?这样我就可以处理每个对话框的逻辑。或者,我是否应该让每个对话框都有一个单独的界面,使用它的每个独特的方法,并只实现它们中的每一个?

2 个答案:

答案 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...
    }
}