【问题标题】:Edit text validations in fragments android在片段android中编辑文本验证
【发布时间】:2016-04-07 04:34:37
【问题描述】:

在我的应用程序中,我在主要活动中有导航抽屉,其中包含 3 个片段。如果我单击菜单中的每个项目,则会加载片段。这里每个片段都有许多编辑文本。在第二个片段中,我正在提交表单(第一个片段值+第二个片段字段)。如何验证设置错误的第一个片段编辑文本。

片段事务后,我无法将设置错误设置为第一个片段。我是不是做错了什么。

片段代码如下

FpcDetailsFragment detailsFragment = new FpcDetailsFragment();
  getFragmentManager().beginTransaction().replace(R.id.content_frame, detailsFragment).addToBackStack(null).commit();
            MainActivity.mDrawerLayout.closeDrawer(GravityCompat.START);

【问题讨论】:

    标签: android android-edittext fragment fragmenttransaction


    【解决方案1】:

    对于每个提交设置正确的按钮点击验证如下:

     btn_submit.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        View focusView = null;
                        boolean cancelLogin = false;
                        fname = edt_first_name.getText().toString();
                        lname = edt_last_name.getText().toString();
                        user_email = edt_email.getText().toString();
                        user_phn = edt_primary_contact.getText().toString();
    
    
                        if (TextUtils.isEmpty(fname)) {
                            edt_first_name.setError(getString(R.string.userName_required));
                            focusView = edt_first_name;
                            cancelLogin = true;
                        }
                        if (TextUtils.isEmpty(lname)) {
                            edt_last_name.setError(getString(R.string.userName_required));
                            focusView = edt_last_name;
                            cancelLogin = true;
                        }
    
    
                        if (TextUtils.isEmpty(user_email)) {
                            edt_email.setError(getString(R.string.email_required));
                            focusView = edt_email;
                            cancelLogin = true;
                        } else if (!isValidEmail(user_email)) {
                            edt_email.setError(getString(R.string.invalid_email));
                            focusView = edt_email;
                            cancelLogin = true;
                        }
                        if (TextUtils.isEmpty(user_phn) & !isValidPhone((user_phn))) {
                            edt_primary_contact.setError(getString(R.string.phone_required));
                            focusView = edt_primary_contact;
                            cancelLogin = true;
                        }
                        if (cancelLogin) {
                            // error in login
                            focusView.requestFocus();
                        } else {
                            editProfile();
                        }
    
                    }});
    

    为 chekcs 创建方法:

    private boolean isValidEmail(String email) {
            String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
                    + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
    
            Pattern pattern = Pattern.compile(EMAIL_PATTERN);
            Matcher matcher = pattern.matcher(email);
            return matcher.matches();
        }
    
        private boolean isValidPhone(String pass) {
            return pass != null && pass.length() == 10;
        }
    

    之后,您从第一个片段中获得的值通过以下捆绑发送:

     Fragment fr=new FpcDetailsFragment ();
     FragmentManager fm=getFragmentManager();
     android.app.FragmentTransaction ft=fm.beginTransaction();
     Bundle args = new Bundle();
     args.putString("username", fname+ " "+lname);
     fr.setArguments(args);
     ft.replace(R.id.content_frame, fr);
     ft.commit(); 
    

    要接收数据,请执行以下操作,

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        String strtext = getArguments().getString("username");    
        return inflater.inflate(R.layout.fragment, container, false);
    }
    

    【讨论】:

    • 感谢您的回复。您是否打算在移动到下一个片段时验证每个片段?..但我正在验证仅在片段 2 中提交 frag1 和 frag2 详细信息。如果有任何错误 1 ​​片段 2,我可以在其中显示错误消息(片段 2)。如果片段 1 中有任何错误,我应该移至 farg1 并应该在特定字段上显示错误消息。这里没有显示。
    • @saravanan 是的,您只需验证该特定片段上的值。我发布的代码将完美地用于此目的。
    • 好的,谢谢。但是用户可以通过向前和向后顺序访问片段。每次验证字段时,它都可能会激怒用户。因为我的要求是仅在片段 2 中提交片段 1 和片段 2 值.. 有什么办法吗?.. 问题是在重新加载片段 1 后,我无法在特定字段上设置 setError。如何只调用fragment1而不重新加载它。请
    • @saravanan 在这种情况下,您必须限制用户停留在同一片段上,直到他完成提交。如果您允许他们四处走动,您将很难管理一切。
    • 提交也只会发生在片段二中。您仅从片段一中获取和转发值。
    【解决方案2】:

    我不知道您要验证的信息的性质,但您可以使用包含来自片段 1 和片段 2 的信息的 Singleton 类,当您想提交表单时,您可以简单地从中获取信息类并验证它。

    编辑:

    假设我们有 FragmentA、FragmentB 和一个 Singleton DataBuilder,其中包含来自两个 Fragment 的数据。在 FragmentA 中,您可以将所有数据保存到 DataBuilder 中并将用户导航到 FragmentB。然后在提交数据之前,您必须对其进行验证。如果 FragmentA 的验证为假,只需将用户导航回 FragmentA 并显示一条消息。

    片段A:

    package aero.djetops;
    
    
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    import android.widget.EditText;
    
    public class FragmentA extends Fragment{
    
    private EditText firstInput;
    private EditText secondInput;
    private EditText thirdInput;
    private Button bContinue;
    
    
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragmentA_layout, container, false);
    
        firstInput = (EditText) rootView.findViewById(R.id.first_input);
        secondInput = (EditText) rootView.findViewById(R.id.second_input);
        thirdInput = (EditText) rootView.findViewById(R.id.third_input);
    
    
        // populate the inputs with the data from DataBuilder
        firstInput.setText(DataBuilder.getInstance().getFragmentA_firstInputData());
        secondInput.setText(DataBuilder.getInstance().getFragmentA_secondInputData());
        thirdInput.setText(DataBuilder.getInstance().getFragmentA_thirdInputData());
    
        bContinue.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DataBuilder.getInstance().setFragmentA_firstInputData(firstInput.getText().toString());
                DataBuilder.getInstance().setFragmentA_secondInputData(secondInput.getText().toString());
                DataBuilder.getInstance().setFragmentB_thirdInputData(thirdInput.getText().toString());
    
                FragmentB fragmentB = new FragmentB();
                getFragmentManager().beginTransaction().replace(R.id.content_frame, fragmentB)
                        .addToBackStack(null).commit();
            }
        });
    
    
        return rootView;
    }
    

    }

    片段B:

    package aero.djetops;
    
    
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    import android.widget.EditText;
    
    public class FragmentB extends Fragment{
    
        private EditText firstInput;
        private EditText secondInput;
        private EditText thirdInput;
        private Button bSubmit;
    
    
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragmentB_layout, container, false);
    
            firstInput = (EditText) rootView.findViewById(R.id.first_input);
            secondInput = (EditText) rootView.findViewById(R.id.second_input);
            thirdInput = (EditText) rootView.findViewById(R.id.third_input);
    
    
            // populate the inputs with the data from DataBuilder
            firstInput.setText(DataBuilder.getInstance().getFragmentB_firstInputData());
            secondInput.setText(DataBuilder.getInstance().getFragmentB_secondInputData());
            thirdInput.setText(DataBuilder.getInstance().getFragmentB_thirdInputData());
    
            bSubmit.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    DataBuilder.getInstance().setFragmentB_firstInputData(firstInput.getText().toString());
                    DataBuilder.getInstance().setFragmentB_secondInputData(secondInput.getText().toString());
                    DataBuilder.getInstance().setFragmentB_thirdInputData(thirdInput.getText().toString());
    
                    if(validateDataFragmentA()) {
                        showErrorMessage();
                        FragmentA fragmentA = new FragmentA();
                        getFragmentManager().beginTransaction().replace(R.id.content_frame, fragmentA)
                                .addToBackStack(null).commit();
                        return;
                    } else if(validateDataFragmentB()) {
                        showErrorMessage();
                        return;
                    }
    
                    // everything is ok
                    // submit data here
                }
            });
    
    
            return rootView;
        }
    }
    

    数据构建器:

    package aero.djetops;
    
    public class DataBuilder {
        private static DataBuilder ourInstance = new DataBuilder();
    
        public static DataBuilder getInstance() {
            return ourInstance;
        }
    
        // fragment A
        private String fragmentA_firstInputData;
        private String fragmentA_secondInputData;
        private String fragmentA_thirdInputData;
    
    
        // fragment B
        private String fragmentB_firstInputData;
        private String fragmentB_secondInputData;
        private String fragmentB_thirdInputData;
    
    
        private DataBuilder() {
            fragmentA_firstInputData = "";
            fragmentA_secondInputData = "";
            fragmentA_thirdInputData = "";
            fragmentB_firstInputData = "";
            fragmentB_secondInputData = "";
            fragmentB_thirdInputData = "";
        }
    
    
        /**
         * Clear the data in the builder
         */
        public void clearInputData() {
            fragmentA_firstInputData = "";
            fragmentA_secondInputData = "";
            fragmentA_thirdInputData = "";
            fragmentB_firstInputData = "";
            fragmentB_secondInputData = "";
            fragmentB_thirdInputData = "";
        }
    
    
        // GETTERS and SETTERS
    
        public String getFragmentA_firstInputData() {
            return fragmentA_firstInputData;
        }
    
        public void setFragmentA_firstInputData(String fragmentA_firstInputData) {
            this.fragmentA_firstInputData = fragmentA_firstInputData;
        }
    
        public String getFragmentA_secondInputData() {
            return fragmentA_secondInputData;
        }
    
        public void setFragmentA_secondInputData(String fragmentA_secondInputData) {
            this.fragmentA_secondInputData = fragmentA_secondInputData;
        }
    
        public String getFragmentA_thirdInputData() {
            return fragmentA_thirdInputData;
        }
    
        public void setFragmentA_thirdInputData(String fragmentA_thirdInputData) {
            this.fragmentA_thirdInputData = fragmentA_thirdInputData;
        }
    
        public String getFragmentB_firstInputData() {
            return fragmentB_firstInputData;
        }
    
        public void setFragmentB_firstInputData(String fragmentB_firstInputData) {
            this.fragmentB_firstInputData = fragmentB_firstInputData;
        }
    
        public String getFragmentB_secondInputData() {
            return fragmentB_secondInputData;
        }
    
        public void setFragmentB_secondInputData(String fragmentB_secondInputData) {
            this.fragmentB_secondInputData = fragmentB_secondInputData;
        }
    
        public String getFragmentB_thirdInputData() {
            return fragmentB_thirdInputData;
        }
    
        public void setFragmentB_thirdInputData(String fragmentB_thirdInputData) {
            this.fragmentB_thirdInputData = fragmentB_thirdInputData;
        }
    }
    

    【讨论】:

    • 感谢您的回复。在这里可以轻松完成验证。如果 fragment1 中的验证有任何错误,我应该去那里,我不能在特定的 edittext 字段上设置 setError。
    • @saravanan,您可以再次检查答案。我添加了一个示例,希望对您有所帮助:)
    【解决方案3】:

    getView() 方法返回片段的当前视图。很容易访问那里的元素

    public class SettingFragment extends Fragment implements View.OnClickListener {
    Context context;
    
    Button btnChangePwd, btnDeleteAccount;
    EditText evNewPwd, evConformPwd;
    
    public SettingFragment() {
        // Required empty public constructor
    }
    
    // TODO: Rename and change types and number of parameters
    public static SettingFragment newInstance(Context context) {
        SettingFragment fragment = new SettingFragment();
        fragment.context = context;
        return fragment;
    }
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view =inflater.inflate(R.layout.fragment_setting, container, false);
        evNewPwd = (EditText)view.findViewById(R.id.setting_et_newpwd);
        evConformPwd = (EditText)view.findViewById(R.id.setting_et_repeatpwd);
        btnChangePwd = (Button)view.findViewById(R.id.setting_btn_changepwd);
        btnDeleteAccount = (Button)view.findViewById(R.id.setting_btn_delete);
    
        btnChangePwd.setOnClickListener(this);
        btnDeleteAccount.setOnClickListener(this);
        return view;
    }
    
    @Override
    public void onClick(View v) {
        try {
            switch (v.getId()) {
                case R.id.setting_btn_changepwd:
                    TextView tv = getView().findViewById(R.id.tvName);
                    if(tv.getText().toString().equals("User"))) {
                       Toast.makeText(context,"Match", Toast.LENGTH_LONG).show();
                    }else{
                       tv.setError("error");
                    }
                    break;
            }
        }catch (Exception ex){
            ex.printStackTrace();
        }
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多