片段

时间:2015-12-15 07:36:36

标签: android android-fragments

目前我没有太多关于片段的经历,所以我希望任何人都可以帮助我!在应用程序发布之前一个月前编译好了,现在我遇到了这个问题

Android Studio说: “问题避免在片段中没有默认构造函数。”

我希望有人可以帮我解决这个问题。

public  static  class TagClickDialog extends DialogFragment {
      private final TagClickDialogListener mListener;
      private final Context mContext;
      private final Tag[] mTags;

      public TagClickDialog(Context context, TagClickDialogListener listener, Tag[] tags) {
            mListener = listener;
            mContext = context;
            mTags = tags;
       }

       @Override
       public Dialog onCreateDialog(Bundle savedInstanceState) {
            String[] dialogItems = new String[mTags.length];
            for (int i=0; i<mTags.length; i++) {
                 dialogItems[i] = mTags[i].getValue();
            }
            AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
            builder.setTitle(getResources().getString(R.string.tags))
                    .setItems(dialogItems, new DialogInterface.OnClickListener() {
                  public void onClick(DialogInterface dialog,
                                int which) {
                       mListener.onTagClick(mTags[which]);
                  }
             });
             return builder.create();
       }
}

3 个答案:

答案 0 :(得分:0)

  

每个片段都必须有一个空的构造函数,所以它可以   在恢复其活动状态时实例化。这是强烈的   建议子类没有其他构造函数   参数,因为这些构造函数不会被调用   片段被重新实例化;相反,参数可以由。提供   调用者使用setArguments(Bundle),然后由Fragment检索   使用getArguments()。

由于这个原因,当我们需要该片段newInstance()的实例时,我们有静态工厂方法,以防您希望它实例化一些信息。

check this out

<强>更新 你可以使用以下代码

public  static  class TagClickDialog extends DialogFragment {
    private TagClickDialogListener mListener;
    private Context mContext;
    private Tag[] mTags;

public TagClickDialog() {

}

**update**
@Override
public void onAttach(Context context) {
super.onAttach(context);
mListener = (TagClickDialogListener )context;
}

public static TagClickDialog newInstance(Context context, Tag[] tags) {

    mContext = context;
    mTags = tags;
    return this;
}

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        String[] dialogItems = new String[mTags.length];
        for (int i=0; i<mTags.length; i++) {
            dialogItems[i] = mTags[i].getValue();
        }
        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
        builder.setTitle(getResources().getString(R.string.tags))
            .setItems(dialogItems, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog,
                        int which) {
                    mListener.onTagClick(mTags[which]);
                }
            });
        return builder.create();
    }
}

}

这就是你如何使用它

TagClickDialog fragment = TagClickDialog.newInstance("put all the parameters");
fragment.show(fragmentManager, "some tag");

答案 1 :(得分:0)

从活动中,您可以将数据发送到Fragment,意图为:

Bundle bundle = new Bundle();
bundle.putString("message", "message is hi");
//set Fragmentclass Arguments
Fragmentclass fragobj=new Fragmentclass();
fragobj.setArguments(bundle);

并在片段onCreateView方法中接收片段:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {

    // get message from activity        
    String strtext=getArguments().getString("message");

    return inflater.inflate(R.layout.fragment, container, false);
    }

这对我来说很好。这可能会对你有帮助。

答案 2 :(得分:0)

如果要为片段创建非默认构造函数,则会出现此错误

Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead.

当然这意味着您必须删除非默认构造函数。

我通常做的事情

<强> 1。使用Bundle传递数据 [除非它是一个Object,在这种情况下你必须序列化它]和一个键,这样在Fragment中你可以通过键获得Bundle

Bundle args = new Bundle();
args.putLong("key", value);
fragment.setArguments(args);

在Fragment中,您将参数检索为

getArguments().getType("key");

<强> 2。但有时我会在Fragment中创建一个setter方法来设置数据。

public void setData(int value) {
    this.value = value;
}

当我初始化片段时,我立即调用此方法。

MyFragment fragment = new MyFragment();
fragment.setData(5);