使用 DialogFragment 的结果通过 Gridview OnItemClickListener 更新数据库
Using result from DialogFragment to update database via Gridview OnItemClickListener
我有一个带有一些时间的 Gridview,它们是从数据库中提取的。 Gridview 填充有 Textviews(显示时间),这些 Textviews 标记有必要的信息(ROW ID 等)以更改数据库中的时间。我为 Gridview 设置了一个 OnItemClickListener,它将通过 DialogFragment 加载一个 TimePickerDialog。
// When items on the grid are pressed:
gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
String type = (String) (v.getTag(R.id.VIEW_TAG_TIMEENTRY_TYPE));
String direction = (String) (v.getTag(R.id.VIEW_TAG_TIMEENTRY_DIRECTION));
long row_id = (long) v.getTag(R.id.VIEW_TAG_TIMEENTRY_ID);
// If entry doesn't exist
if (row_id < 0) {
DialogFragment dialogFragment = new TimePickerFragment();
// Tell the dialogFragment what to do when set......
dialogFragment.show(getSupportFragmentManager(), "timePicker");
}
}
});
TimePickerFragmentclass如下:
public class TimePickerFragment extends DialogFragment
implements TimePickerDialog.OnTimeSetListener {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current time as the default values for the picker
final Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
// Create a new instance of TimePickerDialog and return it
return new TimePickerDialog(getActivity(), this, hour, minute,
DateFormat.is24HourFormat(getActivity()));
}
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
// Do something with the time chosen by the user
}
在我见过的大多数例子中,它们只是在 onTimeSet 函数中做一些简单的事情,比如更新特定的文本视图。但是,我希望采取的操作是将数据库添加或更新到与被单击的文本视图对应的行。
在 C++ 中,我可能会传递一个调用 ContentProvider 中的更新方法的函数作为此 class 的构造函数的参数,但我不知道 [=32] 的等效设计模式=].
一个答案提到 'interface' 可能是可行的方法,但我不确定如何实现它。 (Results from a DialogFragment to an ActivityFragment)
另一个答案提到使用 setTargetFragment 方法,但是在这种情况下调用 class 是一个 activity,所以我不能这样做。 (Receive result from DialogFragment)
我应该如何最好地解决这个设计需求?我已经为我的 android-app 新手大脑绞尽脑汁了。
非常感谢
你能试试这个吗...
1。在你 TimePickerFragment..
声明这个
public TimeListener 监听器;
public static abstract class TimeListener {
public abstract void onTime(); // add parameters if you like
}
在您的 onTimeSet 上
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
if(listener!=null)
listener.onTime();
}
像这样实例化你的对话框片段
TimePickerFragment tm = new TimePickerFragment();
tm.listener = 新 TimePickerFragment.TimeListener(){
@Override
public void onTime(){
//do something here
}
}
我有一个带有一些时间的 Gridview,它们是从数据库中提取的。 Gridview 填充有 Textviews(显示时间),这些 Textviews 标记有必要的信息(ROW ID 等)以更改数据库中的时间。我为 Gridview 设置了一个 OnItemClickListener,它将通过 DialogFragment 加载一个 TimePickerDialog。
// When items on the grid are pressed:
gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
String type = (String) (v.getTag(R.id.VIEW_TAG_TIMEENTRY_TYPE));
String direction = (String) (v.getTag(R.id.VIEW_TAG_TIMEENTRY_DIRECTION));
long row_id = (long) v.getTag(R.id.VIEW_TAG_TIMEENTRY_ID);
// If entry doesn't exist
if (row_id < 0) {
DialogFragment dialogFragment = new TimePickerFragment();
// Tell the dialogFragment what to do when set......
dialogFragment.show(getSupportFragmentManager(), "timePicker");
}
}
});
TimePickerFragmentclass如下:
public class TimePickerFragment extends DialogFragment
implements TimePickerDialog.OnTimeSetListener {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current time as the default values for the picker
final Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
// Create a new instance of TimePickerDialog and return it
return new TimePickerDialog(getActivity(), this, hour, minute,
DateFormat.is24HourFormat(getActivity()));
}
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
// Do something with the time chosen by the user
}
在我见过的大多数例子中,它们只是在 onTimeSet 函数中做一些简单的事情,比如更新特定的文本视图。但是,我希望采取的操作是将数据库添加或更新到与被单击的文本视图对应的行。
在 C++ 中,我可能会传递一个调用 ContentProvider 中的更新方法的函数作为此 class 的构造函数的参数,但我不知道 [=32] 的等效设计模式=].
一个答案提到 'interface' 可能是可行的方法,但我不确定如何实现它。 (Results from a DialogFragment to an ActivityFragment)
另一个答案提到使用 setTargetFragment 方法,但是在这种情况下调用 class 是一个 activity,所以我不能这样做。 (Receive result from DialogFragment)
我应该如何最好地解决这个设计需求?我已经为我的 android-app 新手大脑绞尽脑汁了。
非常感谢
你能试试这个吗...
1。在你 TimePickerFragment..
声明这个
public TimeListener 监听器;
public static abstract class TimeListener {
public abstract void onTime(); // add parameters if you like
}
在您的 onTimeSet 上
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
if(listener!=null)
listener.onTime();
}
像这样实例化你的对话框片段
TimePickerFragment tm = new TimePickerFragment();
tm.listener = 新 TimePickerFragment.TimeListener(){
@Override public void onTime(){ //do something here }
}