从另一个 .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 函数的主要内容,如果未能解决你的问题,请参考以下文章