我试图在单击按钮时要求从列表适配器类中获得电话许可,这需要将Activity作为第一个参数。
ActivityCompat.requestPermissions(mContext, new String[]{Manifest.permission.CALL_PHONE},1 );
此处,mContext是从活动之一传递的。但显示错误:
Wrong 1st argument type. Found: 'android.content.Context', required: 'android.app.Activity'.
我尝试传递每个上下文以及getParent()活动,但无法正常工作。 有什么方法可以获取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));
}
这是按钮单击侦听器的完整代码。
谢谢。
答案 0 :(得分:3)
在Adapter类中具有Activity的引用是一种不好的方法。在活动类中应该执行的任何操作,例如UI更改,显示对话框等,都不应该在活动之外的其他任何地方执行。
解决方案:
1)创建一个界面
public interface MyListener {
void doSomething(Params... params);
}
2)在Activity类中实现
class MyActivity extends AppCompatActivity implements MyListener{
new MyAdapter(this);
void doSomething(Params... params){
//Request Permission here
}
}
3)像这样在Adapter类中使用
class MyAdapter extends .....{
MyListener myListener;
MyAdapter(Context mContext){
if(mContext instanceOf MyListener)
myListener = (MyListener) mContext;
}
void anotherFunction(){
myListener.doSomething(Params... params)
}
}
答案 1 :(得分:1)
如果您确定mContext的类型为Activity,就可以像这样投射它
ContextCompat.checkSelfPermission((Activity) mContext, Manifest.permission.CALL_PHONE)
答案 2 :(得分:0)
将Activity上下文传递给Adapter构造器
像这样//假设您在活动中工作
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);