将片段中的EditText值传递给活动

问题描述:

我在活动中包含的片段中注册表单。在片段中单击提交按钮时,我需要在主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。 –

片言始终是可重复使用的并从其父项活动中独立出来。您的注册表单位于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中它是如何知道它必须对这些值做些什么?我怎么能告诉我的活动“现在你使用这些值并将其添加到数据库” –