Android 如何在ListView适配器类中获取活动引用?
我试图通过单击一个按钮从列表适配器类请求电话呼叫权限,该按钮需要活动作为第一个参数Android 如何在ListView适配器类中获取活动引用?,android,listview,android-activity,android-context,listadapter,Android,Listview,Android Activity,Android Context,Listadapter,我试图通过单击一个按钮从列表适配器类请求电话呼叫权限,该按钮需要活动作为第一个参数 ActivityCompat.requestPermissions(mContext, new String[]{Manifest.permission.CALL_PHONE},1 ); 这里,mContext是从一个活动传递的。但它显示出错误: Wrong 1st argument type. Found: 'android.content.Context', required: 'android.app.
ActivityCompat.requestPermissions(mContext, new String[]{Manifest.permission.CALL_PHONE},1 );
这里,mContext是从一个活动传递的。但它显示出错误:
Wrong 1st argument type. Found: 'android.content.Context', required: 'android.app.Activity'.
我试图传递每个上下文以及getParent()活动,但它不起作用。
有没有办法获取活动并在列表适配器中使用它
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)
如果您确定mContext是Activity类型,只需像这样强制转换它
ContextCompat.checkSelfPermission((Activity) mContext, Manifest.permission.CALL_PHONE)
将活动上下文传递给适配器构造函数 像这样//假设你在活动中工作
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);
将活动上下文传递给适配器构造函数 像这样//假设你在活动中工作
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);
在适配器类中引用活动是一种糟糕的方法。任何应该在activity类内完成的操作,如UI更改、显示对话框等,都不应该在其他任何地方完成,而应该从activity本身完成 解决方案:
1) 创建一个接口
public interface MyListener {
void doSomething(Params... params);
}
2) 在活动类中实现它
class MyActivity extends AppCompatActivity implements MyListener{
new MyAdapter(this);
void doSomething(Params... params){
//Request Permission here
}
}
3) 在适配器类中这样使用
class MyAdapter extends .....{
MyListener myListener;
MyAdapter(Context mContext){
if(mContext instanceOf MyListener)
myListener = (MyListener) mContext;
}
void anotherFunction(){
myListener.doSomething(Params... params)
}
}
在适配器类中引用活动是一种糟糕的方法。任何应该在activity类内完成的操作,如UI更改、显示对话框等,都不应该在其他任何地方完成,而应该从activity本身完成 解决方案:
1) 创建一个接口
public interface MyListener {
void doSomething(Params... params);
}
2) 在活动类中实现它
class MyActivity extends AppCompatActivity implements MyListener{
new MyAdapter(this);
void doSomething(Params... params){
//Request Permission here
}
}
3) 在适配器类中这样使用
class MyAdapter extends .....{
MyListener myListener;
MyAdapter(Context mContext){
if(mContext instanceOf MyListener)
myListener = (MyListener) mContext;
}
void anotherFunction(){
myListener.doSomething(Params... params)
}
}
ActivityCompat.requestPermissions实际上需要活动实例,而不是上下文。将
mContext
Context的类型更改为活动。我也尝试了,但没有工作在适配器类中创建接口并从活动传递回调。所以,点击按钮,回调将进入活动,现在您可以传递任何您想要的上下文。您是在活动中还是在片段中?如果上下文来自某个活动,则可以通过执行(活动)将其强制转换为活动mContext@NicolaGallazzi列出适配器classActivityCompat.requestPermissions实际上需要的是活动实例,而不是上下文。将mContext
Context的类型更改为活动。我也尝试了,但没有工作在适配器类中创建接口并从活动传递回调。所以,点击按钮,回调将进入活动,现在您可以传递任何您想要的上下文。您是在活动中还是在片段中?如果上下文来自某个活动,则可以通过执行(活动)将其强制转换为活动mContext@NicolaGallazzi列表适配器classi必须请求权限检查工作正常。我必须请求权限检查工作正常。