
我有两个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和验证?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)