android – 如何从EditText正确触发datePicker和验证?

android – 如何从EditText正确触发datePicker和验证?,第1张

概述我正在尝试对editText字段进行一些验证,请允许我详细说明,因为我使用了一堆在stackOverflow中都有自己问题的概念,但我感觉我正在尝试做的还没有回答他们中的任何一个,这是相当基本的东西,所以要么我搞砸了,要么我发现了一个错误,而且,许多流行的问题和答案都是几年之久…… 我有两个Edittext字段,其中包含从datepicker输入的初始日期和终止日期,我验证在datepicker输 我正在尝试对editText字段进行一些验证,请允许我详细说明,因为我使用了一堆在stackOverflow中都有自己问题的概念,但我感觉我正在尝试做的还没有回答他们中的任何一个,这是相当基本的东西,所以要么我搞砸了,要么我发现了一个错误,而且,许多流行的问题和答案都是几年之久……

我有两个Edittext字段,其中包含从datepicker输入的初始日期和终止日期,我验证在datepicker输入终止日期后,此日期发生在初始日期之后,如果不是它使用setError显示错误.

到目前为止一切都那么好,我设法做到了这一切,但有些事困扰着我:

当我第一次点击EditText时它什么也没做(因为我在XML中使用了setinputType(inputType.TYPE_NulL)和androID:focusableIntouchMode =“true”;为了避免向我显示键盘,所以它点击,选择,没有键盘,但也没有datepicker,直到你再次点击,然后onClick方法触发datepicker,所有工作按预期工作.)

我打算给你看图像,但我没有代表点:/

如果我使用setFocusable(false),会发生奇怪的事情,当setError出现时,只显示没有文本的图标.

如果我不使用setFocusable(false),则editText会在活动开始时显示为已选中(因为我禁用了输入而没有光标闪烁)并且保持选中状态(它保持蓝色但你可以点击任意位置)

如果我不想在开始时选择它,我在父布局的XML中使用androID:focusableIntouchMode =“true”,根据这个问题的建议(Stop EditText from gaining focus at Activity startup)并解决了这个问题.但我有第一次点击,没有任何事情发生第二次点击,再次显示datepicker问题…我做错了什么.

<linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"    androID:orIEntation="vertical" androID:layout_wIDth="match_parent"    androID:background="#FFFFFF"    androID:layout_height="match_parent"    androID:gravity="center_vertical"        androID:ID="@+ID/fechasalariolayout"    androID:focusableIntouchMode="true">
<EditText    androID:layout_wIDth="wrap_content"    androID:layout_height="wrap_content"    androID:textAlignment="center"    androID:inputType="date"    androID:ems="10"    androID:gravity="center_horizontal"    androID:onClick="showDatePickerDialogFT"    androID:ID="@+ID/fechaterminacioninpt"    androID:layout_weight="10"    androID:layout_gravity="center_horizontal" />
public class fechaSalario extends ActionBaractivity {    private button calcularbtn;    static EditText fechaingresoinpt,fechaterminacioninpt,salarioinpt;    public static boolean isFechaInicial,isFechaTerminacion = false;    private RadioGroup sueldoPeriodo,salarioMin;    @OverrIDe    protected voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //Remove Title bar        this.requestwindowFeature(Window.FEATURE_NO_Title);        //Remove notification bar        this.getwindow().setFlags(WindowManager.LayoutParams.FLAG_FulLSCREEN,WindowManager.LayoutParams.FLAG_FulLSCREEN);        //set content vIEw AFTER ABOVE sequence (to avoID crash)        this.setContentVIEw(R.layout.fechasalario);        calcularbtn = (button) findVIEwByID(R.ID.calcularbtn);        fechaingresoinpt = (EditText) findVIEwByID(R.ID.fechaingresoinpt);        fechaterminacioninpt = (EditText) findVIEwByID(R.ID.fechaterminacioninpt);        salarioinpt = (EditText) findVIEwByID(R.ID.salarioinpt);        sueldoPeriodo = (RadioGroup)findVIEwByID(R.ID.sueldoperiodo);        salarioMin = (RadioGroup) findVIEwByID(R.ID.salariomin);        fechaterminacioninpt.setinputType(inputType.TYPE_NulL);        //fechaterminacioninpt.setFocusable(false);        //OnChangeTxtListener        fechaterminacioninpt.addTextChangedListener(new TextWatcher() {            @OverrIDe            public voID onTextChanged(CharSequence s,int start,int before,int count) {                // Todo auto-generated method stub            }            @OverrIDe            public voID beforeTextChanged(CharSequence s,int count,int after) {                // Todo auto-generated method stub            }            @OverrIDe            public voID afterTextChanged(Editable s) {                // Todo auto-generated method stub                fechaterminacioninpt.setError(null);                valIDarFechaTerminacion(fechaterminacioninpt,fechaingresoinpt); // pass your EditText Obj here.            }        });    }    @OverrIDe    public boolean onCreateOptionsMenu(Menu menu) {        return super.onCreateOptionsMenu(menu);    }    @OverrIDe    public boolean onoptionsItemSelected(MenuItem item) {        return super.onoptionsItemSelected(item);    }    public voID onClickCalcular(VIEw vIEw) {        //Llamar a una funcion calcular que llame a un activity para desplegar.        // Enviar BUNDLE        //Verificar que los datos hayan sIDo introducIDos correctamente.        //verificar fechas y cantIDades válIDas.        //verificar que todos los radio buttons esten seleccionados        Intent intent = new Intent(this,calcular.class);        Bundle variables = new Bundle();        variables = getIntent().getExtras();        Radiobutton sueldoperiodo =  (Radiobutton)this.findVIEwByID(sueldoPeriodo.getCheckedRadiobuttonID());        Radiobutton salariomin =  (Radiobutton)this.findVIEwByID(salarioMin.getCheckedRadiobuttonID());        //valIDar Fecha inicial menor a fecha de terminación        variables.putString("FECHA_INICIO",String.valueOf(fechaingresoinpt.getText()));        variables.putString("FECHA_TERMINACION",String.valueOf(fechaterminacioninpt.getText()));        variables.putString("SALARIO",String.valueOf(salarioinpt.getText()));        variables.putString("SUELDO_PERIodo",sueldoperiodo.getText().toString());        variables.putString("SALARIO_MIN",salariomin.getText().toString());        intent.putExtras(variables);        startActivity(intent);    }    public voID valIDarFechaTerminacion(EditText edt,EditText edt2){        DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy");        DateTime fechaInicio = formatter.parseDateTime(String.valueOf(fechaingresoinpt.getText()));        DateTime fechaTerm = formatter.parseDateTime(String.valueOf(fechaterminacioninpt.getText()));        if (fechaInicio.isAfter(fechaTerm)){           /* fechaterminacioninpt.requestFocus();*/            fechaterminacioninpt.setError("La fecha de terminación ocurre antes que la fecha de inicio");        }        else{            // Do nothing            fechaterminacioninpt.setonFocuschangelistener(new VIEw.OnFocuschangelistener() {                @OverrIDe                 public voID onFocusChange(VIEw v,boolean hasFocus){                    fechaterminacioninpt.setError(null);                }            });        }        //valIDar cantIDad es un numero monetario válIDo        //valIDar cantIDad es un numero entero válIDo        // valIDar radio buttons han sIDo seleccionados.    }    public voID showDatePickerDialogFI(VIEw v) {        isFechaInicial = true;        isFechaTerminacion = false;        DialogFragment newFragment = new DatePickerFragment();        newFragment.show(getFragmentManager(),"datePicker");    }    public voID showDatePickerDialogFT(VIEw v) {        isFechaTerminacion = true;        isFechaInicial = false;        DialogFragment newFragment = new DatePickerFragment();        newFragment.show(getFragmentManager(),"datePicker");    }}
解决方法 我有一个关于错误信息和可聚焦性的类似“问题”.如果textVIEw不可聚焦,则不显示该消息.我想这就是它的工作原理,例如:如果您有许多经过验证的字段,并且每个字段都出现验证错误,则仅显示包含光标的textVIEw的消息.

在应用程序中,我按照您的方式使用时间和日期选择器.我有textVIEws验证但不具有焦点.我的布局看起来像这样:

<linearLayout    androID:ID="@+ID/time"    androID:layout_wIDth="match_parent"    androID:layout_height="wrap_content"    androID:layout_marginleft="10dp"    androID:layout_marginRight="10dp"    androID:layout_margintop="10dp"    androID:background="@drawable/Box_bg"    androID:orIEntation="horizontal">    <TextVIEw        androID:layout_wIDth="wrap_content"        androID:layout_height="wrap_content"        androID:paddingRight="13dp"        androID:text="@string/start_time" />    <EditText        androID:ID="@+ID/editText_start_time"        androID:layout_wIDth="match_parent"        androID:layout_height="wrap_content"        androID:layout_marginRight="10dp"        androID:layout_weight="1"        androID:focusable="false"        androID:inputType="none"        androID:onClick="showTimePicker" />    <TextVIEw        androID:layout_wIDth="wrap_content"        androID:layout_height="wrap_content"        androID:paddingleft="10dp"        androID:paddingRight="13dp"        androID:text="@string/end_time" />    <EditText        androID:ID="@+ID/editText_end_time"        androID:layout_wIDth="match_parent"        androID:layout_height="wrap_content"        androID:layout_marginRight="10dp"        androID:layout_weight="1"        androID:focusable="false"        androID:inputType="none"        androID:onClick="showTimePicker" /></linearLayout>

也许这将解决你的问题,textVIEws自动获得焦点.如果没有,请告诉我们,我们会解决一些问题.

[编辑]
这是我正在使用的另一个代码片段:

<tableRow    androID:ID="@+ID/tablerow"    androID:layout_marginBottom="3dp"    androID:layout_margintop="3dp"    androID:background="@drawable/Box_bg"    androID:baselineAligned="false">    <TextVIEw        androID:ID="@+ID/text_vIEw_birthday"        androID:layout_wIDth="wrap_content"        androID:layout_height="wrap_content"        androID:layout_column="0"        androID:layout_gravity="center_vertical"        androID:layout_span="1"        androID:text="@string/birthday" />    <EditText        androID:ID="@+ID/text_birthday"        androID:layout_wIDth="match_parent"        androID:layout_height="wrap_content"        androID:layout_column="1"        androID:layout_gravity="center_vertical"        androID:cursorVisible="false"        androID:editable="false"        androID:focusable="false"        androID:focusableIntouchMode="false"        androID:inputType="date|textNoSuggestions"        androID:layout_weight="1"        androID:layout_span="2" /></tableRow>
总结

以上是内存溢出为你收集整理的android – 如何从EditText正确触发datePicker和验证?全部内容,希望文章能够帮你解决android – 如何从EditText正确触发datePicker和验证?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1125477.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存