2015-12-15 76 views
0

目前我沒有太多的片段體驗,所以我希望任何人都可以幫助我!一些一個月前,應用程序釋放細粒編譯之前,現在我有這個問題片段中的默認構造函數

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(); 
     } 
} 
+1

可能的重複[爲什麼我要避免片段中的非默認構造函數?](http://stackoverflow.com/questions/12062946/why-do-i-want-to-avoid-non-default-constructors-in-fragments) –

+2

您使用Intents將活動內容發送到活動。要將東西發送到片段中,請使用Bundle。檢查出Pramod的答案。 – rafid059

回答

0

Every fragment must have an empty constructor, so it can be instantiated when restoring its activity's state. It is strongly recommended that subclasses do not have other constructors with parameters, since these constructors will not be called when the fragment is re-instantiated; instead, arguments can be supplied by the caller with setArguments(Bundle) and later retrieved by the Fragment with 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"); 
+0

也許你可以給我一個例子與我的一段代碼如何我必須改變它? – Frank

+0

@Frank,我已經更新了我的回答 –

+0

嗨thanx,但這不起作用..i我試着用一個空的構造函數,但它然後說它沒有初始化:private final TagClickDialogListener mListener; private final Context mContext; private final Tag [] mTags; – Frank

0

從活動您可以將數據發送到碎片意圖爲:

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); 
    } 

這是對我工作的罰款。這可能會幫助你。

0

如果你正在創建一個片段一個非默認構造函數,你會得到這個錯誤

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

當然,這意味着你必須刪除非默認的構造函數。

我最常做的是

1.使用捆綁來傳遞數據 [除非它是一個對象,在這種情況下,你必須把它序列化]用鑰匙一起,所以,在片段,您可以通過按鍵

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

的片段裏面拿到包,您檢索的參數作爲

getArguments().getType("key"); 

2.但有時我會在Fragment內部創建一個setter方法來設置數據。

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

當我初始化片段,我調用這個方法的時候了。

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