【问题标题】:Calling an onClick funtion from another .java class从另一个 .java 类调用 onClick 函数
【发布时间】: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.

【问题讨论】:

    标签: java android android-studio android-intent


    【解决方案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()....
          ...
      }
      

      【讨论】:

        猜你喜欢
        • 2023-04-04
        • 2019-06-02
        • 1970-01-01
        • 2016-04-06
        • 2018-07-30
        • 1970-01-01
        • 2017-09-25
        • 1970-01-01
        • 2017-08-10
        相关资源
        最近更新 更多