私はAndroidプラットフォームにまったく慣れておらず、開発プロセスを学びながらアプリケーションを構築してきました。
現在、2つの日付ピッカーをデプロイする必要があるアクティビティに取り組んでいます。 1つは「開始日」で、もう1つは「終了日」です。 Android開発者ページはこちら: http://developer.Android.com/resources/tutorials/views/hello-datepicker.html でDatePickerチュートリアルをフォローしています。 ==
1つのDatePickerに対して、それは問題なく機能します。
今私の問題は、2番目の日付ピッカーのプロセス全体を複製すると、エミュレーターとハンドセットで問題なく表示されることです。ただし、どのボタンを押して日付を選択しても、最初のTextViewのみが更新され、2番目のTextViewは現在の日付を表示し続けます。
コードは次のとおりです。
package com.datepicker;
import Java.util.Calendar;
import Android.app.Activity;
import Android.app.DatePickerDialog;
import Android.app.Dialog;
import Android.os.Bundle;
import Android.view.View;
import Android.widget.Button;
import Android.widget.DatePicker;
import Android.widget.TextView;
public class datepicker extends Activity {
private TextView mDateDisplay;
private TextView endDateDisplay;
private Button mPickDate;
private Button endPickDate;
private int mYear;
private int mMonth;
private int mDay;
static final int START_DATE_DIALOG_ID = 0;
static final int END_DATE_DIALOG_ID = 0;
/** Called when the activity is first created. */
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/* capture our View elements for the start date function */
mDateDisplay = (TextView) findViewById(R.id.startdateDisplay);
mPickDate = (Button) findViewById(R.id.startpickDate);
/* add a click listener to the button */
mPickDate.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showDialog(START_DATE_DIALOG_ID);
}
});
/* get the current date */
final Calendar c = Calendar.getInstance();
mYear = c.get(Calendar.YEAR);
mMonth = c.get(Calendar.MONTH);
mDay = c.get(Calendar.DAY_OF_MONTH);
/* display the current date (this method is below) */
updateStartDisplay();
/* capture our View elements for the end date function */
endDateDisplay = (TextView) findViewById(R.id.enddateDisplay);
endPickDate = (Button) findViewById(R.id.endpickDate);
/* add a click listener to the button */
endPickDate.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showDialog(END_DATE_DIALOG_ID);
}
});
/* get the current date */
final Calendar c1 = Calendar.getInstance();
mYear = c1.get(Calendar.YEAR);
mMonth = c1.get(Calendar.MONTH);
mDay = c1.get(Calendar.DAY_OF_MONTH);
/* display the current date (this method is below) */
updateEndDisplay();
}
private void updateEndDisplay() {
endDateDisplay.setText(
new StringBuilder()
// Month is 0 based so add 1
.append(mMonth + 1).append("-")
.append(mDay).append("-")
.append(mYear).append(" "));
}
private void updateStartDisplay() {
mDateDisplay.setText(
new StringBuilder()
// Month is 0 based so add 1
.append(mMonth + 1).append("-")
.append(mDay).append("-")
.append(mYear).append(" "));
}
/ *ユーザーが開始日関数のダイアログで日付を「設定」したときに受信するコールバック* /
private DatePickerDialog.OnDateSetListener mDateSetListener =
new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
mYear = year;
mMonth = monthOfYear;
mDay = dayOfMonth;
updateStartDisplay();
}
};
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case START_DATE_DIALOG_ID:
return new DatePickerDialog(this,
mDateSetListener,
mYear, mMonth, mDay);
}
return null;
}
/* the callback received when the user "sets" the date in the dialog for the end date function */
private DatePickerDialog.OnDateSetListener endDateSetListener =
new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
mYear = year;
mMonth = monthOfYear;
mDay = dayOfMonth;
updateStartDisplay();
}
};
protected Dialog onCreateDialog1(int id) {
switch (id) {
case END_DATE_DIALOG_ID:
return new DatePickerDialog(this,
endDateSetListener,
mYear, mMonth, mDay);
}
return null;
}
}
コードに必要な変更についてアドバイスしてください。
2つの別々のDatePickerダイアログを作成する必要があります
2人のリスナーを作る
int from_year, from_month, from_day,to_year, to_month, to_day; //initialize them to current date in onStart()/onCreate()
DatePickerDialog.OnDateSetListener from_dateListener,to_dateListener;
それらを実装します...
from_dateListener = new OnDateSetListener(){
public void onDateSet(DatePicker arg0, int arg1, int arg2, int arg3) {
...
}
}
};
to_dateListener = new OnDateSetListener(){
public void onDateSet(DatePicker arg0, int arg1, int arg2, int arg3) {
.....
}
};
両方の個別のダイアログを作成する
int DATE_PICKER_TO = 0;
int DATE_PICKER_FROM = 1;
@Override
protected Dialog onCreateDialog(int id) {
switch(id){
case DATE_PICKER_FROM:
return new DatePickerDialog(this, from_dateListener, from_year, from_month, from_day);
case DATE_PICKER_TO:
return new DatePickerDialog(this, to_dateListener, to_year, to_month, to_day);
}
return null;
}
新しいダイアログタイプを追加せずに、無制限の数の日付フィールドを許可するソリューションがあります。ユーザーがボタンの1つをクリックすると、DatePickerDialogを起動する前に、現在変更されているTextViewとカレンダーを登録します。次に、ダイアログのOnDateSetListenerは、登録されたTextViewとカレンダーを更新します。
import Java.util.Calendar;
import Android.app.Activity;
import Android.app.DatePickerDialog;
import Android.app.Dialog;
import Android.app.DatePickerDialog.OnDateSetListener;
import Android.os.Bundle;
import Android.view.View;
import Android.widget.Button;
import Android.widget.DatePicker;
import Android.widget.TextView;
public class MultiDatePickerActivity extends Activity {
private TextView startDateDisplay;
private TextView endDateDisplay;
private Button startPickDate;
private Button endPickDate;
private Calendar startDate;
private Calendar endDate;
static final int DATE_DIALOG_ID = 0;
private TextView activeDateDisplay;
private Calendar activeDate;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.multidatepicker);
/* capture our View elements for the start date function */
startDateDisplay = (TextView) findViewById(R.id.startDateDisplay);
startPickDate = (Button) findViewById(R.id.startPickDate);
/* get the current date */
startDate = Calendar.getInstance();
/* add a click listener to the button */
startPickDate.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showDateDialog(startDateDisplay, startDate);
}
});
/* capture our View elements for the end date function */
endDateDisplay = (TextView) findViewById(R.id.endDateDisplay);
endPickDate = (Button) findViewById(R.id.endPickDate);
/* get the current date */
endDate = Calendar.getInstance();
/* add a click listener to the button */
endPickDate.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showDateDialog(endDateDisplay, endDate);
}
});
/* display the current date (this method is below) */
updateDisplay(startDateDisplay, startDate);
updateDisplay(endDateDisplay, endDate);
}
private void updateDisplay(TextView dateDisplay, Calendar date) {
dateDisplay.setText(
new StringBuilder()
// Month is 0 based so add 1
.append(date.get(Calendar.MONTH) + 1).append("-")
.append(date.get(Calendar.DAY_OF_MONTH)).append("-")
.append(date.get(Calendar.YEAR)).append(" "));
}
public void showDateDialog(TextView dateDisplay, Calendar date) {
activeDateDisplay = dateDisplay;
activeDate = date;
showDialog(DATE_DIALOG_ID);
}
private OnDateSetListener dateSetListener = new OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
activeDate.set(Calendar.YEAR, year);
activeDate.set(Calendar.MONTH, monthOfYear);
activeDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);
updateDisplay(activeDateDisplay, activeDate);
unregisterDateDisplay();
}
};
private void unregisterDateDisplay() {
activeDateDisplay = null;
activeDate = null;
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DATE_DIALOG_ID:
return new DatePickerDialog(this, dateSetListener, activeDate.get(Calendar.YEAR), activeDate.get(Calendar.MONTH), activeDate.get(Calendar.DAY_OF_MONTH));
}
return null;
}
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
super.onPrepareDialog(id, dialog);
switch (id) {
case DATE_DIALOG_ID:
((DatePickerDialog) dialog).updateDate(activeDate.get(Calendar.YEAR), activeDate.get(Calendar.MONTH), activeDate.get(Calendar.DAY_OF_MONTH));
break;
}
}
}
この種の柔軟性は、実行時まで必要な日付ピッカーの数がわからないアプリケーションで役立ちます。
Adamのオプションを少し軽量な解釈に拡張し、潜在的により有用なものにするために、ダイアログ要求をインスタンス化する要素IDのint参照を維持し、最後のイベントハンドラーでそれを参照することにしました。これには、複数の日付入力があるが、それぞれまたはそれぞれのグループに特定のフォーマットが必要な場合に、このメソッドのswitchステートメントにうまく適合するという追加の利点があります。以下のすべてのスニペットは、私のアクティビティクラスに直接含まれています
private static final int DIALOG_DATE_PICKER = 100;
private int datePickerInput;
@Override
public Dialog onCreateDialog(int id)
{
switch(id) {
case DIALOG_DATE_PICKER:
final Calendar c = Calendar.getInstance();
DatePickerDialog dialog = new DatePickerDialog(this, dateSetListener, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH));
return dialog;
}
return null;
}
private OnClickListener datePickerListener =
new OnClickListener()
{
@Override
public void onClick(View v)
{
datePickerInput = v.getId();
showDialog(DIALOG_DATE_PICKER);
}
};
private DatePickerDialog.OnDateSetListener dateSetListener =
new DatePickerDialog.OnDateSetListener()
{
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth)
{
switch( datePickerInput ) {
case R.id.datePicker1:
((EditText) findViewById( datePickerInput ))
.setText(...);
...
break;
case R.id.datePicker2:
...
break;
default:
...
break;
}
}
};
mainActivityで次のようにブール変数を作成するだけです::
private boolean startDateOrEndDAte = true;
次に、このようなボタンのリスナーをこのようにし、evreyボタンの変数の値を変更します::
DialogFragment datePicker = new DatePickerFragment();
attendDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
datePicker.show(getSupportFragmentManager(),"Date Picker");
startOrEnd = true ;
}
});
leaveDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
datePicker.show(getSupportFragmentManager(),"Date Picker");
startOrEnd = false ;
}
});
次に、onDateSetメソッドに次のようなifステートメントを追加します::
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month);
c.set(Calendar.DAY_OF_MONTH, dayOfMonth);
String date = DateFormat.getDateInstance().format(c.getTime());
attendDate = findViewById(R.id.attend_date);
leaveDate = findViewById(R.id.leave_date);
if (startOrEnd) {
attendDate.setText(date);
} else {
leaveDate.setText(date);
}
}
よりクリーンな解決策を見つけたと思います。これは、Googleのアドバイスと、ここで読んだコメントを組み合わせたものです。私の場合、Viewpagerのフラグメントから呼び出された場合でも機能します。基本的に、ここで定義されているように、フラグメントからピッカーダイアログを呼び出すときに、引数のバンドルをダイアログフラグメントに渡します: Android:フラグメントにデータ(エクストラ)を渡す 次に、バンドル値をDialogFragmentクラスを選択し、その値をオンにします。
これが私のフラグメントコードからの私のstartDateボタンとendDateボタンの両方の2つのリスナーです:
mWylStartDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Bundle bundle = new Bundle();
bundle.putInt("DATE",1);
DialogFragment newFragment = new DatePickerFragment();
newFragment.setArguments(bundle);
newFragment.show(getFragmentManager(), "datePicker");
}
});
mWylEndDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Bundle bundle = new Bundle();
bundle.putInt("DATE",2);
DialogFragment newFragment = new DatePickerFragment();
newFragment.setArguments(bundle);
newFragment.show(getFragmentManager(), "datePicker");
}
});
これが私のDatePickerFragmentクラスです
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener
{
static final int START_DATE = 1;
static final int END_DATE = 2;
private int mChosenDate;
int cur = 0;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
// Use the current date as the default date in the picker
final Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
Bundle bundle = this.getArguments();
if (bundle != null)
{
mChosenDate = bundle.getInt("DATE", 1);
}
switch (mChosenDate)
{
case START_DATE:
cur = START_DATE;
return new DatePickerDialog(getActivity(), this, year, month, day);
case END_DATE:
cur = END_DATE;
return new DatePickerDialog(getActivity(), this, year, month, day);
}
return null;
}
@Override
public void onDateSet(DatePicker datePicker, int year, int month, int day)
{
if (cur == START_DATE)
{
// set selected date into textview
Log.v("Date Début", "Date1 : " + new StringBuilder().append(month + 1)
.append("-").append(day).append("-").append(year)
.append(" "));
} else
{
Log.v("Date fin", "Date2 : " + new StringBuilder().append(month + 1)
.append("-").append(day).append("-").append(year)
.append(" "));
}
}
}
このタイプを簡単に使用できます
public class MainActivity extends Activity {
private TextView startDateDisplay;
private TextView endDateDisplay;
private Button startPickDate;
private Button endPickDate;
private Calendar startDate;
private Calendar endDate;
static final int DATE_DIALOG_ID = 0;
private TextView activeDateDisplay;
private Calendar activeDate;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/* capture our View elements for the start date function */
startDateDisplay = (TextView) findViewById(R.id.startDateDisplay);
startPickDate = (Button) findViewById(R.id.startPickDate);
/* get the current date */
startDate = Calendar.getInstance();
/* add a click listener to the button */
startPickDate.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showDateDialog(startDateDisplay, startDate);
}
});
/* capture our View elements for the end date function */
endDateDisplay = (TextView) findViewById(R.id.endDateDisplay);
endPickDate = (Button) findViewById(R.id.endPickDate);
/* get the current date */
endDate = Calendar.getInstance();
/* add a click listener to the button */
endPickDate.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showDateDialog(endDateDisplay, endDate);
}
});
/* display the current date (this method is below) */
updateDisplay(startDateDisplay, startDate);
updateDisplay(endDateDisplay, endDate);
}
private void updateDisplay(TextView dateDisplay, Calendar date) {
dateDisplay.setText(
new StringBuilder()
// Month is 0 based so add 1
.append(date.get(Calendar.MONTH) + 1).append("-")
.append(date.get(Calendar.DAY_OF_MONTH)).append("-")
.append(date.get(Calendar.YEAR)).append(" "));
}
public void showDateDialog(TextView dateDisplay, Calendar date) {
activeDateDisplay = dateDisplay;
activeDate = date;
showDialog(DATE_DIALOG_ID);
}
private OnDateSetListener dateSetListener = new OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
activeDate.set(Calendar.YEAR, year);
activeDate.set(Calendar.MONTH, monthOfYear);
activeDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);
updateDisplay(activeDateDisplay, activeDate);
unregisterDateDisplay();
}
};
private void unregisterDateDisplay() {
activeDateDisplay = null;
activeDate = null;
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DATE_DIALOG_ID:
return new DatePickerDialog(this, dateSetListener, activeDate.get(Calendar.YEAR), activeDate.get(Calendar.MONTH), activeDate.get(Calendar.DAY_OF_MONTH));
}
return null;
}
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
super.onPrepareDialog(id, dialog);
switch (id) {
case DATE_DIALOG_ID:
((DatePickerDialog) dialog).updateDate(activeDate.get(Calendar.YEAR), activeDate.get(Calendar.MONTH), activeDate.get(Calendar.DAY_OF_MONTH));
break;
}
}
}
旅行の開始日と終了日に2つの日付ピッカーを実装する必要がありました。ブールフラグを使用して、日付ピッカーダイアログから選択した日付を入力するテキストビューを確認しました。以下に、コードの視覚的表現を示します。
public class AddTrip extends AppCompatActivity implements DatePickerDialog.OnDateSetListener {
private boolean startOrEnd = true;
private Button startDateBtn;
private Button endDateBtn;
private TextView startDateText;
private TextView endDateText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_trip);
initAll();
startDateBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDatePickerDialog();
startOrEnd = true;
}
});
endDateBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDatePickerDialog();
startOrEnd = false;
}
});
}
public void initAll(){
startDateBtn = findViewById(R.id.idstartDateBtn);
endDateBtn = findViewById(R.id.idendDateBtn);
startDateText = findViewById(R.id.startDateText);
endDateText = findViewById(R.id.endDateText);
}
private void showDatePickerDialog() {
DatePickerDialog datePickerDialog = new DatePickerDialog(
this,
this,
Calendar.getInstance().get(Calendar.YEAR),
Calendar.getInstance().get(Calendar.MONTH),
Calendar.getInstance().get(Calendar.DAY_OF_MONTH));
datePickerDialog.show();
}
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
String date = "month/day/year: " + month + "/" + dayOfMonth + "/" + year;
if (startOrEnd) {
startDateText.setText(date);
} else {
endDateText.setText(date);
}
}
}
前述のソリューションのいずれにも満足できなかったため、次のように独自に作成しました: https://Gist.github.com/JoachimR/f82b2b371b1ced4a09918c970e045d4f
import Android.app.DatePickerDialog
import Android.app.Dialog
import Android.os.Bundle
import Android.support.v4.app.DialogFragment
import Java.util.*
class ChooseDayDialog : DialogFragment() {
companion object {
private val KEY_INITIAL_TIMESTAMP = "KEY_INITIAL_TIMESTAMP"
private val KEY_REQUEST_CODE = "KEY_REQUEST_CODE"
private val DEFAULT_REQUEST_CODE = 20
fun createInstance(initialTimestamp: Long,
requestCode: Int = DEFAULT_REQUEST_CODE) =
ChooseDayDialog().apply {
arguments = Bundle().apply {
putLong(KEY_INITIAL_TIMESTAMP, initialTimestamp)
putInt(KEY_REQUEST_CODE, requestCode)
}
}
}
interface OnDayChosenListener {
fun onDayChosen(requestCode: Int, year: Int, month: Int, dayOfMonth: Int)
}
private lateinit var listener: OnDayChosenListener
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val activity = activity
if (activity is OnDayChosenListener) {
listener = activity
} else {
throw IllegalStateException("Activity must implement OnDayChosenListener")
}
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val timestamp = arguments?.getLong(KEY_INITIAL_TIMESTAMP, -1L) ?: -1L
if (timestamp == -1L) {
throw IllegalStateException("no initial time given")
}
val requestCode = arguments?.getInt(KEY_REQUEST_CODE, DEFAULT_REQUEST_CODE)
?: DEFAULT_REQUEST_CODE
val calendar = Calendar.getInstance().apply {
timeInMillis = timestamp
}
return DatePickerDialog(activity,
DatePickerDialog.OnDateSetListener { _, year, month, dayOfMonth ->
listener.onDayChosen(requestCode, year, month, dayOfMonth)
},
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH))
}
}
これに対する私の解決策は、単にスイッチを使用することでした
public class RegisterActivity extends AppCompatActivity implements DatePickerDialog.OnDateSetListener {
private TextView mDisplayBirthDay;
private TextView mDisplayExpDate;
private TextView mDisplayIssueDate;
private int sw;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Objects.requireNonNull(getSupportActionBar()).setDisplayShowTitleEnabled(false); // to get rid of the title of the activity
Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);
mDisplayBirthDay = findViewById(R.id.birthDate);
findViewById(R.id.birthDate).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDatePickerDialog();
sw = 0;
}
});
mDisplayExpDate = findViewById(R.id.editText_expire);
findViewById(R.id.editText_expire).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDatePickerDialog();
sw = 1;
}
});
mDisplayIssueDate = findViewById(R.id.editText_issueDate);
findViewById(R.id.editText_issueDate).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDatePickerDialog();
sw = 2;
}
});
}
private void showDatePickerDialog(){
DatePickerDialog datePickerDialog = new DatePickerDialog(this,
this,
Calendar.getInstance().get(Calendar.YEAR),
Calendar.getInstance().get(Calendar.MONTH),
Calendar.getInstance().get(Calendar.DAY_OF_MONTH));
datePickerDialog.show();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.show_registrations:
getSupportFragmentManager().beginTransaction().replace(R.id.event_description,
//TODO: pass eventID as intend when clicked on event
EventRegistration.newInstance(69)).commit();
break;
case R.id.visibility_event:
break;
case Android.R.id.home:
onBackPressed(); //handling the "back" button
break;
default:
}
return true;
}
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
month = month + 1; //because January is the month 0
String date = dayOfMonth + "/" + month + "/" + year;
switch (sw){
case 0:
mDisplayBirthDay.setText(date);
break;
case 1:
mDisplayExpDate.setText(date);
break;
case 2:
mDisplayIssueDate.setText(date);
break;
default:
}
}
}
次のコードを使用できます
@Override
protected Dialog onCreateDialog(int id) {
/*
* final Dialog d = new Dialog(this); d.set
*/
switch (id) {
case DATE_DIALOG_ID:
return new DatePickerDialog(this,
Android.R.style.Theme_Holo_Light_Dialog_MinWidth,
mDateSetListener, cmYear, cmMonth, cmDay);
}
return null;
}
private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
cmYear = year;
cmMonth = monthOfYear;
cmDay = dayOfMonth;
updateDisplay();
}
};
private void updateDisplay() {
String date_check = ""
+ new StringBuilder()
// Month is 0 based so add 1
.append(cmYear).append("-").append(cmMonth + 1)
.append("-").append(cmDay).append(" ");
}
任意のonclick
でDialogを呼び出すことができます
showDialog(DATE_DIALOG_ID);
ここで、DATE_DIALOG_IDは次のように宣言されています
static final int DATE_DIALOG_ID = 0;
これがお役に立てば幸いです。
issue.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Bundle bundle = new Bundle();
bundle.putInt("DATE", 1);
DialogFragment newFragment = new MyDatePickerFragment();
newFragment.setArguments(bundle);
newFragment.show(getSupportFragmentManager(), "datePicker");
}
});
expiry.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Bundle bundle = new Bundle();
bundle.putInt("DATE", 2);
DialogFragment newFragment = new MyDatePickerFragment();
newFragment.setArguments(bundle);
newFragment.show(getSupportFragmentManager(), "datePicker");
}
});
}
@Override
public void sendInput(String input, int id) {
date = input;
switch (id) {
case 1:
issue.setText(date);
break;
case 2:
expiry.setText(date);
break;
}
public class MyDatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
static final int ISSUE_DATE = 1;
static final int EXPIRY_DATE = 2;
private int mChosenDate;
int cur = 0;
@Override
public void onDateSet(DatePicker datePicker, int year, int month, int day) {
String date;
if (cur == ISSUE_DATE) {
// set selected date into textview
Log.v("Date Issue", "Date1 : " + new StringBuilder().append(month + 1)
.append("-").append(day).append("-").append(year)
.append(" "));
date = day + "/0" + (month + 1) + "/" + year;
} else {
Log.v("Date expiry", "Date2 : " + new StringBuilder().append(month + 1)
.append("-").append(day).append("-").append(year)
.append(" "));
date = day + "/0" + (month + 1) + "/" + year;
}
listenerforActivity.sendInput(date, cur);
}
public interface OnDateSetListenerInterface {
void sendInput(String input, int id);
}
public OnDateSetListenerInterface listenerforActivity;
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
listenerforActivity = (OnDateSetListenerInterface) getActivity();
} catch (ClassCastException e) {
Toast.makeText(context, e.toString(), Toast.LENGTH_SHORT).show();
}
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current date as the default date in the picker
final Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
Bundle bundle = this.getArguments();
if (bundle != null) {
mChosenDate = bundle.getInt("DATE", 1);
}
switch (mChosenDate) {
case ISSUE_DATE:
cur = ISSUE_DATE;
return new DatePickerDialog(getActivity(), this, year, month, day);
case EXPIRY_DATE:
cur = EXPIRY_DATE;
return new DatePickerDialog(getActivity(), this, year, month, day);
}
return null;
}
}
DialogFragmentにフラグIDを渡し、onDateSetがフラグを使用してテキストビューデータを適切に設定することで、この問題を解決しました
ダイアログフラグメントのコード部分は次のとおりです。
public class twodatepickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener{
private int first ;
public twodatepickerFragment(int i) {
first=i;
}
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
int date=c.get( Calendar.DAY_OF_MONTH);
int month= c.get( Calendar.MONTH);
int year=c.get ( Calendar.YEAR );
return new DatePickerDialog(getActivity(),(DatePickerDialog.OnDateSetListener) getActivity (), year, month, date);
return new DatePickerDialog(getActivity(),this, year, month, date);
}
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month);
calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
Date date = calendar.getTime();
TextView textView = findViewById(R.id.date_selected);
textView.setText(new SimpleDateFormat("dd-MMMM-yyyy").format(date));
if(first==0){
TextView tv= getActivity().findViewById(R.id.date_selected);
tv.setText(new SimpleDateFormat("dd-MMMM-yyyy").format(date));
}else{
TextView tv= getActivity().findViewById(R.id.date_selected_2);
tv.setText(new SimpleDateFormat("dd-MMMM-yyyy").format(date));
}
}
}
MainActivityのコードは次のとおりです。ここでselect_date_1とselect_date_2はボタンです。
select_date_2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DialogFragment datepicker = new twodatepickerFragment (1);
datepicker.show ( getSupportFragmentManager (),"date picker" );
}
});
select_date_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DialogFragment datepicker = new twodatepickerFragment (0);
datepicker.show ( getSupportFragmentManager (),"date picker" );
}
});
このコードを試してください。[開始]ボタンと[終了]ボタンをクリックすると、異なる日付ピッカーダイアログが表示され、選択した日付を使用してテキストビューが設定されます。
From.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// new DatePickerDialog(TripPlanner.this, from_dateListener, from_year, from_month, from_day).show();
new DatePickerDialog(TripPlanner.this, R.style.DialogTheme, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
//DO SOMETHING
Fromdate.setText(String.valueOf(dayOfMonth)+"/"+String.valueOf(monthOfYear+1)+"/"+String.valueOf(year));
}
}, 2015, 02, 26).show();
}
});
To.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new DatePickerDialog(TripPlanner.this, R.style.DialogTheme, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
//DO SOMETHING
Todate.setText(String.valueOf(dayOfMonth)+"/"+String.valueOf(monthOfYear+1)+"/"+String.valueOf(year));
}
}, 2015, 02, 26).show();
}
});