Android:片段无法转换为上下文[重复]
Posted
技术标签:
【中文标题】Android:片段无法转换为上下文[重复]【英文标题】:Android: Fragment cannot be converted to Context [duplicate] 【发布时间】:2018-02-10 17:33:37 【问题描述】:我有一个应用程序,我在其中使用 sqlite 作为我的数据库,其中有一个登录和注册。用户还可以查看所有帐户。在我的视图类中,我使用了一个片段,但在这一行中收到一条错误消息:“错误:(58, 55) 错误:不兼容的类型:_6_ViewAll 无法转换为上下文”
databaseHelper = new DatabaseHelper(_6_ViewAll.this);
我该如何解决这个问题?
这是我的源代码:
_6_ViewAll.java
public class _6_ViewAll extends Fragment
private AppCompatTextView textViewName;
private RecyclerView recyclerViewUsers;
private List<UserInfo> listUsers;
private UsersRecyclerAdapter usersRecyclerAdapter;
private DatabaseHelper databaseHelper;
View myView;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState)
myView = inflater.inflate(R.layout.activity__6__view_all, container, false);
textViewName = (AppCompatTextView) getView().findViewById(R.id.textViewName);
recyclerViewUsers = (RecyclerView) getView().findViewById(R.id.recycleViewUsers);
initObjects();
return myView;
private void initObjects()
listUsers = new ArrayList<>();
usersRecyclerAdapter = new UsersRecyclerAdapter(listUsers);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext());
recyclerViewUsers.setLayoutManager(mLayoutManager);
recyclerViewUsers.setItemAnimator(new DefaultItemAnimator());
recyclerViewUsers.setHasFixedSize(true);
recyclerViewUsers.setAdapter(usersRecyclerAdapter);
databaseHelper = new DatabaseHelper(_6_ViewAll.this);
String emailFromIntent = getActivity().getIntent().getStringExtra("EMAIL");
textViewName.setText(emailFromIntent);
getDataFromSQLite();
private void getDataFromSQLite()
// AsyncTask is used that SQLite operation not blocks the UI Thread.
new AsyncTask<Void, Void, Void>()
@Override
protected Void doInBackground(Void... params)
listUsers.clear();
listUsers.addAll(databaseHelper.getAllUser());
return null;
@Override
protected void onPostExecute(Void aVoid)
super.onPostExecute(aVoid);
usersRecyclerAdapter.notifyDataSetChanged();
.execute();
谢谢!
【问题讨论】:
databaseHelper = new DatabaseHelper(getContext());应该工作。Fragment
类不扩展 Context
这就是为什么你不能转换它但Activity
可以,使用getActivity()
方法来获取上下文。
正如@VasylGlodan 所说,Fragment 不扩展 Context 类,但 Fragment 由扩展或实现 Context 对象的类(直接或间接)显示,因此您可以使用 getContext( ) 方法,或者您始终可以使用 getActivity() 方法获取负责显示 Fragment 对象的 Activity 对象,并可以访问 Activity 的所有公共功能。
@VasylGlodan:我已经使用了 getActivity() 但我的视图类让我的应用程序强制关闭
【参考方案1】:
Fragment
不是 Context
对于 API 级别 23 及更高级别,您可以使用 Fragment.getContext():
否则使用Fragment.getActivity()。由于您正在创建与 SQLite 关联的数据库类,因此我建议使用 Fragment.getActivity().getApplicationContext()。
Fragment
代码中的示例:
@Override
public void onAttach(Activity activity)
super.onAttach(activity);
if (activity != null && databaseHelper != null)
databaseHelper = new DatabaseHelper(activity.getApplicationContext());
如果要准备弃用onAttach(activity) 也可以实现,但不要依赖:
@TargetApi(Build.VERSION_CODES.M)
@Override
public void onAttach(Context context)
super.onAttach(context);
// Calling super.onAttach(context) will also call super.Attach(activty)
if (context != null)
databaseHelper = new DatabaseHelper(context.getApplicationContext());
请注意,目前这两种方法都调用了 onAttach 方法。
【讨论】:
【参考方案2】:public class _6_ViewAll extends Fragment
private AppCompatTextView textViewName;
private RecyclerView recyclerViewUsers;
private List<UserInfo> listUsers;
private UsersRecyclerAdapter usersRecyclerAdapter;
private DatabaseHelper databaseHelper;
View myView;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState)
myView = inflater.inflate(R.layout.activity__6__view_all, container, false);
textViewName = (AppCompatTextView) getView().findViewById(R.id.textViewName);
recyclerViewUsers = (RecyclerView) getView().findViewById(R.id.recycleViewUsers);
initObjects();
return myView;
private void initObjects()
listUsers = new ArrayList<>();
usersRecyclerAdapter = new UsersRecyclerAdapter(listUsers);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext());
recyclerViewUsers.setLayoutManager(mLayoutManager);
recyclerViewUsers.setItemAnimator(new DefaultItemAnimator());
recyclerViewUsers.setHasFixedSize(true);
recyclerViewUsers.setAdapter(usersRecyclerAdapter);
databaseHelper = new DatabaseHelper(getContext()/*or use getActivity()*/);
String emailFromIntent = getActivity().getIntent().getStringExtra("EMAIL");
textViewName.setText(emailFromIntent);
getDataFromSQLite();
private void getDataFromSQLite()
// AsyncTask is used that SQLite operation not blocks the UI Thread.
new AsyncTask<Void, Void, Void>()
@Override
protected Void doInBackground(Void... params)
listUsers.clear();
listUsers.addAll(databaseHelper.getAllUser());
return null;
@Override
protected void onPostExecute(Void aVoid)
super.onPostExecute(aVoid);
usersRecyclerAdapter.notifyDataSetChanged();
.execute();
我已编辑您的课程以使用正确的上下文。请注意,如果您愿意,您也可以获取应用程序级别的上下文,这在您执行与活动不直接相关的事情时会派上用场。
【讨论】:
以上是关于Android:片段无法转换为上下文[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Android - 上下文 - Google Maps V2 - 类型不匹配:无法从 Object 转换为 WindowManager