如何通过一个活动引用我自己的组件自己的、组件

2023-09-12 06:02:55 作者:〃冷言冷语的小伪装.

我装箱日期时间组成部分,但它会自动构建(我把它在一个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(...);
    }

}
 
c 调用com组件的问题

选项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();
    }

...

 
精彩推荐