java.lang.RuntimeException:无法启动活动ComponentInfo,无法实例化片段,找不到片段构造函数

时间:2018-07-14 13:07:25

标签: java android

  

请查看全部四张图片,前三张图片有错误屏幕,最后一张有Fragment构造函数。

https://i.stack.imgur.com/lbodG.png enter image description here

https://i.stack.imgur.com/nysfG.png enter image description here

https://i.stack.imgur.com/AHYCR.png enter image description here

https://i.stack.imgur.com/telPC.png enter image description here

2 个答案:

答案 0 :(得分:0)

您必须具有Fragment的默认构造函数。

public class Tab1Fragment extends Fragment{

public Tab1Fragment(){
}
...
}

如果要将数据传递到片段,则必须通过 setArguments()进行操作,而不是通过构造函数传递数据,这不是一种好习惯。 而是尝试这样的事情:

public class Tab1Fragment extends Fragment{
    private static final String ARG_URL = "url";
    public Tab1Fragment(){
    }
    public static Tab1Fragment newInstance(String url) {
            Tab1Fragment fragment = new Tab1Fragment();
            Bundle args = new Bundle();
            args.putString(ARG_URL, url);
            fragment.setArguments(args);
            return fragment;
        }
}

并使用片段获取url值

getArguments().getString(ARG_URL);

现在使用newInstance方法获取片段实例。

Tab1Fragment.newInstance("your url");

答案 1 :(得分:0)

如@Mangal所述,一个Fragment必须具有默认(无参数)构造函数。要将数据传递到新片段,请使用静态函数,例如

public static MyFragment newInstance(String someData) {
    MyFragment fragment = new MyFragment ();
    Bundle args = new Bundle();
    args.putString("someData", someData);
    fragment.setArguments(args);
    return fragment;
}

并像这样检索数据

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    Bundle args = getArguments();
    String someData = "";
    if( args != null ) {
        someData = args.getString("someData", "");
    }
}

然后,而不是调用

new MyFragment(data);

在创建片段的代码中,您应该调用

MyFragment.getInstance(data);