我装箱日期时间组成部分,但它会自动构建(我把它在一个XML布局,我不希望手动创建它),但我需要传递一个引用到活动
,以创建对话框。我怎样才能做到这一点?我试过后 findViewById
二传手,但它不是一个很好的解决方案...
公共类DateTimeComponent扩展RelativeLayout的{
私人活动的活动;
公共DateComponent(上下文的背景下,AttributeSet中的AttributeSet){
超(背景下,AttributeSet中的);
//休息ommited
initFields();
}
私人无效initFields(){
dateEditText =(EditText上)findViewById(R.id.dateEditText);
dateEditText.setOnClickListener(新OnClickListener(){
@覆盖
公共无效的onClick(视图v){
activity.showDialog(DATE_PICKER_DIALOG);
}
});
timeEditText =(EditText上)findViewById(R.id.timeEditText);
timeEditText.setOnClickListener(新OnClickListener(){
@覆盖
公共无效的onClick(视图v){
activity.showDialog(TIME_PICKER_DIALOG);
}
});
}
//休息ommited
公共对话getDatePickerDialog(){
INT年= selectedDateTime.get(年);
INT月= selectedDateTime.get(月);
INT天= selectedDateTime.get(DAY_OF_MONTH);
返回新DatePickerDialog(活动,onDateSetListener,年,月,日);
}
公共对话getTimePickerDialog(){
INT小时= selectedDateTime.get(HOUR_OF_DAY);
INT分钟= selectedDateTime.get(分);
返回新TimePickerDialog(活动,onTimeSetListener,小时,分钟,真正的);
}
私人最终OnDateSetListener onDateSetListener =新OnDateSetListener(){
@覆盖
公共无效onDateSet(DatePicker的观点,年整型,诠释monthOfYear,诠释DAYOFMONTH){
// 做一点事
}
};
私人最终OnTimeSetListener onTimeSetListener =新OnTimeSetListener(){
@覆盖
公共无效onTimeSet(TimePicker观点,诠释hourOfDay,INT分钟){
// 做一点事
}
};
}
解决方案
也许,这可以帮助你:
选项1:
公共类DateTimeComponent扩展RelativeLayout的{
私人活动的活动;
公共DateTimeComponent(活动行为){
活动=行为;
}
公共无效someListener(){
activity.showDialog(...);
}
}
选项2:
公共类DateTimeComponent扩展RelativeLayout的{
公共无效someListener(活动行为){
act.showDialog(...);
}
}
选项3:
...
私人活动的活动;
公共DateComponent(上下文的背景下,AttributeSet中的AttributeSet){
超(背景下,AttributeSet中的);
活性=(活动)的getContext();
//休息ommited
initFields();
}
...
I crated a datetime component but it's constructed automatically (I have it in a XML layout and I don't want to create it manually) but I need to pass a reference to an Activity
in order to create dialogs. How can I achieve that? I tried a setter after findViewById
but it's not a good solution...
public class DateTimeComponent extends RelativeLayout {
private Activity activity;
public DateComponent(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
// rest ommited
initFields();
}
private void initFields() {
dateEditText = (EditText) findViewById(R.id.dateEditText);
dateEditText.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
activity.showDialog(DATE_PICKER_DIALOG);
}
});
timeEditText = (EditText) findViewById(R.id.timeEditText);
timeEditText.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
activity.showDialog(TIME_PICKER_DIALOG);
}
});
}
// rest ommited
public Dialog getDatePickerDialog() {
int year = selectedDateTime.get(YEAR);
int month = selectedDateTime.get(MONTH);
int day = selectedDateTime.get(DAY_OF_MONTH);
return new DatePickerDialog(activity, onDateSetListener, year, month, day);
}
public Dialog getTimePickerDialog() {
int hour = selectedDateTime.get(HOUR_OF_DAY);
int minute = selectedDateTime.get(MINUTE);
return new TimePickerDialog(activity, onTimeSetListener, hour, minute, true);
}
private final OnDateSetListener onDateSetListener = new OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
// do something
}
};
private final OnTimeSetListener onTimeSetListener = new OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
// do something
}
};
}
解决方案
Perhaps this may help you:
Option 1:
public class DateTimeComponent extends RelativeLayout {
private Activity activity;
public DateTimeComponent(Activity act){
activity = act;
}
public void someListener() {
activity.showDialog(...);
}
}
Option 2:
public class DateTimeComponent extends RelativeLayout {
public void someListener(Activity act) {
act.showDialog(...);
}
}
Option 3:
...
private Activity activity;
public DateComponent(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
activity = (Activity) getContext();
// rest ommited
initFields();
}
...