【问题标题】:Fragments inheritance with newInstance pattern使用 newInstance 模式的片段继承
【发布时间】:2016-01-15 13:31:34
【问题描述】:

使用 newInstance 模式进行片段继承的正确方法是什么?

例如,如果我们有一个片段 MyFragment 继承自另一个具有 newInstance 模式的片段 SuperFragment --> https://stackoverflow.com/a/28855715/5125212

public class SuperFragment extends Fragment{
    public static SuperFragment newInstance(int var1, boolean var2){
        SuperFragment fragment = new SuperFragment();
        Bundle b = new Bundle();
        b.putInt("my_var1", var1);
        b.putBoolean("my_var2", var2);
        fragment.setArguements(b);
        return fragment
    }
// All other methods
}

这会在“super”上出错:

public class MyFragment extends SuperFragment{
    public static MyFragment newInstance(int var1, boolean var2){
        return super.newInstance(int var1, var2);
    }
// All other methods
}

这会在构造函数上出错,因为我们应该避免使用非默认构造函数:

public class MyFragment extends SuperFragment{
    public MyFragment(int var1, boolean var2){
        newInstance(var1, var2);
    } 
// All other methods
}

我发现这没有任何错误,但我不喜欢它,因为它似乎是递归的:

public class MyFragment extends SuperFragment{
    public static SuperFragment newInstance(int var1, boolean var2){
        return newInstance(var1,var2);
    }
}

【问题讨论】:

    标签: android performance android-fragments inheritance fragment


    【解决方案1】:

    找到它!

    超级片段:

    public class SuperFragment extends Fragment{
        public static Bundle setArgs(int var1, boolean var2){
            Bundle b = new Bundle();
            b.putInt("my_var1", var1);
            b.putBoolean("my_var2", var2);
            return b;
        }
    // All methods you want in the super fragment, so they will be in the 
    // inherit fragment too
    }
    

    继承片段:

    public class MyFragment extends SuperFragment{
        public static MyFragment newInstance(int var1, boolean var2){
            MyFragment fragment = new MyFragment();
            fragment.setArguments(setArgs(var1,var2));
            return fragment;
        }
    // All other methods that you only want them on the inherit (this)     
    // fragment
    }
    

    【讨论】:

    • 这甚至无法编译,因为您试图返回 SuperFragment 而不是 MyFragment...
    【解决方案2】:

    您不必创建重载的构造函数。你将你的数据传递给newInstanace(var1, var2),然后你这样做:

    public static MyFragment newInstance(int var1, int var2)
    {
      MyFragment fragment = new MyFragment(); // default constructor by android system
      Bundle b = new Bundle();
      b.putInt("my_var1", var1);
      b.putInt("my_var2", var2);
    
    fragment.setArguements(b);
    
    return fragment
    }
    

    然后在onCreateView

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            Bundle arguments = getArguments();
            int var1 = arguments.getInt("my_var1", 0);
    

    更新

    由于无法覆盖静态方法,因此无法使用 newInstance 模式进行继承。而且,如果你没有默认构造函数,重载默认构造函数会是编译时错误

    【讨论】:

    • 感谢 Mustansar Saeed,但我正在讲述带有 newInstance 模式的片段的继承。
    • 在我看来不能像 static 方法 can't be overriden 那样继承 newInstance 模式
    • 我没有说任何关于覆盖方法的内容...再次检查问题,我对其进行编辑。也许现在很容易理解。谢谢
    猜你喜欢
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多