Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安装片段时设置私有变量的静态工厂方法_Android_Android Fragments_Fragment_Factory - Fatal编程技术网

Android 安装片段时设置私有变量的静态工厂方法

Android 安装片段时设置私有变量的静态工厂方法,android,android-fragments,fragment,factory,Android,Android Fragments,Fragment,Factory,我注意到可以执行以下操作: private int mSomeValue; public static MyFragment newInstance(int someValue){ MyFragment myFragment = new MyFragment(); myFragment.mSomeValue = someValue; myFragment.doSth(); return myFragment; } private void doSth(){

我注意到可以执行以下操作:

private int mSomeValue;
public static MyFragment newInstance(int someValue){
    MyFragment myFragment = new MyFragment();
    myFragment.mSomeValue = someValue;
    myFragment.doSth();
    return myFragment;
}
private void doSth(){
    //do sth
}

我的问题如下-这是一种可以接受的方法,例如设置自定义
片段
实例的值或侦听器或任何其他初始状态吗?或者我应该始终使用
setArguments
在创建时传递任何值吗?

是的,您必须始终使用
setArguments
在创建时向片段传递参数

每个片段都必须有一个空构造函数,因此可以 在恢复其活动状态时实例化。这是强烈的 建议子类不要有其他具有 参数,因为当 片段被重新实例化;相反,参数可以由 具有setArguments(Bundle)的调用方,稍后由片段检索 使用getArguments()。

发件人:

Fragment的所有子类都必须包含一个公共的无参数构造函数。框架通常会在需要时重新实例化片段类,特别是在状态恢复期间,并且需要能够找到此构造函数来实例化它。如果无参数构造函数不可用,则在某些情况下,在状态还原期间会发生运行时异常

这基本上意味着,有时系统会破坏您的实例,然后重新创建它(这是您无法控制的!)。因此,您必须遵守以下惯例

Android Studio中的新片段向导创建了两个很好的例子。我将在中跳过代码,然后描述它

public class BlankFragment extends Fragment {

    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    private String mParam1;
    private String mParam2;

    private OnFragmentInteractionListener mListener;

    public static BlankFragment newInstance(String param1, String param2) {
        BlankFragment fragment = new BlankFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    public BlankFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        try {
            mListener = (OnFragmentInteractionListener) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }

        mListener.fragmentAttached(this);
    }

    @Override
    public void onDetach() {
        mListener.fragmentDetached(this);
        super.onDetach();
        mListener = null;
    }
    public interface OnFragmentInteractionListener {
        public void fragmentAttached(BlankFragment fragment);
        public void fragmentDetached(BlankFragment fragment);
    }

}
首先,要创建这个片段的新实例,您可以使用静态newInstance方法,您可以在任何时候使用getArguments()方法检索这些参数。此示例演示如何在onCreate()回调中执行此操作


其次,这个片段要求宿主活动实现一个接口。此示例使该活动有机会在片段连接后立即向其添加任何侦听器或任何它想要的内容,并在片段分离时处理它们。

我坚持使用setArgumentsYes。但在我给出的示例中,我实际上并没有覆盖默认构造函数(或者我是吗?),因此我并没有真正超出指导原则。您无法确定在Android销毁并重新创建片段后,存储在静态变量中的值是否相同。当然,我同意,但是请注意,
mSomeValue
不必是静态的,在我给出的示例中也不是这样调用的。重点是你在片段的特定实例上设置变量和调用方法——该实例可能会被销毁,将来会使用另一个新实例。因为新实例不是以相同的方式创建的,所以新实例从来没有发生过这种情况。是的,这是我多年来一直在做的事情,但在某个点上注意到,您也可以设置,例如,我显示的方式,而无需实际重写或向构造函数传递任何参数。只是想知道为什么这不是一种有效的做事方式。我已经研究了
setArguments
方法,它基本上做了相同的事情(是否?)它设置片段的私有
mBundle
。因为它只影响单个实例-例如,如果旋转设备,您将得到该片段的不同实例。确定。这就是我一直在寻找的答案!谢谢大家!@aldorain:当android销毁并重新创建片段时,片段将丢失“mSomeValue”值。使用joe-s解决方案,在重新创建片段时捆绑包仍然存在。在重新创建片段时,可以再次获取“mSomeValue”(或ARG_PARAM1)。