【问题标题】:Android fragmentation constructor which take arguments带参数的Android碎片构造函数
【发布时间】:2013-07-10 14:14:39
【问题描述】:

我有扩展 Fragment 的 MyFragment 类。

MyFragment 包含用户可以编辑的不同小部件(视图)。每个小部件的初始值是在构建 MyFragment 片段时计算的。

然后用户可以在之后编辑这些值。

明显的实现是有构造函数: MyFragment(String value1,int value2) { } 设置初始小部件值,然后我只需要实现 onSaveInstanceState 来保存每个小部件的值,因此它们可以通过onCreateView。

简单但有一个问题。我无法向 MyFragment 添加带有参数的构造函数,因为 eclipse/adt 不允许这样做。将 @SuppressLint("ValidFragment") 添加到构造函数中是否安全,或者有更好的方法来处理这个问题?

【问题讨论】:

    标签: android constructor fragment


    【解决方案1】:

    您应该使用Fragment.setArguments(Bundle)。将这些值放在一个 Bundle 中,您可以在调用 onCreateonCreateViewonActivityCreated 时读取它。

    【讨论】:

    • 但问题是每次(重新)创建片段时都会将 setArguments 的输入提供给我的应用程序。我不想那样。只有在构建片段时才能读取该值。
    【解决方案2】:

    或者在 foo 是成员变量的情况下使用它

    public YourFragment newInstance (Foo foo) {
        YourFragment frag = new YourFragment ();
         frag.setFoo (foo);
         return frag;
    }
    
    public void setFoo (Foo foo) {
        this.foo = foo;
    }
    

    【讨论】:

    • 是的,这就是我现在使用的解决方案。但是必须在构造对象时调用 setFoo,并且在任何其他时间更新。所以如果我可以使用构造函数,它会提供更好的代码:}
    【解决方案3】:

    不使用自定义构造函数,而是构建一个静态方法来获取一个新的 MyFragment Instance 并添加一个 Bundle:

    public MyFragment newInstance(String value1, int value2) {
        MyFragment f = new MyFragment();
        Bundle args = new Bundle();
        args.putString("value1",value1);
        args.putInt("value2",value2);
        f.setArguments(args);
        return f;
    }
    

    在 onCreate 中,检索 Bundle 并获取您的值:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        String value1 = getArguments().getString("value1");
        int value2 = getArguments().getInt("value2");
    }
    

    【讨论】:

    • 但是每次创建小部件时都会覆盖任何用户版本。
    猜你喜欢
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 2013-11-07
    相关资源
    最近更新 更多