当前位置: 首页 > 知识库问答 >
问题:

从DialogFragment到Fragment调用时未触发回调函数

龙德义
2023-03-14

现在我有:-

1) 1活动,它是从AppCompactActivity扩展而来的主要活动。

2) 1扩展自fragment的类,这是从主活动(1)-ProfileTeacherActivity调用的片段。java

3) 1个从DialogFragment扩展的fragment类,此对话框从fragment(2)-ModalBox调用。java

所以,基本上,这只是一个简单的执行流程。开始时,显示主活动(1)的应用程序具有具有几个链接的抽屉作为配置文件链接的示例,当单击此链接时,应用程序调用片段(2)显示配置文件的详细信息。单击编辑按钮后,应用程序将调用包含一些EditText用于编辑用户配置文件的对话框(3)

我想实现的是,在编辑用户配置文件并成功保存到数据库后,我试图将用户数据发送回片段(2),只是为了显示最新更新的信息,但不幸的是,它没有起作用。

以下是我的尝试:

1)在DialogFraank中创建接口(3)-ModalBox.java

public class ModalBox extends DialogFragment{

   ....
   public interface EditProfileModalBoxInterface {
     void onFinishEditProfile( HashMap<String, String> dataPassing );
   }
   ...
   ...
}

2)在DialogFraank里面我也有. setPositiveButton函数为OK按钮。-ModalBox.java

public class ModalBox extends DialogFragment{
   ...       
   ...
   public Dialog onCreateDialog(Bundle savedInstanceState ) {
      ...
      builder
        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(final DialogInterface dialog, int id) {
               // At here i'm using retrofit2 http library
               // to do updating stuff
               // and inside success's callback of retrofit2(asynchronous)
               // here i call the below function to send data 
               // dataToSend is a HashMap value
               sendBackResultToParent( dataTosend );
            }
        })
         .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                // User cancelled the dialog
            }
        });
      .....
   }

   // Function called inside success's callback of retrofit2
   public void sendBackResultToParent( HashMap<String, String> data ) {
      // instantiated interface
      EditProfileModalBoxInterface ls=(EditProfileModalBoxInterface)getTargetFragment();
      // declaring interface's method
      ls.onFinishEditProfile( data );
   }
}

3)最后,我实现了那些接口里面片段(2)-ProfileTeacherActivity.java

public class ProfileTeacherActivity extends Fragment 
       implements ModalBox.EditProfileModalBoxInterface{

    public View onCreateView(LayoutInflater inflater, 
                   ViewGroup container, Bundle savedInstanceState ) {
       .....
       .....
    }

    // At here the interface's method did't triggered
    @Override
    public void onFinishEditProfile( HashMap dataPassedFromDialog ) {
      Toast.makeText(getActivity(), "Testing...." , Toast.LENGTH_LONG).show();
    }

}

我现在感到困惑的是,只有当我调用这个函数时,问题才会发生inside Reform2 success的回调,在其外部调用时会触发。我认为这是由调用的异步导致的。如果我可以使用Promise或类似的东西,或者是否有任何解决方法?

以下现有解决方案在我的情况下不起作用:

  • 从DialogFragment回调片段

如果上述用例不够清楚或误解,请向我询问更多输入。谢谢你的帮助。问候。

共有3个答案

邹博明
2023-03-14

从架构的角度来看,两个片段不应该直接相互通信。容器活动应该负责在其子片段之间传递数据。所以我会这样做:

在容器活动中实现接口,只需将活动中的接口实现附加到对话框类,并在需要时调用该接口方法。类似这样:

    public static class ModalBox extends DialogFragment {

    EditProfileModalBoxInterface mListener;

    // Container Activity must implement this interface
    public interface EditProfileModalBoxInterface {
     void onFinishEditProfile( HashMap<String, String> dataPassing );
   }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (EditProfileModalBoxInterface) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement EditProfileModalBoxInterface");
        }
    }
}

然后调用mListener。onFinishEditProfile(..) 在DialogFragment类中需要它的地方。

这样,您将在活动类中收到返回的结果,从中可以调用所需片段的相关方法,将结果传递给该片段。

这里已经描述了整个流程

谷梁煌
2023-03-14

考虑使用eventBus,例如Otto

用法非常简单。您需要做的就是创建一个evenbus:

public static Bus bus = new Bus(ThreadEnforcer.MAIN);  //use Dagger2 to avoid static

然后创建一个接收方方法(在您的案例中,在片段2中):

@Subscribe
public void getMessage(String s) {
  Toast.makeText(this, s, Toast.LENGTH_LONG).show();
}

通过致电(来自DialigFrament)向您发送消息:

bus.post("Hello");

不要忘记在(片段的)onCreate方法中注册eventBus:

bus.register(this);

就是这样!

阙弘博
2023-03-14

这是一个示例DialogFragment,用于向所选联系人发送消息。我还需要捕获DialogFragment上的click事件并重定向。

理想的实现这一点这是需要做的

  • 覆盖AlertDialog的正/负按钮点击。生成器,不执行任何操作
  • 之后,使用getButton方法提及AlertDialog。按钮\u否定或警报对话框。按钮\u正并分配操作
public class SMSDialogFrag extends DialogFragment {

    private static String one="one";
    private EditText messageContent;
    private AlertDialog dialog;
    private String mobNumber;

    public static SMSDialogFrag showDialog(String mobNumber){
        SMSDialogFrag customDialogFrag=new SMSDialogFrag();
        Bundle bundle=new Bundle();
        bundle.putString(one, mobNumber);
        customDialogFrag.setArguments(bundle);
        return customDialogFrag;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
        View view = getActivity().getLayoutInflater().inflate(R.layout.sms_dialog, null);

        alertDialogBuilder.setView(view);
        setupUI(view);
        alertDialogBuilder.setTitle("");

        alertDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //Do nothing here because we override this button later
            }
        });
        alertDialogBuilder.setPositiveButton("Send", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //Do nothing here because we override this button later
            }
        });
        dialog = alertDialogBuilder.create();
        dialog.show();
        dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
                //else dialog stays open. Make sure you have an obvious way to close the dialog especially if you set cancellable to false.
            }
        });
        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendMessage();//IN YOUR USE CASE YOU CAN REDIRECT TO YOUR CALLER FRAGMENT

            }
        });

        return dialog;
    }
    void setupUI(View view){
        TextView textViewMob=(TextView)view.findViewById(R.id.mobNumber);
        messageContent=(EditText)view.findViewById(R.id.messageContent);
        mobNumber=getArguments().getString(one);
        textViewMob.setText("Send message to : "+mobNumber);
    }
    void sendMessage(){
        if( ! TextUtils.isEmpty(messageContent.getText())){
            try {
                SmsManager smsManager = SmsManager.getDefault();
                Log.v(Constants.UI_LOG,"Number >>>>>>> "+mobNumber);
                smsManager.sendTextMessage(mobNumber, null, messageContent.getText().toString(), null, null);
            } catch (Exception e) {
                e.printStackTrace();
            }
            Toast.makeText(getActivity(),"Message Sent!",Toast.LENGTH_SHORT).show();
            dialog.dismiss();
        }else{
            Toast.makeText(getActivity(),"Please enter message to send!",Toast.LENGTH_SHORT).show();
        }
    }
}
 类似资料:
  • 问题内容: 我想显示一个灯箱,其内容由ng-show显示,但是我不知道如何触发灯箱JS。我正在寻找类似的东西 问题答案: 我认为,最好监视绑定ng- show的模型。 这是示例: 和小提琴

  • 我有个奇怪的问题引起了冲突。我不得不切换到本机的来修复它,但是它有bug。 我最初的问题是:我有一个带有要在我的一个片段中请求权限,我调用提示显示得很好,但当我接受或拒绝权限时,什么也不会发生。从不调用回调。相反,它在我的片段所附加的活动中被调用。对我无用,我需要回调在片段中工作。 考虑到这一点,我被告知需要使用,但这只适用于,因此我将导航抽屉更改为使用本机片断,而不是使用v4支持库片断。但是,因

  • 问题内容: 我有一个简单的程序,其中显示了一些项目的列表,单击其中的一个后,单击的项目将传递回附件。当用户取消对话框时,我还想执行一些默认处理(使用 后退按钮 )-更具体地说,在这种情况下,我想向活动传递一个空字符串。 但是,如果将对话框放在(来自 兼容性包 )中, 则使用后退按钮关闭对话框时不会调用 。我究竟做错了什么? 问题答案: 这可能与您的代码中没有显式调用的事实有关。该OnCancelL

  • 从我的中,每个项目中都有多个按钮,我想要的是在单击,并在单击。 问题是我不知道如何才能或如何才能实现一个回调时被点击,并可以执行不同的方法或操作根据什么按钮是点击每个项目。 在我的适配器类上 这是我的DialogFragment类

  • 我的要求: 发现错误: 在这一行中..为什么值不显示在mainfragment中??

  • 那么DialogFragments有什么特别之处呢?为什么在显示对话框时没有暂停调用片段?又如何实现呢? 我在文档中没有发现任何关于这种行为的引用,所以引用是一个加号。