2011-06-10 8 views
11

quiero hacer clic en un EditarTexto y la fecha de diálogo mostrar así que trato¿Es posible que al hacer clic en edittext aparezca un mensaje de diálogo?

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); 
      } 
     } 
    }); 

El diálogo mostrará si mDateDisplay es un botón

pero quiero utilizar EditarTexto

¿qué debería hacer?

Respuesta

11

Utilice esta:

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

Alternativamente, se puede utilizar el atributo en el XML para que apunte a la función de clic de manejo en la subclase de actividad.

+0

no funciona – user790156

+0

mDateDisplay.setClickable (true); debido a esto – user790156

+0

En realidad, probablemente no funcionó porque me quedaba en 'if (hasFocus)', que quedó de pegar tu código original. Actualicé mi código ¿Cómo está llamando 'setClickable' causando que falle? –

5

Por lo mismo que yo he utilizado:

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

y para establecer la fecha seleccionada como valor de EditarTexto:

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()); 
      } 
    }; 

He editado el código de encargo Selector de fecha en Android: http://blog.codeus.net/dateslider-1-0-an-alternative-datepicker-for-android/

Puede reemplazar el Botón con Editar Texto y hacer lo mismo que el código anterior.

El teclado parece aparecer cuando el EditText gana foco. Para evitar esto, establezca enfocable false:

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

Editado

Compruebe el siguiente código:

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

Puede utilizar OnClickListener de eventos para controlar el cuadro de diálogo, pero después de desactivar el android:focusableInTouchMode de EditText en el archivo xml como este. por ejemplo, android:focusableInTouchMode="false".

Porque cuando EditText se toca por primera vez llama al evento de enfoque y al segundo toque, llama al evento de clic, por lo que primero debe desactivar el evento de enfoque.

+0

¿Tiene un enlace a más material sobre por qué el primer toque desencadenará el evento de enfoque y el segundo toque disparará el evento de clic? He estado buscando una publicación de blog para explicar esto. Cómo entendería el patrón es que si se activan EnTouchMode enfocable y se puede hacer clic en él, ambos eventos se dispararían en un usuario que toque una vista determinada. –

+3

Porque Focus y Click son dos eventos diferentes. El enfoque ocurre cuando el elemento recibe el foco, esto puede ser a través de los botones Siguiente/Atrás en el teclado u otro método. Click es cuando alguien hace clic (toca) el elemento. Esta solución evita que el campo sea enfocable y, por lo tanto, editable, ya que nunca tendrá foco. El evento Click aún se dispara porque ha sido tocado (independientemente de que no pueda recibir el foco). – Camsoft

+1

solución perfecta! – DonnaLea

2

Este es el código perfecto que le dará la salida que desee:

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

lo hice con un onFocusChangeListener la siguiente manera:

mCompleteByEditText = (EditarTexto) findViewById (R.id. terminación); mCompleteByEditText .setOnFocusChangeListener (nueva OnFocusChangeListener() {

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

Los hasFocus variable controla si la corriente EditText tiene el foco o no.

2

que se enfrentaron a un problema similar.Para ser simple, con el fin de resolver ese, he utilizado el código de seguimiento:

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

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

En XML:

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

Por lo tanto, el usuario no puede editar el EditarTexto, solamente haga clic en él.

Cuestiones relacionadas