2011-06-10 121 views
11

我想点击一个EditText上,并显示对话框日期,所以我尝试单击edittext时是否可能显示对话框消息?

mDateDisplay = (EditText) findViewById(R.id.dateDisplay); 
    mDateDisplay.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (hasFocus) { 
       showDialog(DATE_DIALOG_ID); 
      } 
     } 
    }); 

对话框将显示是否mDateDisplay是一个按钮

,但我想用的EditText

我应该怎么办?

回答

11

使用此:

mDateDisplay.setClickable(true); 
mDateDisplay.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     showDialog(DATE_DIALOG_ID); 
    } 
}); 

或者,你可以使用属性的XML指向一个点击处理函数在你的Activity子类。

+0

它不起作用 – user790156 2011-06-10 05:05:38

+0

mDateDisplay.setClickable(true);因为这个 – user790156 2011-06-10 05:05:51

+0

实际上,它可能不起作用,因为我留下了'if(hasFocus)',从粘贴原始代码遗留下来。我更新了我的代码。如何调用'setClickable'导致它失败? – 2011-06-10 05:10:01

5

因为我已经使用了同样的事情:

sel_date.setClickable(true); 
sel_date.setOnClickListener(new OnClickListener(){ 
     @Override 
     public void onClick(View arg0) { 
      // TODO Auto-generated method stub 
      showDialog(DEFAULTDATESELECTOR_ID); 
     } 
    }); 

和设置选定的日期为EditText上的价值:

private DateSlider.OnDateSetListener mDateSetListener = 
     new DateSlider.OnDateSetListener() { 
      public void onDateSet(DateSlider view, Calendar selectedDate) { 
       // update the dateText view with the corresponding date 
       sel_date.setText(String.format("%te-%tB-%tY", selectedDate, selectedDate, selectedDate).trim()); 
      } 
    }; 

我已经编辑从自定义日期选取器代码的Android:http://blog.codeus.net/dateslider-1-0-an-alternative-datepicker-for-android/

您可以使用EditText替换Button并按上述代码进行操作。

EditText获得焦点时,键盘似乎弹出。为了防止这种情况,设置可聚焦为false:

<EditText 
    ... 
    android:focusable="false" 
    ... /> 

编辑

检查下面的代码:

public class Main extends Activity { 
EditText et1,et2; 
static final int DATE_DIALOG_ID = 0; 
static final int DATE_DIALOG_ID1 = 1; 
private int mYear; 
private int mMonth; 
private int mDay; 

private int mYear1; 
private int mMonth1; 
private int mDay1; 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    et1=(EditText)findViewById(R.id.EditText01); 
    et2=(EditText)findViewById(R.id.EditText02); 

    final Calendar c = Calendar.getInstance(); 
    mYear = c.get(Calendar.YEAR); 
    mMonth = c.get(Calendar.MONTH); 
    mDay = c.get(Calendar.DAY_OF_MONTH); 
    et1.setText("month/year"); 
    et2.setText("month/year"); 
    et1.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      // TODO Auto-generated method stub 
      showDialog(DATE_DIALOG_ID); 
      return false; 
     } 
    }); 

    et2.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      // TODO Auto-generated method stub 
      showDialog(DATE_DIALOG_ID1); 
      return false; 
     } 
    }); 

} 

@Override 
protected Dialog onCreateDialog(int id) { 
    switch (id) { 
    case DATE_DIALOG_ID: 
     return new DatePickerDialog(this, mDateSetListener, mYear, mMonth, 
       mDay); 

    case DATE_DIALOG_ID1: 
     return new DatePickerDialog(this, mDateSetListener1, mYear1, mMonth1, 
       mDay1); 
    } 
    return null; 
} 

// updates the date in the TextView 

private void updateDisplay() { 
    et1.setText(new StringBuilder() 
    // Month is 0 based so add 1 
      .append(mMonth + 1).append("-").append(mYear)); 
} 
private void updateDisplay1() { 

    et2.setText(new StringBuilder() 
    // Month is 0 based so add 1 
      .append(mMonth1 + 1).append("-").append(mYear1)); 
} 
// the callback received when the user "sets" the date in the dialog 
private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() { 
    @Override 
    public void onDateSet(DatePicker view, int year, int monthOfYear, 
      int dayOfMonth) { 
     // TODO Auto-generated method stub 
     mYear = year; 
     mMonth = monthOfYear; 
     mDay = dayOfMonth; 
     updateDisplay(); 
    } 
}; 

private DatePickerDialog.OnDateSetListener mDateSetListener1 = new DatePickerDialog.OnDateSetListener() { 
    @Override 
    public void onDateSet(DatePicker view, int year1, int monthOfYear1, 
      int dayOfMonth1) { 
     // TODO Auto-generated method stub 
     mYear1 = year1; 
     mMonth1 = monthOfYear1; 
     mDay1 = dayOfMonth1; 
     updateDisplay1(); 
    } 
}; 

} 
36

您可以使用OnClickListener事件处理对话框,但禁用android:focusableInTouchMode后像这样的xml文件中的EditText。 例如 - android:focusableInTouchMode="false"

因为当第一次触摸EditText时,它会调用焦点事件,并在第二次触摸时调用click事件,因此必须先禁用焦点事件。

+0

您是否碰巧有更多材料的链接,说明为什么第一次触摸会触发焦点事件,而第二次触摸会触发点击事件?我一直在寻找一篇博文来解释这一点。我如何理解该模式是,如果focusableInTouchMode和clickable被打开,这两个事件都会触发用户触摸给定的视图。 – 2011-08-10 19:33:23

+3

因为焦点和点击是两个不同的事件。焦点发生在元素获得焦点时,这可能是通过键盘上的Next/Back按钮或其他方法。点击是当有人点击(触摸)元素。这种解决方案可以使字段不会被聚焦,因此可以编辑,因为它永远不会有焦点。点击事件仍然触发,因为它已被触摸(无论它是否无法获得焦点)。 – Camsoft 2012-01-30 16:43:57

+1

完美的解决方案! – DonnaLea 2013-07-25 09:39:37

2

这是一个完美的代码,会给你你想要的输出:

public class TextView_Calendar extends Activity { 
EditText et1,et2; 
static final int DATE_DIALOG_ID = 0; 

private int mYear; 
private int mMonth; 
private int mDay; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    et1=(EditText)findViewById(R.id.et1); 

    final Calendar c = Calendar.getInstance(); 
    mYear = c.get(Calendar.YEAR); 
    mMonth = c.get(Calendar.MONTH); 
    mDay = c.get(Calendar.DAY_OF_MONTH); 
    et1.setText("month/year"); 
    et1.setOnTouchListener(new OnTouchListener() 
    { 
     public boolean onTouch(View v, MotionEvent event) 
     { 
      showDialog(DATE_DIALOG_ID); 
      return false; 
     } 
    }); 

} 

@Override 
protected Dialog onCreateDialog(int id) { 
    switch (id) { 
    case DATE_DIALOG_ID: 
     return new DatePickerDialog(this, mDateSetListener, mYear, mMonth, mDay); 
    } 
    return null; 
} 

// updates the date in the TextView 

private void updateDisplay() { 
    et1.setText(new StringBuilder() 
    // Month is 0 based so add 1 
      .append(mDay).append("-").append(mMonth + 1).append("-").append(mYear)); 
} 

// the callback received when the user "sets" the date in the dialog 
private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() { 
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
     mYear = year; 
     mMonth = monthOfYear; 
     mDay = dayOfMonth; 
     updateDisplay(); 
    } 
}; 

} 
0

我有onFocusChangeListener做了以下方法:

mCompleteByEditText =(EditText上)findViewById(R.id。完成); mCompleteByEditText .setOnFocusChangeListener(新OnFocusChangeListener(){

   @Override 
       public void onFocusChange(View v, boolean hasFocus) { 
        if (hasFocus) { 
         DialogFragment newFragment = new TimePickerFragment(); 
         newFragment.show(getSupportFragmentManager(), 
           "timePicker"); 
        } 
       } 
      }); 

hasFocus可变控制电流是否EditText具有焦点或没有。

2

我面临同样的问题。简单地说,为了解决这个问题,我使用了如下代码:

editText.setClickable(true); 
editText.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     // showDialog 
    } 
}); 

在XML:

<EditText 
    ... 
    android:focusableInTouchMode="false" 
/> 

因此,用户无法编辑的EditText,只点击。

相关问题