从另一个 .java 类调用 onClick 函数

Posted

技术标签:

【中文标题】从另一个 .java 类调用 onClick 函数【英文标题】:Calling an onClick funtion from another .java class 【发布时间】:2021-09-09 15:35:25 【问题描述】:

我一直在开发一个 android 应用程序,碰巧它具有三个调用相同 OnClick 函数的活动,根据下面的代码应该打开一个 Intent.ACTION.PICK 。我想从一个类中调用一个方法,而不是每次都输入它。我查看了不同的代码并尝试了,但它们没有按我的意愿工作。

我的示例工作代码如下:

MainActivity.java

import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import java.util.Arrays;

public class MainActivity extends AppCompatActivity 
    EditText editTextNumber;
    ImageView pickContact;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editTextNumber = findViewById(R.id.editTextNumber);
        pickContact = findViewById(R.id.pickContact);

        pickContact.setOnClickListener(v -> 
            Intent intent = new Intent(Intent.ACTION_PICK);
            intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
            startActivityForResult(intent, 1);
        );
    

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) 
        super.onActivityResult(requestCode, resultCode, data);
        if (data != null) 
            Uri uri = data.getData();
            if (uri != null) 
                try (Cursor c = getContentResolver().query(uri, new String[]
                                ContactsContract.CommonDataKinds.Phone.NUMBER,
                                ContactsContract.CommonDataKinds.Phone.TYPE,
                        null, null, null)) 
                    if (c != null && c.moveToFirst()) 
                        String number = c.getString(0);
                        int type = c.getInt(1);
                        showSelectedNumber(type, number);
                    
                
            
        
    

    public void showSelectedNumber(int type, String number) 
        Toast.makeText(this, type + ": " + number, Toast.LENGTH_SHORT).show();
        editTextNumber.setText(number);
    

我想迁移

@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) 
        super.onActivityResult(requestCode, resultCode, data);
        if (data != null) 
            Uri uri = data.getData();
            if (uri != null) 
                try (Cursor c = getContentResolver().query(uri, new String[]
                                ContactsContract.CommonDataKinds.Phone.NUMBER,
                                ContactsContract.CommonDataKinds.Phone.TYPE,
                        null, null, null)) 
                    if (c != null && c.moveToFirst()) 
                        String number = c.getString(0);
                        int type = c.getInt(1);
                        showSelectedNumber(type, number);
                    
                
            
        
    

    public void showSelectedNumber(int type, String number) 
        Toast.makeText(this, type + ": " + number, Toast.LENGTH_SHORT).show();
        editTextNumber.setText(number);
    

也许

Intent intent = new Intent(Intent.ACTION_PICK);
            intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
            startActivityForResult(intent, 1);

到另一个类ContactPickerHandler.java,这样我就不会在每个活动中重复该代码。 two activities photo.

【问题讨论】:

【参考方案1】:

我认为你不能将整个 onActivityResult 迁移到另一个类,但你可以迁移其他东西。

假设你有 ContactPickerHandler.java 类,所以对于 Intent 打开机制你可以创建如下函数

public void openPicker(Context context)
            Intent intent = new Intent(Intent.ACTION_PICK);
            intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
            context.startActivityForResult(intent, 1);

然后你可以在你的onClick机制中这样调用它

pickContact.setOnClickListener(v -> 
           contactPickerHandler.openPicker(this)
        );

同样,您可以对一个通用函数执行整个解析机制。您将需要再次传递 Uri 和 Context 并返回一个字符串对象和 int 类型和数字。

【讨论】:

【参考方案2】:

对于onStartActivityForResult,我认为你不能将它移到另一个类。但是对于按钮启动选择器,您可以创建一个实现 View.OnClickListener 的新类并通过构造函数传递上下文。

public class CustomOnClick implements View.OnClickListener 

    private Context context;

    public CustomOnClick(Context context)
        this.context = context;
    

    @Override
    public void onClick(View v) 
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
        ((Activity)context).startActivityForResult(intent, 1);
    

要使用它,创建它的新对象并设置为按钮监听器。您需要传递上下文,以便您可以调用 startActivityForResult 并且程序知道将结果发送到哪里。

pickContact.setOnClickListener(new CustomOnClick(this));

对于onActivityResult,因为你不能移动它,也许你可以创建一个新的静态函数来处理结果,传递数据和上下文,并在你的onActivityResult中调用它。您需要上下文,以便您可以调用 getContentResolver()。

public static String processData(Uri uri, Context context)
    ...
    Cursor c = context.getContentResolver()....
    ...

【讨论】:

以上是关于从另一个 .java 类调用 onClick 函数的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 java 函数没有从另一个类的输出调用?

在java中从另一个调用一个构造函数[重复]

如何从另一个类调用方法函数?

如何在 Java 中从另一个构造函数调用一个构造函数?

如何在 Java 中从另一个构造函数调用一个构造函数?

Android在C ++ JNI代码中从另一个活动类调用Java函数