【问题标题】:Cannot create a default constructor from a class that extends DialogFragment and I have created my own custom constructor无法从扩展 DialogFragment 的类创建默认构造函数,我创建了自己的自定义构造函数
【发布时间】:2013-10-05 10:26:55
【问题描述】:

我对关于默认构造函数的错误消息有点困惑。

我有两个班级 MainActivityResultDialogMainActivity 中的一些方法会创建一个新对话框并将 2 个字符串传递给 ResultDialog 中的自定义构造函数。

ResultDialog 扩展 DialogFragment。所以我定义了自己的构造函数,但是当出现错误时,我只是创建了一个无参数构造函数,但仍然不允许这样做。

我已经在 SO 上搜索了 abit,但答案有点解释说屏幕旋转可能会破坏并使用默认构造函数重新创建屏幕,但仍然没有回答我如何解决这个问题。

错误是避免片段中的非默认构造函数:使用默认值 构造函数加上 Fragment#setArguments(Bundle) 代替

有人请帮我解决这个问题,我有点困惑。我的ResultDialog 课程的一部分:

  public class ResultDialog extends DialogFragment {

private String message;//to hold the message to be displayed
private String title;//for alert dialog title

//constructor for the dialog passing along message to be displayed in the alert dialog
public ResultDialog(String message,String title){
    this.message = message;
    this.title = title;

}

public ResultDialog(){
    //default constructor
}

【问题讨论】:

  • DialogFragment 类是否有默认构造函数。如果不是,您应该显式调用 super(parametes) 作为自定义 ResultDialog 构造函数的第一行。另外,如果不是这种情况,请提供堆栈跟踪。
  • 我没有运行程序但想先解决错误,但@Raghunandan 的回答有效

标签: java android android-dialogfragment


【解决方案1】:

您可以使用newInstance。检查文档

http://developer.android.com/reference/android/app/Fragment.html

也检查一下

Why do I want to avoid non-default constructors in fragments?

 ResultDialog rd = ResultDialog.newInstance("message","title");

然后

  public static ResultDialog newInstance(String message,String title) {
    ResultDialog f = new ResultDialog();
    Bundle args = new Bundle();
    args.putString("message", message);
    args.putString("title", title);
    f.setArguments(args);
    return f;
}

并使用getArguments() 检索值。

String message = getArguments().getString("message");
String title = getArguments().getString("title");

getArguments()

public final Bundle getArguments ()

Added in API level 11
Return the arguments supplied when the fragment was instantiated, if any.

【讨论】:

  • 工作得非常好,但是对于我使用 args.putString("message",message); 而不是 putInt 的 args。
  • @Manny264 编辑了该部分。从文档示例中复制粘贴。错字错误。有人投了反对票
【解决方案2】:

同样适用于对话框。 Link 您不能声明自己的构造函数。只需生成对话框的新实例并按参数传递字符串。在您的 onCreate 中,只需使用 getArguments().getString("key") 获取它们即可

希望对你有帮助

【讨论】:

    【解决方案3】:

    建议您只使用无参数构造函数,并使用setArguments(Bundle) 方法将数据传递到Fragment,而不是定义单独的构造函数。根据documentation

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

    使用setArguments(Bundle) 后,您可以从Fragment 内部调用getArguments() 来检索数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-23
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多