有 Java 编程相关的问题?

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

java使用来自不同类的OnClick

这可能很简单,但我还是个初学者 我在MainActivity类中有一个按钮,我想在另一个类(另一个活动)中使用onclick方法。我知道,通过将其公开为静态并将其作为实例访问,可以很容易地实现这一点,但在我的情况下,由于某些好的原因,我无法将其公开为静态

按钮xml:

 <Button
    安卓:id="@+id/googledrivemain"
    安卓:layout_width="78dp"
    安卓:layout_height="77dp"
    安卓:layout_marginTop="149dp"
    安卓:background="@drawable/google"
    安卓:onClick="onClickOpenFile"
    安卓:paddingTop="6dp"
    安卓:textColor="#fff"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/imageView3"
    app:layout_constraintHorizontal_bias="0.51" />

主活动按钮:

 public void onClickCreateFile(View view) {

    fileOperation = true;

    // create new contents resource
    Drive.DriveApi.newDriveContents(mGoogleApiClient)
            .setResultCallback(driveContentsCallback);

}

二等按钮:

btn3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
         MainActivity main = new MainActivity();
           use onclick from mainactivity...??
        }
    });

共 (4) 个答案

  1. # 1 楼答案

    只需将从MainActivity.onClickCreateFile()调用的代码包装到另一个类中,并从任何地方调用它

    永远不要,永远不要,做像new MainActivity()这样的事情。活动由系统管理

  2. # 2 楼答案

    不能将click方法设置为静态的原因是,1)XML操作需要public void2)您正在单击的视图属于活动的实例,而不是类


    你可以做一个这样的静态方法

    public static void createDriveContents(GoogleApiClient apiClient, ResultCallback callback) {
        Drive.DriveApi.newDriveContents(apiClient)
            .setResultCallback(callback);
    }
    

    但是,您仍然需要对GoogleApiClient对象的引用
    因为没有客户机绑定到任何一个活动,所以可以将其移动到单例中,以便从任何地方访问一个客户机实例

    比如

    btn3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           MainActivity.createDriveContents(
               GoogleClientWrapper.getInstance().getClient(), // A GoogleApiClient instance
               new ResultCallback() {
                   // TODO: Implement
               });
        }
    });
    

    如果您可以访问第二个类中的Google客户端,只需直接传入API客户端对象


    或者,抽象到一个级别,您可以提供一个Context,然后重新构建客户机

    public static void createDriveContents(Context context, ResultCallback callback) {
    
        GoogleApiClient client = new GoogleApiClient.Builder(context);
        // TODO: add scopes to client
    
        Drive.DriveApi.newDriveContents(apiClient)
            .setResultCallback(callback);
    }
    

    使用这种方法,我们假设第二个类是另一个没有自己的Google客户端的活动

    btn3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           MainActivity.createDriveContents(
               SecondClass.this, // A Context instance
               new ResultCallback() {
                   // TODO: Implement
               });
        }
    });
    
  3. # 3 楼答案

    像这样做

    btn3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
         ((MainActivity) getActivity()).onClickCreateFile(v);
        }
    });
    

    我认为它会奏效

  4. # 4 楼答案

    您可以创建一个处理程序类,如下所示:

    public static class ClickHandler {
    
        private ClickHandler mInstance;
    
    
        public static ClickHandler getInstance(){
            if(mInstance == null){
                mInstance = new ClickHandler();
            }
            return mInstance; 
        }
    
    
        public void onClickCreateFile(View view) {
    
             fileOperation = true;
    
             // create new contents resource
             Drive.DriveApi.newDriveContents(mGoogleApiClient)
            .setResultCallback(driveContentsCallback);
    
        }
    
    }
    

    然后,无论你在哪里需要它:

    btn3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ClickHandler.getInstance().onClickCreateFile(view);
        }
    });