如何将数据从片段传递到对话框片段

Posted

技术标签:

【中文标题】如何将数据从片段传递到对话框片段【英文标题】:How to pass data from a fragment to a dialogFragment 【发布时间】:2013-07-11 10:49:40 【问题描述】:

我知道之前有人问过这个问题,但我不太明白如何实现它。 我有一个片段“myFragment”,我在其中创建了一个“myDialogueFragment”的对象。 当我从 myFragment 调用它时,我想将一些值传递给 myDialogueFragment。 我有一个整数 num,我想将它传递给 myDialogueFragment 并将该数字与来自 myDialogueFragment 的其他一些信息一起存储在本地数据库中。

我可能弄错了,但我看到的所有代码都是关于将数据从 myDialogueFragment 发送回 myFragment,这并不是我真正想要的。

static MyDialogFragment newInstance(int num) 

MyDialogFragment f = new MyDialogFragment();

// Supply num input as an argument.
Bundle args = new Bundle();
args.putInt("num", num);
f.setArguments(args);

return f;
  

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    mNum = getArguments().getInt("num");
    ...

因此,此代码获取 myFragment onCreate() 方法中的参数。我想在 myFragment() 中发送参数并在 myDialogueFragment 中接收它们。

我怎样才能做到这一点?

【问题讨论】:

你的代码不能完全达到你想要的吗?您的 DialogFragment 中有 mNum,您可以在 DialogFragment 的整个生命周期中使用它, num 在 Fragment 中而不在 DialogFragment 中,我想在 DialogFragment 中传递 num 并从那里检索它 DialogFragment 扩展了 Fragment,你可以在它的 onCreate() 中做同样的事情。 嗯,我还没有这样想过,让我试试,所以你告诉我,我可以使用相同的,但在 onCreateDialog().. 【参考方案1】:

您需要在片段上设置参数如下:

Bundle args = new Bundle();
args.putString("key", "value");
DialogFragment newFragment = new YourDialogFragment();  
newFragment.setArguments(args);
newFragment.show(getSupportFragmentManager(), "TAG");

您现在要做的就是在片段中捕获这些参数并使用它们...

在对话片段中,您会这样读...

Bundle mArgs = getArguments();
String myValue = mArgs.getString("keyUsed to send it...");

【讨论】:

等等,我需要读取 DialogueFragment 内部的参数,而不是 Fragment 内部的参数?会是同样的程序吗? 你需要在DialogFragment中读取数据,你是在Fragment中传递数据,在DialogFragment中读取... 谢谢你的大写【参考方案2】:

我在扩展为 ActivityFragment 的 calss 中调用 FragmentDialog

//TODO 1
                Followers clickedObj = (Followers) 

                parent.getItemAtPosition(position);
                Bundle bundle = new Bundle();
                bundle.putString("name", clickedObj.getFollow_name());
                bundle.putString("nick", clickedObj.getFollow_nickname());
                bundle.putString("score", clickedObj.getFollow_score());
                bundle.putString("title", clickedObj.getFollow_title());
                FragmentManager fragmentManager = getSupportFragmentManager();
                UserPopUp userPopUp = new UserPopUp();
                //TODO 1
                userPopUp.setArguments(bundle);
                userPopUp.show(fragmentManager, "followers");

我在课堂上的 onActivityCreated 上调用了它,它扩展到了 DialogFragment

@Override
    public void onActivityCreated(Bundle savedInstanceState) 
        super.onActivityCreated(savedInstanceState);

        //Bundle Data Cekme başlangıç
        Bundle mArgs = getArguments();
        String userName = mArgs.getString("name");
        String userNickName = mArgs.getString("nick");
        String userTitle = mArgs.getString("title");
        String userScore = mArgs.getString("score");
        user_name.setText(userName);
        nick_name.setText(userNickName);
        challenge_title.setText(userTitle);
        user_score.setText(userScore);
        // bitiş

    

效果不错

【讨论】:

【参考方案3】:

两个 Fragment 永远不应该直接通信。

片段之间通信的推荐方式是创建一个共享的 ViewModel 对象。两个片段都可以通过其包含的 Activity 访问 ViewModel。 Fragments 可以更新 ViewModel 中的数据,如果使用 LiveData 公开数据,只要它正在从 ViewModel 观察 LiveData,新状态就会被推送到另一个 Fragment。

如果您无法使用共享 ViewModel 在 Fragment 之间进行通信,您可以使用接口手动实现通信流。然而,这最终需要更多的工作来实现,并且不容易在其他 Fragment 中重用。

for more information

【讨论】:

【参考方案4】:

我扩展了一个 DialogFragment。而已。现在确实你不能在构造函数中传递任何参数(你也可以通过实例化一个 newInstance 静态函数来解决这个问题),但你绝对可以使用 getter/setter 添加成员变量。现在您可以非常轻松地为您的对话框提供所需的一切。

【讨论】:

这并没有提供问题的答案。一旦您有足够的声誉,您就可以对任何帖子发表评论;相反,提供不需要提问者澄清的答案。

以上是关于如何将数据从片段传递到对话框片段的主要内容,如果未能解决你的问题,请参考以下文章

自定义对话框片段内的进度条 - 如何从 AsyncTask 传递进度?

如何将数据从 BottomSheetDialogFragment 返回到父片段

将字符串从对话框片段返回到活动 [重复]

在片段中我想点击如何显示警告对话框

对话框片段包始终为空

从底部工作表对话框片段中获取价值