有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将onClick函数传递给Intent

我想模块化我的类的使用,但我在传递函数方面有问题。我希望能够将一个OnClickListener从1个活动传递到这个CoachmarkActivity

我尝试了两种不同的方法: 1.将OnClick Listener传递给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) 个答案

  1. # 1 楼答案

    您正试图在意图中添加Serializable额外内容,但OnClickListener没有实现该接口。您可以通过创建一个实现所需两个接口的类来实现所需的功能

    private class SerializableClickListener implements View.OnClickListener, Serializable {
    
        @Override public void onClick() {
            // TODO handle click
        }
    }
    

    然而,仅仅因为你可以,并不意味着你应该。向另一个活动发送click listener是一种可怕的代码气味,你应该重新思考如何通过意图/广播来做到这一点

  2. # 2 楼答案

    我试图通过onlycklistener,但我没能通过。然后我尝试了这个解决方案

    1. 我在GlobalData类中创建了一个静态click listener变量

      public static View.OnClickListener btn;
      
    2. 然后当我调用StartTactivity去进行另一项活动时,我做了这个

       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%的解决方案。但值得一试