将EditText值从Fragment传递到Activity

时间:2017-04-08 13:38:40

标签: android android-studio android-fragments

我在活动中包含的片段中有一个注册表单。我需要在片段中单击提交按钮时在主Activity中实现一个函数。通过实施这一行:

android:onClick="signUp"

直接进入活动。但是我怎样才能获得Fragment值?它很复杂,因为我的片段没有想法,因为我在同一个地方切换了不同的片段。

我尝试了什么:

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) {

}

但我现在不知道该怎么做......

1 个答案:

答案 0 :(得分:2)

片段应该始终可以从其父Activity中重复使用和独立。您的注册表单位于片段中,因此您可以读取Fragment实例中的所有值。在片段中定义OnClickListener,而不是在Activity中定义。您可以在Fragment中进行验证和数据处理,然后将所有值传递给Fragment的父Activity。一个很好的方法是在Fragment中定义一个接口并在Activity中实现它。 See here

接口将有bool signUp(String username, String email, String password)之类的方法。要从Fragment中调用此方法,您必须保留对您的父活动强制转换为接口的引用:

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

如果使用片段中的onClick定义来扩充布局,请确保在片段中实现该方法。