如何将onClick函数传递给Intent

时间:2016-04-08 04:48:17

标签: java android android-intent delegates parameter-passing

我想模块化我的课程的用法但是我在传递函数时遇到了问题。我希望能够将 OnClickListener 从1个活动传递到此 CoachmarkActivity

我尝试了两种不同的方法:  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#中传递一个Delegate对象(变量形式的函数),但是在Android Java中。

有什么想法吗?感谢。

2 个答案:

答案 0 :(得分:3)

您正在尝试向您的Intent添加Serializable额外内容,但OnClickListener未实现该界面。您可以通过创建实现所需接口的类来实现您的目的。

private class SerializableClickListener implements View.OnClickListener, Serializable {

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

然而,仅仅因为你并不意味着你应该这样做。向另一个活动发送一个点击监听器是一种可怕的代码味道,你应该重新思考如何通过Intents / Broadcasts来实现这一点。

答案 1 :(得分:0)

我试图通过OnlclickListener和我不能。然后,我尝试该溶液中。

  1. 我在一个全球国际类制成的静态点击听者变量

    public static View.OnClickListener btn;
    
  2. 然后当我打电话startactivity去别的活动我这样做。

     GlobalData.btn = new View.OnClickListener() {
                         @Override
                         public void onClick(View v) {
                             //Listern action
                         }
                     };
    c.startActivity(new Intent(c, DialogActivity.class));
    
  3. 然后,在第二活性,我可以设置我用于在所述第一活动分配的侦听器对象的静态参照听者

    b1.setOnClickListener(new View.OnClickListener() {
                     @Override
                     public void onClick(View v) {
                         if(GlobalData.btn!=null){
                             GlobalData.btn1.onClick(v);
                         }
                         finish();
                     }
                 });
    

我没有直接将它用作参数,因此我可以在第二个活动侦听器中执行其他操作。这对我有用。

但你,因为你使用的是静态参考多想。这不是一个100%的溶液。但它是值得一试。