【问题标题】:Handle DialogFragment onClick events in Activity处理 Activity 中的 DialogFragment onClick 事件
【发布时间】:2016-03-17 20:50:40
【问题描述】:

我有一个 Android 应用程序,它有一个 DialogFragment 调用异步进程(在下面的代码示例中称为“api.Async”)。完成后,我想展示另一个活动的结果。我不断收到“片段 [名称] 未附加到活动。”我该如何解决这个问题?完成后,如何向新活动发送信息?

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);
}

我尝试了几种不同的方法:

getActivity()

view.GetContext();

[Class].this(甚至不会编译)

我可以通过哪些方式绕过片段(在活动完成时关闭)并在结果中显示来自函数的视图?

谢谢!

【问题讨论】:

  • 您只能从主(“ui”)线程启动活动。 api.Async 实现是什么样的?

标签: android android-fragments asynchronous


【解决方案1】:

在异步过程完成时,您的 DialogFragent 似乎已被销毁。要使其正常工作,请从 Activity 而不是 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。

注意我已经更改了方法定义和一些代码,因为不再需要传递上下文:

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);
}

【讨论】:

  • 行得通,谢谢!我认为它必须是这样的,但不确定寿命以及如何检查 - 尝试了所有变体,但这个:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 2021-02-05
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
相关资源
最近更新 更多