2011-06-10 54 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,只點擊。

相關問題