25

我知道之前有人问过这个问题,但我不太明白如何实现它。我有一个片段“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 中接收它们。

我怎样才能做到这一点?

4

4 回答 4

57

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

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...");
于 2013-07-12T19:31:30.257 回答
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ş

    }

效果很好

于 2016-07-22T14:44:23.823 回答
0

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

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

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

了解更多信息

于 2019-09-02T13:51:31.603 回答
0

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

于 2020-05-20T01:35:23.410 回答