在内部接口方法中调用的方法返回null

时间:2019-02-07 21:35:34

标签: android

我创建了一个界面,以便可以在对话和片段之间进行通信。

目标:当用户从对话框中选择任何内容时,应将其显示在文本视图上。

在这个界面中,我创建了一个界面方法,在主活动中调用了该方法,并传递了用户在对话框中选择的值。在用户片段中,我与用户选择的值一起创建了一个将文本视图设置为该值的方法。但是,每当我调用该方法时,它总是返回null。

我对日志进行了大量测试,发现通过我的方法传递的值不为null,一切似乎都按照我想要的确切方式工作,这很奇怪。更让我感到困惑的是,该方法甚至没有运行,它在执行内部代码之前立即返回null,这对我来说真的很奇怪。

对话框代码:

    public String users_time;

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        final String time_options[] = {"10", "20", "30", "40", "50", "60", "70", "80", "90"}; // Since we know how many options there are in the array we use an array instead of an arraylist

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        builder.setTitle("Choose the time");
        builder.setSingleChoiceItems(time_options, -1, new DialogInterface.OnClickListener() { // check items = what index is auto selected in the dialog, use -1 bc you dont want that
            @Override
            public void onClick(DialogInterface dialog, int which) { // which = Index in the array
                CharSequence time = time_options[which];
                Log.i("this" ,"LOG 1 dialogsTime retusn" + time);
                listener.onDialogInput(time);

                users_time = time_options[which];

                int usersTime = Integer.valueOf(users_time);
                listener.grabTime(usersTime);

            }
        });
        builder.setPositiveButton("Set Time", new DialogInterface.OnClickListener() { // positive = Ok or continue
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                })
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { // Negative = Cancel or stop
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                });


        return builder.create(); // always return this at the end
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof  DiaglogListener) {
            listener = (DiaglogListener) context;
        }
        else {
            throw new RuntimeException(context.toString()
                    + " must implement DiaglogListener");
        }
    }
    @Override
    public void onDetach() {
        super.onDetach();
        listener = null;
    }
}

主要活动界面方法:

@Override
public void onDialogInput(CharSequence dialogsTime) {
    Fragment1_timer frag1 = new Fragment1_timer();

    Log.i("this" ,"LOG 2 runs successfully");

    try {
        frag1.setDialogTime(dialogsTime);
    } catch (Exception e){
        Toast.makeText(this, "Null error :/", Toast.LENGTH_SHORT).show();
    }
}

片段方法:

public void setDialogTime(CharSequence time){ 
    Log.i("this" ,"LOG 3 ran successfully");
    text_view_time.setText(time + ":00");
}

1 个答案:

答案 0 :(得分:0)

您不能将onAttach方法用于Fragment与DialogFragment的通信。 您将必须为此使用“ setTargetFragment”和“ getTargetFragment”。

您可以参考此答案。 https://stackoverflow.com/a/32323822/9792247