无法从扩展DialogFragment的类创建默认构造函数,并且我已创建自己的自定义构造函数

时间:2013-10-05 10:26:55

标签: java android android-dialogfragment

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

我有2个类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
}

3 个答案:

答案 0 :(得分:5)

您可以使用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.

答案 1 :(得分:1)

Dialogs的功能相同。 Link 你不能声明自己的构造函数。只需生成对话框的新实例并传递Strings by Arguments。在你的onCreate中,只需使用getArguments()来获取它们.getString(“key”)

希望这有助于你

答案 2 :(得分:1)

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

  

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

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