从不同的类android使用OnClick

时间:2017-05-24 15:17:01

标签: java android

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

按钮xml:

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

MainActivity按钮:

 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 个答案:

答案 0 :(得分:2)

这样做

phantomjs.exe

我认为它会起作用。

答案 1 :(得分:0)

只需将您调用的代码从public function testApi() { $requestContent = [ 'auth' => ['username', 'password'] 'headers' => [ 'Accept' => 'application/json', 'Content-Type' => 'application/json', ], 'json' => [ 'ids' => ["1"] ] ]; try { $client = new GuzzleHttpClient; $apiRequest = $client->request('POST', 'https://myshop/api/order', $requestContent); $response = json_decode($apiRequest->getBody()); dd($response); } catch (RequestException $re) { // For handling exception. } } 打包到另一个类中,然后从任何您想要的地方调用它

永远不要做MainActivity.onClickCreateFile()之类的事情。活动由系统管理

答案 2 :(得分:0)

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

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);
    }
});

答案 3 :(得分:0)

您无法使点击方法保持静态的原因是 1) android:onClick XML操作需要public void 2)您单击的视图属于活动的实例,而不是类。

你可以制作一个像这样的静态方法。

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

但是,您仍需要引用GoogleApiClient对象 由于没有客户端绑定到任何一个Activity,因此您可以将其移动到单个服务器中,以便从任何位置访问一个客户端实例。

例如,

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

如果您可以访问第二个类中的GoogleClient,只需直接传入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);
}

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

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