2017-04-08 96 views
1

我在活動中包含的片段中註冊表單。在片段中單擊提交按鈕時,我需要在主Activity中實現一個函數。通過執行此行:將片段中的EditText值傳遞給活動

android:onClick="signUp" 

它直接進入活動。但我怎樣才能得到片段值?這很複雜,因爲我的碎片沒有任何想法,因爲我在同一個地方切換了不同的碎片。

我的嘗試:

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View v = inflater.inflate(R.layout.fragment_sign_up, container, false); 
    email =(EditText) v.findViewById(R.id.emailEt); 
    mListener.setEmail(email.getText().toString()); 
    pass1 = (EditText) v.findViewById(R.id.passEt1); 
    mListener.setPass1(pass1.getText().toString()); 
    pass2 = (EditText) v.findViewById(R.id.passEt2); 
    mListener.setPass2(pass2.getText().toString()); 
    pseudo = (EditText) v.findViewById(R.id.pseudoEt); 
    mListener.setPseudo(pseudo.getText().toString()); 
    signup =(Button) v.findViewById(R.id.signUpB); 

    return v; 
} 

public interface OnFragmentInteractionListener { 
    // TODO: Update argument type and name 
    void onSignUpFragmentInteraction(Uri uri); 
    public void setEmail(String email); 
    public void setPass1(String pass1); 
    public void setPass2(String pass2); 
    public void setPseudo(String pseudo); 
} 

然後在我的活動:

@Override 
public void setEmail(String email) { 

} 

@Override 
public void setPass1(String pass1) { 

} 

@Override 
public void setPass2(String pass2) { 

} 

@Override 
public void setPseudo(String pseudo) { 

} 

@Override 
public void onLoginFragmentInteraction(Uri uri) { 

} 

但我不知道現在該做什麼...

+0

你可以通過在一個片段中有一個接口並在你的活動中實現它,這看起來像你做的。如果是的話,你有什麼問題? –

+0

我編輯過,我現在沒有如何獲取值 –

+0

https://developer.android.com/training/basics/fragments/communicating.html 這就是你所需要知道的。如果您想在用戶輸入時獲取editText值,請使用TextWatcher。 –

回答

2

片言始終是可重複使用的並從其父項活動中獨立出來。您的註冊表單位於Fragment中,因此您可以讀取Fragment實例中的所有值。在片段中定義OnClickListener,而不是在Activity中。您可以在Fragment中進行驗證和數據處理,然後將所有值傳遞給Fragment的父Activity。一個很好的方法是在Fragment中定義一個接口並在Activity中實現它。 See here

該接口將有一個像bool signUp(String username, String email, String password)這樣的方法。若要從片段調用這個方法,你必須參考保持強制轉換爲界面的父活動:

private OnFragmentInteractionListener mCallback; 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 

    // This makes sure that the container activity has implemented 
    // the callback interface. If not, it throws an exception 
    try { 
     mCallback = (OnFragmentInteractionListener) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() 
       + " must implement OnFragmentInteractionListener"); 
    } 
} 

隨着該引用,你可以調用接口的方法:

public void signUp(View v) { 
    // get your values here 
    mCallback.signUp(...); 
} 

如果您用Fragment中的onClick定義膨脹佈局,確保在Fragment中實現該方法。

+0

現在我重寫了我的活動中的「bool signUp(字符串用戶名,字符串電子郵件,字符串密碼)」功能。什麼時候會被叫? –

+0

@BaptisteArnaud更新了我的答案 –

+0

我很抱歉,但我仍然不明白這一點:我點擊註冊按鈕,我在Fragment類中獲取值並將其傳遞給接口的方法。那麼在我的Activity中它是如何知道它必須對這些值做些什麼?我怎麼能告訴我的活動「現在你使用這些值並將其添加到數據庫」 –

相關問題