如何在 ListView Adapter class 中获取 Activity 引用?
How to get Activity reference in ListView Adapter class?
我正在尝试通过单击需要 Activity 作为第一个参数的按钮从列表适配器 class 请求 phone 调用权限。
ActivityCompat.requestPermissions(mContext, new String[]{Manifest.permission.CALL_PHONE},1 );
这里的 mContext 是从 activity 之一传递过来的。但它显示错误:
Wrong 1st argument type. Found: 'android.content.Context', required: 'android.app.Activity'.
我试图传递每个上下文以及 getParent() activity 但它不起作用。
有没有办法获取 Activity 并在列表适配器中使用它?
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
dialNumber(employee.get(i).getNumber());
}
else
{
Log.i(TAG, "onClick: you don't have permission to call");
ActivityCompat.requestPermissions(mContext, new String[]{Manifest.permission.CALL_PHONE},1 );
}
Log.i(TAG, "onClick: Wroks " + getItemId(i));
}
这是按钮点击监听器的完整代码。
谢谢。
如果您确定 mContext 是 Activity 类型,就这样转换它
ContextCompat.checkSelfPermission((Activity) mContext, Manifest.permission.CALL_PHONE)
将 Activity 上下文传递给 Adapter 构造函数
像这样 // 假设你在 activity
工作
ListAdapter listAdapter = new ListAdapter(this)
在您的适配器中
public class ListAdapter extends BaseAdapter {
Context context;
LayoutInflater layoutInflater;
public ListAdapter (Context context) {
this.context = context;
}
现在在适配器中使用你想要的上下文
ContextCompat.checkSelfPermission((Activity) context, Manifest.permission.CALL_PHONE);
在适配器 class 中引用 Activity 是一种糟糕的方法。任何应该在 activity class 中完成的事情,例如 UI 更改、显示对话框等,都不应在其他任何地方完成,而只能在 activity 本身中完成。
解法:
1) 创建接口
public interface MyListener {
void doSomething(Params... params);
}
2) 在Activityclass
中实现
class MyActivity extends AppCompatActivity implements MyListener{
new MyAdapter(this);
void doSomething(Params... params){
//Request Permission here
}
}
3) 在 Adapter 中这样使用 class
class MyAdapter extends .....{
MyListener myListener;
MyAdapter(Context mContext){
if(mContext instanceOf MyListener)
myListener = (MyListener) mContext;
}
void anotherFunction(){
myListener.doSomething(Params... params)
}
}
以上答案非常有用,但如果上下文没有转换为 activity 并且应用程序在运行时崩溃,就像我的情况一样,那么您也可以通过适配器 [= 的构造函数传递 activity 19=]像这样。
private Context context;
private ArrayList<String> pathsList;
private Activity activity;
public Adapter(Context context, Activity activity, ...) {
this.context = context;
this.activity = activity;
...
}
然后在您的代码中使用此 activity:
ContextCompat.checkSelfPermission(activity,
Manifest.permission.CALL_PHONE);
我正在尝试通过单击需要 Activity 作为第一个参数的按钮从列表适配器 class 请求 phone 调用权限。
ActivityCompat.requestPermissions(mContext, new String[]{Manifest.permission.CALL_PHONE},1 );
这里的 mContext 是从 activity 之一传递过来的。但它显示错误:
Wrong 1st argument type. Found: 'android.content.Context', required: 'android.app.Activity'.
我试图传递每个上下文以及 getParent() activity 但它不起作用。 有没有办法获取 Activity 并在列表适配器中使用它?
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
dialNumber(employee.get(i).getNumber());
}
else
{
Log.i(TAG, "onClick: you don't have permission to call");
ActivityCompat.requestPermissions(mContext, new String[]{Manifest.permission.CALL_PHONE},1 );
}
Log.i(TAG, "onClick: Wroks " + getItemId(i));
}
这是按钮点击监听器的完整代码。
谢谢。
如果您确定 mContext 是 Activity 类型,就这样转换它
ContextCompat.checkSelfPermission((Activity) mContext, Manifest.permission.CALL_PHONE)
将 Activity 上下文传递给 Adapter 构造函数
像这样 // 假设你在 activity
工作 ListAdapter listAdapter = new ListAdapter(this)
在您的适配器中
public class ListAdapter extends BaseAdapter {
Context context;
LayoutInflater layoutInflater;
public ListAdapter (Context context) {
this.context = context;
}
现在在适配器中使用你想要的上下文
ContextCompat.checkSelfPermission((Activity) context, Manifest.permission.CALL_PHONE);
在适配器 class 中引用 Activity 是一种糟糕的方法。任何应该在 activity class 中完成的事情,例如 UI 更改、显示对话框等,都不应在其他任何地方完成,而只能在 activity 本身中完成。
解法:
1) 创建接口
public interface MyListener {
void doSomething(Params... params);
}
2) 在Activityclass
中实现class MyActivity extends AppCompatActivity implements MyListener{
new MyAdapter(this);
void doSomething(Params... params){
//Request Permission here
}
}
3) 在 Adapter 中这样使用 class
class MyAdapter extends .....{
MyListener myListener;
MyAdapter(Context mContext){
if(mContext instanceOf MyListener)
myListener = (MyListener) mContext;
}
void anotherFunction(){
myListener.doSomething(Params... params)
}
}
以上答案非常有用,但如果上下文没有转换为 activity 并且应用程序在运行时崩溃,就像我的情况一样,那么您也可以通过适配器 [= 的构造函数传递 activity 19=]像这样。
private Context context;
private ArrayList<String> pathsList;
private Activity activity;
public Adapter(Context context, Activity activity, ...) {
this.context = context;
this.activity = activity;
...
}
然后在您的代码中使用此 activity:
ContextCompat.checkSelfPermission(activity,
Manifest.permission.CALL_PHONE);