Как использовать showDialog() и DatePickerDialog() внутри фрагмента?
Внутри Activity я вызываю разные фрагменты, в зависимости от того, какая кнопка радио проверена, разные фрагменты открываются с разными вещами, которые пользователь должен ввести. Для этого один из пользователей должен "Установить дату" и "Установить время".
Я использую код отсюда... нажмите здесь.
Он работал нормально, когда я попробовал это в Activity... но когда я поместил код внутри фрагмента,
showDialog(DATE_DIALOG_ID);
а также
showDialog(TIME_DIALOG_ID);
есть ошибка
Medthod showDialog (int) не определено для типа new View.OnclickListener(){
а также
return new DatePickerDialog(this, datetoperform, currentYear, currentMonth, currentDay);
имеет ошибку
Конструктор DatePickerDialog(OrderTypeGeneralOrderFragment, DatePickerDialog.OnDateSetListener, int, int, int) не определен
а также
return new TimePickerDialog(this, timeDate, hour, minute, false);
имеет ошибку
Конструктор **TimePickerDialog(OrderTypeGeneralOrderFragment, TimePickerDialog.OnTimeSetListener, int, int, boolean)**
не определено
Это мой код:
package info.androidhive.slidingmenu;
import java.util.Calendar;
import android.os.Bundle;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.Fragment;
import android.app.TimePickerDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TimePicker;
public class OrderTypeGeneralOrderFragment extends Fragment{
private EditText subjectTextBox;
private int currentYear;
private int currentMonth;
private int currentDay;
static final int DATE_DIALOG_ID = 0;
static final int TIME_DIALOG_ID = 1;
int hour;
int minute;
private Button btDate;
private Button btTime;
private TextView timeDisplay;
private TextView dateDisplay;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstancesState)
{
return inflater.inflate(R.layout.generalorderfragment, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
Button btDate =(Button) getView().findViewById(R.id.btnDate);
btDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showDialog(DATE_DIALOG_ID);
}
});
final Calendar c = Calendar.getInstance();
currentYear = c.get(Calendar.YEAR);
currentMonth = c.get(Calendar.MONTH);
currentDay = c.get(Calendar.DAY_OF_MONTH);
Button btTime = (Button) getView().findViewById(R.id.btnTime);
btTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showDialog(TIME_DIALOG_ID);
}
});
final Calendar d = Calendar.getInstance();
hour = d.get(Calendar.HOUR_OF_DAY);
minute = d.get(Calendar.MINUTE);
TextView timeDisplay = (TextView) getView().findViewById(R.id.txtTime);
TextView dateDisplay = (TextView) getView().findViewById(R.id.txtDate);
EditText subjectTextBox = (EditText) getView().findViewById(R.id.subjectTextBoxId);
}
//--DATE PICKER--//
// Use the current date as the default date in the picker
protected Dialog onCreateDialog4(int id) {
switch (id) {
case DATE_DIALOG_ID:
return new DatePickerDialog(this, datetoperform, currentYear, currentMonth, currentDay);
case TIME_DIALOG_ID:
return new TimePickerDialog(this, timeDate, hour, minute, false);
}
return null;
}
private DatePickerDialog.OnDateSetListener datetoperform = new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int month, int day) {
// if (c1.isChecked()) {
dateDisplay.setText("Order will be performed on: "
+ (month + 1) + "-" + day + "-" + year + ".");
// }
}
};
private TimePickerDialog.OnTimeSetListener timeDate = new TimePickerDialog.OnTimeSetListener() {
public void onTimeSet(TimePicker view, int hours, int minutes) {
timeDisplay.setText("on " + hours + ":"
+ minutes + ".");
}
};
/* public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}*/
//--//DATE PICKER--//
}
Я думаю.. возможно можно поставить эту часть
protected Dialog onCreateDialog4(int id) {
switch (id) {
case DATE_DIALOG_ID:
return new DatePickerDialog(this, datetoperform, currentYear, currentMonth, currentDay);
case TIME_DIALOG_ID:
return new TimePickerDialog(this, timeDate, hour, minute, false);
}
return null;
}
private DatePickerDialog.OnDateSetListener datetoperform = new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int month, int day) {
// if (c1.isChecked()) {
dateDisplay.setText("Order will be performed on: "
+ (month + 1) + "-" + day + "-" + year + ".");
// }
}
};
private TimePickerDialog.OnTimeSetListener timeDate = new TimePickerDialog.OnTimeSetListener() {
public void onTimeSet(TimePicker view, int hours, int minutes) {
timeDisplay.setText("on " + hours + ":"
+ minutes + ".");
}
};
/* public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}*/
//--//DATE PICKER--//
}
внутри деятельности, которая вызывает этот фрагмент.
если все в порядке.. как я назову эту часть в этом фрагменте?
2 ответа
Вам нужно получить дескриптор для Activity, чтобы вызвать showDialog(). Попробуйте вызвать getActivity(). ShowDialog ()
Спасибо.. Диалоги появляются сейчас:D
но
TextView timeDisplay = (TextView) getView(). FindViewById (R.id.txtTime); TextView dateDisplay = (TextView) getView (). FindViewById (R.id.txtDate);
не будет отображать выбранную дату и время.
ЭТО ВНУТРИ МОЕЙ ДЕЯТЕЛЬНОСТИ:
protected Dialog onCreateDialog(int id) {
switch (id) {
case DATE_DIALOG_ID:
OnDateSetListener datetoperform = null;// i had to initialize this because datetoperform is in the fragment
return new DatePickerDialog(this, datetoperform, currentYear,currentMonth, currentDay);
case TIME_DIALOG_ID2:
OnTimeSetListener timeDate = null;// i had to initialize this because timeDate is in the fragment
return new TimePickerDialog(this, timeDate, hour, minute, false);
case DIALOG_CHANGE_BACKGROUND:
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setSingleChoiceItems(mBgNames, mChangeBGItem, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mChangeBGItem = which;
Bitmap bm = null;
switch(which) {
case 0:
bm = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.letter_bg_grass);
break;
case 1:
bm = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.letter_bg_present);
break;
case 2:
bm = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.letter_bg);
break;
case 3:
mSCanvas.setBGColor(0x00000000);
break;
}
if(bm != null) {
mSCanvas.setBGImage(bm);
}
removeDialog(DIALOG_CHANGE_BACKGROUND);
}
});
return builder.create();
}
return super.onCreateDialog(id);
OnDateSetListener datetoperform = null;
я должен был инициализировать это, потому что datetoperform находится во фрагменте
OnDateSetListener timeDate = null;
я должен был инициализировать это, потому что timeDate находится во фрагменте
внутри Фрагмент:
public DatePickerDialog.OnDateSetListener datetoperform = new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int month, int day) {
// if (c1.isChecked()) {
dateDisplay.setText("Order will be performed on: "
+ (month) + "-" + day + "-" + year + ".");
// }
}
};
public TimePickerDialog.OnTimeSetListener timeDate = new TimePickerDialog.OnTimeSetListener() {
public void onTimeSet(TimePicker view, int hours, int minutes) {
timeDisplay.setText("on " + hours + ":"
+ minutes + ".");
}
};