私のクラスの使用法をモジュール化したいが、関数を渡す際に問題がある。 OnClickListenerを1アクティビティからこのCoachmarkActivityに渡すことができます。インテントにonClick関数を渡す方法
1. OnClickListenerをインテントに渡す 2. FollowUpClassクラスを渡すと、メソッドonClickを持つSerializableが実装されます。
以下のコードを見ることができます。完全なコードではありませんが、これを理解できるはずです。
public class CoachmarkActivity extends Activity {
public static final String RES_LAYOUT = "RES-LAYOUT";
public static final String LISTENER = "LISTENER";
public static final String FOLLOW_UP = "FOLLOW-UP";
@Override protected void onCreate(Bundle savedInstance) {
setContentView(getIntent.getIntExtra(RES_LAYOUT, R.layout.activity_default))
Button button1 = (Button) findViewById(R.id.button1);
Button button2 = (Button) findViewById(R.id.button2);
// 1ST ATTEMPT
// I want to modularize this
OnClickListener onClickPassedFromIntent = (OnClickListener) getIntent().getSerializableExtra(LISTENER);
button1.setOnClickListener(onClickPassedFromIntent);
// 2ND ATTEMPT
final FollowUpListener folllowup = (FollowUpListener) getIntent().getSerializableExtra(FOLLOW_UP);
button2.setOnClickListener(new OnClickListener() {
@Override void onClick() {
// !! Here is error, exception thrown
folllowup.onClick();
}
});
}
/**
* Public method to be used in other activity.
* Invocation wanna be:
* CoachmarkActivity.startThisActivity(getActivity(), R.layout.coachmark1, new OnClickListener() {
* @Override void onClick() {
* // Do something
* }
* });
*/
public static void startThisActivity(Context context, int resId, OnClickListener listener) {
Intent intent = new Intent(context, CoachmarkActivity.class);
intent.putExtra(RES_LAYOUT, resId);
// !! Line below is error, onClickListener is not serializable, no method can accomadate below
intent.putExtra(LISTENER, listener);
context.startActivity(intent);
}
/**
* Public method to be used in other activity.
* Invocation wanna be:
* CoachmarkActivity.startThisActivity(getActivity(), R.layout.coachmark1, new FollowUpListener() {
* @Override void onClick() {
* // Do something
* }
* });
*/
public static void startThisActivity(Context context, int resId, FollowUpListener folllowup) {
Intent intent = new Intent(context, CoachmarkActivity.class);
intent.putExtra(RES_LAYOUT, resId);
intent.putExtra(FOLLOW_UP, followup);
context.startActivity(intent);
}
}
抽象クラス:
public abstract class FollowUpListener implements Serializable {
public abstract void onClick();
}
の問題はタグで、上記のソースコード内のコメントに記載されている "!!" (ちょうどCTRL + F "!!")。私がしたいことは、Delegateオブジェクト(変数の形の関数)をC#で渡すのと同じですが、Android Javaで行います。
ありがとう。
1つのアクティビティから別のアクティビティにonClickListenerを送信する目的を教えてもらえますか? – Srinivasan
私はここで何かが正しくないと感じます。ボタンをクリックするだけで一連のイベントを簡単に記述できますか? –
2番目のケースで例外はありますか? '// !!ここにエラーがあります。例外はスローされました。 ' –