【问题标题】: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()..

标签: android arguments fragment


【解决方案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 添加成员变量。现在您可以非常轻松地为您的对话框提供所需的一切。

      【讨论】:

      • 这并没有提供问题的答案。一旦您有足够的声誉,您就可以对任何帖子发表评论;相反,提供不需要提问者澄清的答案。
      猜你喜欢
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 2013-07-31
      相关资源
      最近更新 更多