2016-04-08 205 views
1

我想模塊化我的類的用法,但是我在傳遞函數時遇到問題。我希望能夠通過一個OnClickListener從1 activity到這個CoachmarkActivity如何將onClick函數傳遞給Intent

我嘗試了2種不同的方法: 1.將OnClickListener傳遞給Intent 2.傳遞一個類FollowUpClass,實現Serializable方法,該方法的onClick方法。

您可以看到下面的代碼。這不是完整的代碼,但你應該能夠理解這一點。

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「!!」)。我想要做的就像在C#中傳遞一個委託對象(函數的形式爲變量),但在Android Java中。

有什麼想法?謝謝。

+2

你能告訴我從一個活動發送onClickListener到另一個活動的目的嗎? – Srinivasan

+0

我覺得這裏有些不正確。你能簡單地描述一系列點擊按鈕的事件嗎? –

+0

你在第二種情況下得到的例外是什麼? ''!這裏是錯誤,異常拋出' –

回答

3

您正在嘗試爲您的意圖添加Serializable額外費用,但OnClickListener未實現該界面。你可以通過創建一個實現你需要的兩個接口的類來實現你想要的。

private class SerializableClickListener implements View.OnClickListener, Serializable { 

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

但是,僅僅因爲你可以不代表你應該。發送一個點擊監聽器到另一個活動是一個可怕的代碼味道,你應該重新考慮如何通過Intents/Broadcasts來做到這一點。

+0

任何想法呢?我的意思是,我想讓關閉CoachmarkAcrivity(onClick)的行爲成爲它的調用者活動的責任,因此我會減少CoachmarkActivity代碼的混亂(例如:switch,CoachmarkActivity內部的案例) – EdgarDrake

+0

我認爲這是好的,提供您的OnClickListener在目標活動中沒有依賴關係。正如FractalWrench所說的,你可能會得到一種「可怕的代碼味道」......但是如果onClickListener對CoachmarkActivity沒有依賴關係,那麼「氣味」應該是芬芳的,而不是海綿狀的......你可以沒有內疚地編碼...... – giulio