[テキストの編集]をクリックしてカレンダーを開きたい。その後、ユーザーが編集テキストのカレンダーから選択する日付を設定します。問題は、EditTextを2回目にクリックしてからカレンダーを開くときだけです。問題の解決を手伝ってください(why calendar don't open for the first time
)。
EditText XMLコード
<EditText
Android:id="@+id/dateofBirth"
Android:layout_width="290dp"
Android:layout_height="wrap_content"
Android:layout_marginLeft="5dp"
Android:layout_marginTop="10dp"
Android:maxLines="1"
Android:hint="dd/mm/yyyy" />
アクティビティコード
public void informationPopUp() {
final Dialog dialog= new Dialog(MainActivity.this,R.style.Dialog_Fullscreen);
dialog.setContentView(R.layout.details_dialog);
dateofBirth = (EditText)dialog.findViewById(R.id.dateofBirth);
dialog.show();
myCalendar = Calendar.getInstance();
final DatePickerDialog.OnDateSetListener date = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// TODO Auto-generated method stub
myCalendar.set(Calendar.YEAR, year);
myCalendar.set(Calendar.MONTH, monthOfYear);
myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
updateLabel();
}
};
dateofBirth.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
showDialog(DATE_DIALOG_ID);
}
});
}
private void updateLabel() {
String myFormat = "MM/dd/yy"; //In which you need put here
SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
dateofBirth.setText(sdf.format(myCalendar.getTime()));
}
protected Dialog onCreateDialog(int id) {
final Calendar now = Calendar.getInstance();
switch (id) {
case DATE_DIALOG_ID:
// set date picker as current date
DatePickerDialog _date = new DatePickerDialog(this, date,myCalendar
.get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
myCalendar.get(Calendar.DAY_OF_MONTH)){
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth){
if (year > now.get(Calendar.YEAR))
view.updateDate(myCalendar
.get(Calendar.YEAR), myCalendar
.get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH));
if (monthOfYear > now.get(Calendar.MONTH) && year == now.get(Calendar.YEAR))
view.updateDate(myCalendar
.get(Calendar.YEAR), myCalendar
.get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH));
if (dayOfMonth > now.get(Calendar.DAY_OF_MONTH) && year == now.get(Calendar.YEAR) &&
monthOfYear == now.get(Calendar.MONTH))
view.updateDate(myCalendar
.get(Calendar.YEAR), myCalendar
.get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH));
}
};
return _date;
}
return null;
}
私が間違ったことを理解していない。解決策を提案してください。
私はあなたの問題に対処しようとしますが、最初の理由については完全にはわかりません。
2回目のクリックでのみカレンダーが開くのは、編集テキストを使用しているためです。最初のクリックで、テキストの編集がフォーカスされます。その後、2回目のクリックはonClickListenerのみを呼び出します。
(キーボードを使用して)日付セットを手動で編集することを楽しみにしていない場合、選択した日付を表示するためにTextViewを使用しないのはなぜですか?
コードでDateSetListenerを設定していないため、editTextで日付が更新されないという問題が発生しています。日付が設定されたことをシステムに通知するには、これを設定する必要があります。 DateChangeリスナーは、日付を変更している間のみ日付を返し、EditTextで日付を設定しているようには見えません。
このコードを試してください:
Calendar cal = Calendar.getInstance(TimeZone.getDefault());
DatePickerDialog datePicker = new DatePickerDialog(this,
R.style.AppBlackTheme,
datePickerListener,
cal.get(Calendar.YEAR),
cal.get(Calendar.MONTH),
cal.get(Calendar.DAY_OF_MONTH));
datePicker.setCancelable(false);
datePicker.setTitle("Select the date");
return datePicker;
}
} catch (Exception e) {
showMsgDialog("Exception",
"An error occured while showing Date Picker\n\n"
+ " Error Details:\n" + e.toString(), "OK");
}
return null;
}
private DatePickerDialog.OnDateSetListener datePickerListener = new DatePickerDialog.OnDateSetListener() {
// when dialog box is closed, below method will be called.
public void onDateSet(DatePicker view, int selectedYear, int selectedMonth, int selectedDay) {
String year1 = String.valueOf(selectedYear);
String month1 = String.valueOf(selectedMonth + 1);
String day1 = String.valueOf(selectedDay);
TextView tvDt = (TextView) findViewById(R.id.tvDate);
tvDt.setText(day1 + "/" + month1 + "/" + year1);
}
};
これで、日付をID「tvDate」のTextViewに更新しています。 EditTextの代わりにTextViewを使用することをお勧めし、このコードを試してください。
EditTextを使用して、最初のクリックでカレンダーをロードする必要がある場合は、onClickListnerではなく、onFocusListnerをeditTextに設定してみてください。
editText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus) {
// Show your calender here
} else {
// Hide your calender here
}
}
});
これを編集テキストに追加して、最初のクリックで日付ピッカーを開きます。 Android:focusable="false"
public class MainActivity extends Activity {
private Calendar cal;
private int day;
private int month;
private int year;
private EditText et;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et= (EditText) findViewById(R.id.edittext1);
cal = Calendar.getInstance();
day = cal.get(Calendar.DAY_OF_MONTH);
month = cal.get(Calendar.MONTH);
year = cal.get(Calendar.YEAR);
et.setText(day+"/"+month+"/"+"/"+year);
et.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
DateDialog();
}
});
}
public void DateDialog(){
OnDateSetListener listener=new OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,int dayOfMonth)
{
et.setText(dayOfMonth+"/"+monthOfYear+"/"+year);
}};
DatePickerDialog dpDialog=new DatePickerDialog(this, listener, year, month, day);
dpDialog.show();
}
}
こうするだけです
//Open the DatePicker dialgo in one click and also hide the soft keyboard.
youEditText.setInputType(InputType.TYPE_NULL);
youEditText.requestFocus();
最初にアクティビティでこれらの変数を定義します
import Android.app.AlertDialog;
import Android.app.DatePickerDialog;
import Android.app.TimePickerDialog;
import Android.content.Context;
import Android.content.DialogInterface;
import Android.util.Log;
import Android.view.View;
import Android.widget.DatePicker;
import Android.widget.TimePicker;
import Java.text.DateFormat;
import Java.text.ParseException;
import Java.text.SimpleDateFormat;
import Java.util.Calendar;
import Java.util.Date;
public class MainActivity extends Activity {
private int mYear, mMonth, mDay, mHour, mMinute;
次に、これらのメソッドを使用します。
1)オープンDATEピッカーモーダル用
public void openDatePicker() {
// Get Current Date
final Calendar c = Calendar.getInstance();
mYear = c.get(Calendar.YEAR);
mMonth = c.get(Calendar.MONTH);
mDay = c.get(Calendar.DAY_OF_MONTH);
//launch datepicker modal
DatePickerDialog datePickerDialog = new DatePickerDialog(this,
new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
Log.d(APIContanst.LOG_APP, "DATE SELECTED "+dayOfMonth + "-" + (monthOfYear + 1) + "-" + year);
//PUT YOUR LOGING HERE
//UNCOMMENT THIS LINE TO CALL TIMEPICKER
//openTimePicker();
}
}, mYear, mMonth, mDay);
datePickerDialog.show();
}
2)オープンタイムピッカーモーダル用
public void openTimePicker() {
// Get Current Time
final Calendar c = Calendar.getInstance();
mHour = c.get(Calendar.HOUR_OF_DAY);
mMinute = c.get(Calendar.MINUTE);
//launch timepicker modal
TimePickerDialog timePickerDialog = new TimePickerDialog(this,
new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
Log.d(APIContanst.LOG_APP, "TIME SELECTED "+hourOfDay + "-" + minute + "-");
//PUT YOUR LOGIC HERE
}
}, mHour, mMinute, false);
timePickerDialog.show();
}
また、2つの方法を組み合わせて、日付ピッカーを閉じた後に時間ピッカーを開くこともできます。
これらの関数はプラグインを使用する必要はありません
onCLickListnerの代わりにsetOnFocusChangeListenerを使用してください。次のコードは、同じ目的で使用している例です。
editText_dob.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus){
hideSoftKeyboard(RegisterationActivity.this);
editText_dob.setRawInputType(InputType.TYPE_CLASS_TEXT);
setDate(editText_dob);
}
}
});
EditTextでこれを使用してください
Android:focusable="false"
このコードを試してください100%作品
ONCREATEでこれを書く
et_dob.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDialog(DATE_DIALOG_ID);
}
});
final Calendar calendar = Calendar.getInstance();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
if (et_dob.getText().toString() != null) {
try {
calendar.setTime(df.parse(et_dob.getText().toString()));
} catch (Java.text.ParseException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
mYear = calendar.get(Calendar.YEAR);
mMonth = calendar.get(Calendar.MONTH);
mDay = calendar.get(Calendar.DAY_OF_MONTH);
SimpleDateFormat month_date = new SimpleDateFormat("MMM");
month = month_date.format(calendar.getTime());
} else {
mYear = calendar.get(Calendar.YEAR);
mMonth = calendar.get(Calendar.MONTH);
mDay = calendar.get(Calendar.DAY_OF_MONTH);
SimpleDateFormat month_date = new SimpleDateFormat("MMM");
month = month_date.format(calendar.getTime());
}
if (cal_currentTime.compareTo(calendar) > 0)
updateDisplay();
クラスの残りのコードを貼り付ける
static final int DATE_DIALOG_ID = 1;
private int mYear;
private int mMonth;
private int mDay;
private String month;
private String dateOfBirth;
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DATE_DIALOG_ID:
return new DatePickerDialog(this, mDateSetListener, mYear, mMonth,
mDay);
}
return null;
}
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
switch (id) {
case DATE_DIALOG_ID:
((DatePickerDialog) dialog).updateDate(mYear, mMonth, mDay);
break;
}
}
private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
mYear = year;
mMonth = monthOfYear;
mDay = dayOfMonth;
String dateSetter = (new StringBuilder().append(mYear).append("-")
.append(mMonth + 1).append("-").append(mDay).append(""))
.toString();
final Calendar cal = Calendar.getInstance();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
if (dateSetter != null) {
try {
cal.setTime(df.parse(dateSetter));
} catch (Java.text.ParseException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
SimpleDateFormat month_date = new SimpleDateFormat("MMM");
month = month_date.format(cal.getTime());
}
if (cal_currentTime.compareTo(cal) > 0)
updateDisplay();
else
Toast.makeText(context, "Choose Proper date format",
Toast.LENGTH_SHORT).show();
}
};
テキストを編集するためにロードする
private void updateDisplay() {
dateOfBirth = (new StringBuilder()
// Month is 0 based so add 1
.append(mYear).append("-").append(mMonth + 1).append("-")
.append(mDay).append("")).toString();
et_dob.setText(new StringBuilder()
// Month is 0 based so add 1
.append(mDay).append("-").append(month).append("-")
.append(mYear));
}
Xmlで、focusableをfalseに設定します
Android:focusable="false"
100%作業コード
_implements View.OnClickListener
_を実装する
内部onCreate YourEditText.setOnClickListener(this);
_@Override
public void onClick(View v) {
if (v == YourEditText) {
// Get Current Date
final Calendar c = Calendar.getInstance();
mYear = c.get(Calendar.YEAR);
mMonth = c.get(Calendar.MONTH);
mDay = c.get(Calendar.DAY_OF_MONTH);
DatePickerDialog datePickerDialog = new DatePickerDialog(this,
new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
YourEditText.setText(dayOfMonth + "-" + (monthOfYear + 1) + "-" + year);
}
}, mYear, mMonth, mDay);
datePickerDialog.show();
}
}
_
これをEditText xmlファイルに追加します。
Android:clickable="false"
Android:cursorVisible="false"
Android:focusable="false"
Android:focusableInTouchMode="false">
これにより、テキストビューのように機能します。
まず、xmlにAndroid:focusable="false"
を追加します。 Javaコードでは、イベントのみを設定します。
case R.id.edt_d_o_birth: {
KeyboardUtils.hideSoftKeyboard(this);
Calendar calendar = Calendar.getInstance(Locale.getDefault());
DatePickerDialog datePickerDialog = new DatePickerDialog(RegisterActivity.this,
new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
//todo
}
},calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH));
datePickerDialog.show();
break;
}
これをEditTextに追加してください
Android:editable="false"
Android:focusable="false"
Layout.xmlファイルで、プロパティAndroid:focusable=false
を追加します。これは確実に機能します