2016-04-08 156 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