android-fragments 处理Activity中的DialogFragment onClick事件

mhd8tkvw  于 2022-11-13  发布在  Android
关注(0)|答案(2)|浏览(181)

我有一个android应用程序,它有一个调用异步进程的DialogFragment(在下面的代码示例中称为“api.Async”)。完成后,我想显示另一个Activity的结果。我一直收到“Fragment [Name] not attached to activity.”。我该如何修复这个问题?一旦完成,我该如何向新Activity发送信息?

public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    LayoutInflater inflater = getActivity().getLayoutInflater();

    final View view = inflater.inflate(R.layout.dialog_lookup, null);

    builder.setView(view)
            .setPositiveButton(R.string.lookup, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    EditText text = (EditText) view.findViewById(R.id.username);

                    api.Async("GetByID/", text.getText().toString(), new badgerAPI.IApiResultRunnable() {
                        @Override
                        public void run(CMAPIResult apiResult) {
                            if (!apiResult.lmSuccess) {
                                showError(view.getContext(), "User not found", apiResult.lmErrorMessage).show();
                            } else {
                                String badgeuri = apiResult.lmResultDict.optString("badgeuri");

//APPLICATION ERRORS IN FOLLOWING FUNCTION
                                showBadge(view.getContext(), badgeuri);
                            }
                        }
                    });
                }
            })
            .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                }
            });
    ;

    return builder.create();
}

“showBadge”函数非常简单:

private void showBadge(final Context act, String uri){
    Intent intent = new Intent(act, DisplayBadge.class);
    startActivity(intent);
}

我试过几种不同的方法:
获取活动()
();
[类].this(甚至不会编译)
有什么方法可以绕过片段(在活动完成时关闭),并在结果中显示来自函数的视图?
谢谢你!

rlcwz9us

rlcwz9us1#

您的DialogFragent似乎已在异步行程完成时损毁。若要让它正常运作,请从活动(而非DialogFragment)启动异步行程。
因此,在DialogFragment中,只需回调到Activity中的公共方法,该方法将执行繁重的工作(本例中为doPositiveClick()):

public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    LayoutInflater inflater = getActivity().getLayoutInflater();

    final View view = inflater.inflate(R.layout.dialog_lookup, null);

    builder.setView(view)
            .setPositiveButton(R.string.lookup, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    EditText text = (EditText) view.findViewById(R.id.username);

                    //call into the Activity and pass in the name                        
                    ((MainActivity)getActivity()).doPositiveClick(text.getText().toString());

                }
            })
            .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                }
            });

    return builder.create();
}

然后,在调用DialogFragment的Activity中,启动异步进程,并在完成后启动DisplayBadge Activity。
注我已经更改了方法定义和一些代码,因为不再需要传递Context:

public void doPositiveClick(String name) {
   api.Async("GetByID/", name, new badgerAPI.IApiResultRunnable() {
     @Override
     public void run(CMAPIResult apiResult) {
       if (!apiResult.lmSuccess) {
         showError(this, "User not found", apiResult.lmErrorMessage).show();
       } else {
         String badgeuri = apiResult.lmResultDict.optString("badgeuri");

         showBadge(badgeuri);
       }
     }
   });

}

private void showBadge(String uri){
    Intent intent = new Intent(this, DisplayBadge.class);
    startActivity(intent);
}
wwodge7n

wwodge7n2#

一个更简洁的解决方案是在对话框中添加一个接口,就像在回收器适配器中一样。

class YourDialog(val listener: OnReprintClickListener): DialogFragment() {

    interface OnReprintClickListener {
        fun onPostiveClick()
        fun onNegClick()
    }

}

然后在您的活动中实现类

class YourActivity : ReprintDialog.OnReprintClickListener {

    override fun onPositiveClick() {
        enter code here
    }
    override fun onNegClick() {
        enter code here
    }
}

那就做点什么

相关问题