0

日時コンポーネントを作成しましたが、自動的に作成されます(XMLレイアウトで作成されているため、手動で作成したくありません)が、Activityダイアログを作成するには、への参照を渡す必要があります。どうすればそれを達成できますか?後でセッターを試しましたfindViewByIdが、それは良い解決策ではありません...

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
        }
    };

}
4

3 に答える 3

1

おそらくこれはあなたを助けるかもしれません:

オプション1:

public class DateTimeComponent extends RelativeLayout {
    private Activity activity;

    public DateTimeComponent(Activity act){
        activity = act;
    }

    public void someListener() {
        activity.showDialog(...);
    }

}

オプション2:

public class DateTimeComponent extends RelativeLayout {

    public void someListener(Activity act) {
        act.showDialog(...);
    }

}

オプション3:

...
    private Activity activity;

    public DateComponent(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);

        activity = (Activity) getContext();

        // rest ommited
        initFields();
    }

...
于 2012-05-07T09:07:58.403 に答える
1

ふたつのやり方 -

  1. Contextパラメーターを受け入れるコンストラクターを作成し、いつでも使用できるContext型の(プライベート?)クラス変数を作成します。

  2. それを必要とするすべてのメソッドに追加のコンテキストコンテキストパラメータを追加します。場合によっては、それを最終的にする必要があります。

于 2012-05-07T09:16:59.420 に答える
1

コンストラクターが受け取るコンテキストはアクティビティです。だから、あなたはそれにキャストすることができます。たとえば、このように

MyActivity a = (MyActivity) getContext();

PS自分のフィールドにアクティビティを保存する必要はありません。

private Activity activity; // not needed

すでに内部に保存されており、 http://developer.android.com/reference/android/view/View.html#getContext()から取得できます。

証拠

カスタムテキストビュー:

public class MyTextView extends TextView {

public MyTextView(Context context) {
    super(context);
    setText(Integer.toString(System.identityHashCode(context)));
}

public MyTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    setText(Integer.toString(System.identityHashCode(context)));
}


}

アクティビティ:

public class ContextActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    TextView textView = (TextView) findViewById(R.id.textView);

    textView.setText( Integer.toString(System.identityHashCode(this)) );
}
}

レイアウト:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/textView" />

<com.inthemoon.incubation.MyTextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"/>

</LinearLayout>

表示されるコードは同じです。

于 2012-05-07T09:24:16.313 に答える