2016-04-08 31 views
1

私のクラスの使用法をモジュール化したいが、関数を渡す際に問題がある。 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で行います。

ありがとう。

+2

1つのアクティビティから別のアクティビティにonClickListenerを送信する目的を教えてもらえますか? – Srinivasan

+0

私はここで何かが正しくないと感じます。ボタンをクリックするだけで一連のイベントを簡単に記述できますか? –

+0

2番目のケースで例外はありますか? '// !!ここにエラーがあります。例外はスローされました。 ' –

答えて

3

Serializableをインテントに追加しようとしていますが、OnClickListenerはそのインターフェイスを実装していません。必要な両方のインタフェースを実装するクラスを作成することで、必要なものを実現できます。

private class SerializableClickListener implements View.OnClickListener, Serializable { 

    @Override public void onClick() { 
     // TODO handle click 
    } 
} 

ただし、あなたができるはずがないということではありません。クリックリスナーを別のアクティビティに送信することは恐ろしいコードの匂いであり、インテント/ブロードキャストを通じてこれを行う方法を本当に考え直すべきです。

+0

これについてお考えですか? 私は、CoachmarkAcrivity(onClick)をクローズする行為をそのinvokerアクティビティの責任とするため、CoachmarkActivityコードの混乱を緩和します(switch、CoachmarkActivity内のケース) – EdgarDrake

+0

私はこれがOK、あなたのOnClickListenerがターゲットアクティビティに依存しないことを指定します。 FractalWrenchはあなたが "恐ろしいコードのにおい"を得ることができると言っています....しかし、OnClickListenerがCoachmarkActivityに依存しない場合、 "臭い"は香ばしく、豚肉ではありません...あなたは罪悪感なしでコードするかもしれません... – giulio

関連する問題