- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用时间选择器让用户输入他想要的时间来完成特定任务,我正在使用支持库中提供的 DialogFragment 类以实现与旧 Android 版本的向后兼容性。
这是我创建 TimePickerFragment 类的代码,在一个单独的文件中创建,取自:http://developer.android.com/guide/topics/ui/controls/pickers.html :
package com.calls.only;
import java.util.Calendar;
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.widget.TimePicker;
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, false);
}
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
// Do something with the time chosen by the user
}
}
主要 Activity :
package com.calls.only;
import java.util.Calendar;
import java.util.TimeZone;
import android.os.Bundle;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.DialogFragment;
import android.view.Menu;
import android.view.View;
import android.widget.RadioButton;
import android.widget.TextView;
public class MainActivity extends FragmentActivity {
public void InputStartTime(View v) {
DialogFragment newFragment = new TimePickerFragment();
newFragment.show(getSupportFragmentManager(), "timePicker");
}
private TimePickerDialog.OnTimeSetListener mTimeSetListener =
new TimePickerDialog.OnTimeSetListener() {
//Overriding onTimeSet causes an error, see below
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
Log.i("TimePicker", "Time picker set!");
}
};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
从日志中可以看出,没有调用 onTimeset 方法,如果我尝试覆盖此方法,则会收到错误消息:“新 TimePickerDialog.OnTimeSetListener(){} 类型的方法 onTimeSet(TimePicker, int, int) 必须覆盖父类(super class)方法”
谁能告诉我问题出在哪里?我一直在努力解决这个问题,但它让我感到非常沮丧!
最佳答案
the onTimeset method is not being called as I can see from the log
嗯,那是因为当您创建 TimePickerDialog
时,您将 fragment 作为 OnTimeSetListener
提供:
return new TimePickerDialog(getActivity(), this, hour, minute, false);
^
换句话说:您没有看到日志语句,因为 Activity 中的 mTimeSetListener
变量从未被设置为您在 fragment 中创建的对话的监听器。
您可以通过将 fragment 附加到您的 MainActivity
的 Activity 轻松地解决此问题,或者,如果您更喜欢可重用的东西,请通过接口(interface)让它回调。在这种情况下,您可以重用 OnTimeSetListener
接口(interface),但您也可以设置自己的接口(interface),例如,将 Calendar
对象传递回 Activity 而不是原始的小时/分钟值。
在最基本的形式中,它看起来有点像这样:
public class TimePickerFragment extends DialogFragment {
@Override public Dialog onCreateDialog(Bundle savedInstanceState) {
// ... omitted
if (!(getActivity() instanceof OnTimeSetListener)) throw new IllegalStateException("Activity should implement OnTimeSetListener!");
OnTimeSetListener timeSetListener = (OnTimeSetListener) getActivity();
// Create a new instance of TimePickerDialog and return it
return new TimePickerDialog(getActivity(), timeSetListener, hour, minute, false);
}
}
然后让您的 MainActivity
实现相同的接口(interface),而不是使用匿名内部类:
public class MainActivity extends FragmentActivity implements TimePickerDialog.OnTimeSetListener {
@Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
Log.i("TimePicker", "Time picker set!");
}
}
更新:如评论中所述,要启用对多个选择器的支持,您有多种选择。一种是跟踪托管 Activity 中显示的对话框;如果您只需要区分两个选择器, boolean 值就可以了,否则枚举将是实现两个以上状态的合适方法。您需要确保在配置更改期间保留这条信息......
但是,我更愿意做的是能够通过为每个选择器提供一个 id 来识别 onTimeSet(...)
中返回的结果的来源。该 id 然后包含在结果中,以便我们可以知道它来自哪里。我将在下面概述总体思路:
public class TimePickerFragment extends DialogFragment implements OnTimeSetListener {
private int mId;
private TimePickerDialogListener mListener;
private static TimePickerFragment newInstance(int id) {
Bundle args = new Bundle();
args.putInt("picker_id", id);
TimePickerFragment fragment = new TimePickerFragment();
fragment.setArguments(args);
return fragment;
}
@Override public Dialog onCreateDialog(Bundle savedInstanceState) {
// ... omitted
mId = getArguments().getInt("picker_id");
mListener = getActivity() instanceof TimePickerDialogListener ? (TimePickerDialogListener) getActivity() : null;
// Create a new instance of TimePickerDialog and return it
return new TimePickerDialog(getActivity(), this, hour, minute, false);
}
@Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
if (mListener != null) mListener.onTimeSet(mId, view, hourOfDay, minute);
}
public static interface TimePickerDialogListener {
public void onTimeSet(int id, TimePicker view, int hourOfDay, int minute);
}
}
我们在上面所做的更改是将对话框本身注册为 OnTimeSetListener
,然后它将通过 TimePickerDialogListener
传递数据,前提是托管 Activity 实现该接口(interface)。这就是我们下一步需要做的。另外请注意,我添加了一个静态便捷方法来创建一个新的 TimePickerFragment
,它带有一个 id。该值将设置为 fragment 的参数,确保它成为 fragment 状态的一部分,因此您不必自己担心配置更改 - 框架会为您完成。
所以让我们更改 MainActivity
来实现我们的自定义接口(interface),并让它使用 newInstance
方法:
public class MainActivity extends FragmentActivity implements TimePickerFragment.TimePickerDialogListener {
private static final int START_TIME_PICKER_ID = 1;
private static final int END_TIME_PICKER_ID = 2;
public void InputStartTime(View v) {
// supply the appropriate id - I'm assuming you'll be adding an InputEndTime method somewhere that will then supply END_TIME_PICKER_ID
DialogFragment newFragment = TimePickerFragment.newInstance(START_TIME_PICKER_ID);
newFragment.show(getSupportFragmentManager(), "timePicker");
}
@Override public void onTimeSet(int id, TimePicker view, int hourOfDay, int minute) {
Log.i("TimePicker", "Time picker set from id " + id + "!");
// here you can compare the id value to figure out what picker this data came from
}
}
最后一点:我是直接在浏览器中输入的,所以请注意任何明显的拼写错误。
关于java - TimePicker onTimeSet 未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15915318/
我已经在 fragment 中实现了按钮按下时的时间选择器(工作)但是我如何提取两个对话框的小时和分钟以仅使用一个 onTimeSet() 来分隔变量, 它位于 MainActivity? 这是我的
我正在使用时间选择器让用户输入他想要的时间来完成特定任务,我正在使用支持库中提供的 DialogFragment 类以实现与旧 Android 版本的向后兼容性。 这是我创建 TimePickerFr
这是我的代码,在我的 ListViewAdapter 中。我想显示一个 timePicker 来设置我的适配器的时间。但是a无法解决我的onTimeSetp 是我的适配器 assert btn
我的应用程序中有一个日期和时间选择器,我刚刚注意到时间不对。时间选择器显示的当前时间是 i 小时延迟,它的上午/下午是错误的,例如当前时间是 2:55 pm它会显示1:55 am这里的问题似乎是代码
今天我尝试使用 TimePickerDialog,但我发现了一些缺陷。 OnTimeSet 也会在对话框关闭时调用(例如,通过单击外部) OnTimeSet 在用户点击“完成”按钮时被调用两次 我使用
我有一个处理 fragment 的 MainActivity。在我做的其中一个 fragment 上: enterBtn.setOnClickListener(new View.OnClickList
如果我在 Jelly Bean 中使用 TimePickerDialog,对话框没有取消按钮,而且无论我做什么(比如尝试后退按钮),onTimeSet 总是会触发,所以我无法知道是否用户是否不想采取行
我有 2 个 Edittext,触摸时会弹出一个时间选择器对话框: public class MainActivity extends Activity { @Override pro
我使用 TimePickerDialog 和 onTimeSet() 方法。我添加了一个带有 onClickListener 的 cancel 按钮。 我的问题是,当我单击 cancel 按钮时,会调
我是一名优秀的程序员,十分优秀!