【问题标题】:Opening DatePicker in EditText click not showing at first click在 EditText 中打开 DatePicker 单击第一次单击时不显示
【发布时间】:2017-09-15 05:36:32
【问题描述】:

点击EditText 时,我正在努力打开DatePicker。它仅在第二次单击时打开日期选择器。我已经检查了以下选项,但没有任何效果。我在这里用 XML 给出了我的代码请建议我解决这个问题。几乎我正在尽最大努力。

<---XML content--->
<EditText
      android:id="@+id/p_date_edt"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"                                
      android:layout_marginBottom="@dimen/margin_10dp"
      android:ems="8"
      android:hint="@string/dateTime"
      android:focusableInTouchMode="false" />

我的 java 代码在这里:

pDateEdt = (EditText) view.findViewById(R.id.p_date_edt);
pDateEdt.setFocusable(false);
pDateEdt.setOnClickListener(this);
      ----

pDateEdt.setOnClickListener(new View.OnClickListener() {

       @Override
       public void onClick(View v) {
           datePicker();

       }
});

【问题讨论】:

  • 我也有同样的问题。
  • 虽然切换到 onTouchListener 会起作用,但正确的方法是使用按钮,并将其样式设置为类似于 editText。

标签: java android datepicker android-edittext


【解决方案1】:

请使用setOnTouchListener 而不是setOnClickListener。 请使用以下代码:

pDateEdt.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                switch (event.getAction()){
                    case MotionEvent.ACTION_DOWN:

                         datePicker();

                        break;
                }

                return false;
            }
        });

请删除这行代码:

pDateEdt.setOnClickListener(this);

【讨论】:

    【解决方案2】:

    试试这个,它会在单击edittext上起作用

    MainActivity.java

    public class MainActivity extends AppCompatActivity {
    
        private DatePickerDialog mDatePickerDialog;
        private EditText edDate;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            edDate = (EditText) findViewById(R.id.activity_ed_date);
    
            setDateTimeField();
            edDate.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    mDatePickerDialog.show();
                    return false;
                }
            });
        }
    
        private void setDateTimeField() {
    
            Calendar newCalendar = Calendar.getInstance();
            mDatePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
    
                public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                    Calendar newDate = Calendar.getInstance();
                    newDate.set(year, monthOfYear, dayOfMonth);
                    SimpleDateFormat sd = new SimpleDateFormat("dd-MM-yyyy");
                    final Date startDate = newDate.getTime();
                    String fdate = sd.format(startDate);
    
                    edDate.setText(fdate);
    
                }
            }, newCalendar.get(Calendar.YEAR), newCalendar.get(Calendar.MONTH), newCalendar.get(Calendar.DAY_OF_MONTH));
            mDatePickerDialog.getDatePicker().setMaxDate(System.currentTimeMillis());
    
        }
    }
    

    activity_main.xml

    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.demoapp.MainActivity">
    
        <EditText
            android:id="@+id/activity_ed_date"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:focusable="false"
            android:hint="Date"
            android:imeOptions="actionNext"
            android:maxLength="30" />
    
        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@color/colorPrimary" />
    
    </android.support.constraint.ConstraintLayout>
    

    【讨论】:

      【解决方案3】:

      EditText不听OnClickListener,改用OnTouchListener,就可以了。

      pDateEdt.setOnTouchListener(new View.OnTouchListener() {
          @Override
          public boolean onTouch(View v, MotionEvent event) {                
              datePicker();
              return false;
          }
      });
      

      或者,如果您想使用OnClickListener,请使用以下方法:

      <EditText
          android:text="@+id/EditText01"
          android:id="@+id/EditText01"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:focusableInTouchMode="false" />
      

      【讨论】:

      • 只是 android:focusableInTouchMode="false",为我工作
      【解决方案4】:

      我看到很多程序员都在努力实现这个功能,就像你正在尝试的那样。 现在在您的场景中发生的情况是,当您第一次触摸 Edittext 时,edittext 将进入焦点模式,而当您第二次触摸相同的 edittext 时,只有 onClick 中的方法,即 datePicker() 将执行。 所以你应该做的只是删除android:focusableInTouchMode="false" 标签 并在此标签的位置添加标签android:focusable="false" 并在您的 java 代码中执行以下操作

      pDateEdt = (EditText) view.findViewById(R.id.p_date_edt);
      pDateEdt.setOnClickListener(this);
      @Override
      public void onClick(View v) {
          datePicker();
      }
      

      我希望您的代码能够正常工作,并让您在第一次触摸时打开日期选择器。

      【讨论】:

        【解决方案5】:

        这是使用日期选择器最简单的方法。只需添加两个变量

        private DatePickerDialog datePickerDialog;
        EditText etJoiningDate;
        
        etJoiningDate=(EditText)findViewById(R.id.etJoiningDate);
        
            etJoiningDate.setOnTouchListener(new View.OnTouchListener() {
        
                @Override
                public boolean onTouch(View v, MotionEvent event) {
        
                    switch (event.getAction()){
                        case MotionEvent.ACTION_DOWN:
        
                            final Calendar cldr = Calendar.getInstance();
                            int day = cldr.get(Calendar.DAY_OF_MONTH);
                            int month = cldr.get(Calendar.MONTH);
                            int year = cldr.get(Calendar.YEAR);
                            // date picker dialog
                            datePickerDialog = new DatePickerDialog(TestActivity.this,
                                    new DatePickerDialog.OnDateSetListener() {
                                        @Override
                                        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                                            etJoiningDate.setText(dayOfMonth + "/" + (monthOfYear + 1) + "/" + year);
                                        }
                                    }, year, month, day);
                            datePickerDialog.show();
        
                            break;
                    }
        
        
                    return false;
                }
        
        
            });
        

        【讨论】:

          【解决方案6】:

          可能是解决此问题的最佳和最简单的方法:

          在布局文件中,为 EditText 设置这些属性

          android:clickable="true"
          android:longClickable="false"
          android:focusable="false"
          

          【讨论】:

            猜你喜欢
            • 2018-08-17
            • 2013-02-27
            • 2015-09-02
            • 1970-01-01
            • 2017-05-04
            • 1970-01-01
            • 2012-09-02
            • 1970-01-01
            • 2013-04-20
            相关资源
            最近更新 更多