如何在android中将值从活动传递到片段

时间:2014-06-16 15:46:17

标签: android

如何从活动中获取值(String),然后在Fragment中使用它? 发生错误

fragment.java

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    String strtext = getArguments().getString("edttext");
    View rootView = inflater.inflate(R.layout.fragment_user_info,
            container, false);

    return rootView;
}

activity.java

Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
UserInfoFragment fragobj = new UserInfoFragment();
fragobj.setArguments(bundle);

2 个答案:

答案 0 :(得分:1)

这就是您当前代码中发生的事情:

  1. 您创建片段

  2. onCreateView()方法中,您可以获得参数

  3. 您可以在“活动”中设置参数。

  4. 换句话说,您在之前调用了参数,并设置了它们。根据Fragment Documentation,您应该使用静态方法来实例化Fragments。它看起来像下面这样。

    在Fragment类中,添加此代码

    /**
     * Create a new instance of UserInfoFragment, initialized to
     * show the text in str.
     */
    public static MyFragment newInstance(String str) {
        MyFragment f = new MyFragment();
    
        // Supply index input as an argument.
        Bundle args = new Bundle();
        args.putString("edttext", str);
        f.setArguments(args);
    
        return f;
    }
    

    现在,在您的活动中,执行以下操作:

    //Bundle bundle = new Bundle();
    //bundle.putString("edttext", "From Activity");
    //UserInfoFragment fragobj = new UserInfoFragment();
    //fragobj.setArguments(bundle);
    
    UserInfoFragment fragobj = UserInfoFragment.newInstance("From Activity");
    

    请注意,现在,您甚至不需要创建一个Bundle并在Activity类中设置它,它由静态newInstance()方法处理。

答案 1 :(得分:1)

错误是NullPointerException,是吗?

这是因为你读了参数(在片段的构造函数中):

String strtext = getArguments().getString("edttext");
分配之前

(在片段的构造函数调用之后的活动中):

fragobj.setArguments(bundle);

保持构造函数简单。最佳解决方案是根据本指南https://stackoverflow.com/a/9245510/2444099创建静态工厂方法newInstance(String edttext),如下所示:

public static UserInfoFragment newInstance(String edttext) {
    UserInfoFragment myFragment = new UserInfoFragment();

    Bundle args = new Bundle();
    args.putInt("edttext", edttext);
    myFragment.setArguments(args);

    return myFragment;
}

然后在需要获取新的片段实例时使用此工厂方法而不是构造函数。