Android: Fragment 无法转换为 Context
Android: Fragment 无法转换为 Context
我有一个应用程序,在其中我使用sqlite作为我的数据库,其中有登录和注册功能。用户还可以查看所有帐户。在我的视图类中,我使用了一个片段,但是我收到一个错误,错误消息是“错误:(58, 55)错误:不兼容的类型:_6_ViewAll无法转换为Context”,在这一行\n
databaseHelper = new DatabaseHelper(_6_ViewAll.this);
\n我该如何解决这个问题?\n这是我的源代码:\n_6_ViewAll.java\n
public class _6_ViewAll extends Fragment { private AppCompatTextView textViewName; private RecyclerView recyclerViewUsers; private ListlistUsers; 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 () { @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(); } }
\n谢谢!
public class _6_ViewAll extends Fragment {
private AppCompatTextView textViewName;
private RecyclerView recyclerViewUsers;
private List
private UsersRecyclerAdapter usersRecyclerAdapter;
private DatabaseHelper databaseHelper;
View myView;
public View onCreateView(LayoutInflater inflater, 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() {
new AsyncTask
protected Void doInBackground(Void... params) {
listUsers.clear();
listUsers.addAll(databaseHelper.getAllUser());
return null;
}
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
usersRecyclerAdapter.notifyDataSetChanged();
}
}.execute();
}
}
在上述代码中,我们可以看到在Fragment的initObjects方法中,使用了getContext()方法获取Context对象,而在getDataFromSQLite方法中,使用了getActivity().getIntent()方法获取Activity对象。这就导致了Fragment中的代码无法转换为Context对象的错误。
为了解决这个问题,我们可以在Fragment中使用getActivity()方法来获取Context对象,替换掉原来的getContext()方法。代码如下:
databaseHelper = new DatabaseHelper(getActivity());
这样就可以解决Fragment无法转换为Context的问题了。
在Android开发中,有一个常见的错误是将Fragment转换为Context。这个错误通常发生在使用Fragment相关的类时。那么为什么会出现这个错误呢?
问题的根本原因是Fragment不是Context类型。因此,我们需要使用正确的方法来获取Fragment的上下文。根据API级别的不同,我们可以使用不同的方法来解决这个问题。
在API级别23及更高版本中,我们可以使用Fragment.getContext()方法来获取Fragment的上下文。示例如下:
public void onAttach(Activity activity) { super.onAttach(activity); if (activity != null && databaseHelper != null) { databaseHelper = new DatabaseHelper(activity.getApplicationContext()); } }
在较低的API级别中,我们可以使用Fragment.getActivity()方法来获取Fragment所在的Activity,并从中获取上下文。示例如下:
public void onAttach(Context context) { super.onAttach(context); if (context != null) { databaseHelper = new DatabaseHelper(context.getApplicationContext()); } }
需要注意的是,这个方法目前同时调用了两个onAttach方法。
如果你想为onAttach(activity)方法做准备,也可以实现onAttach(context)方法,但不要依赖它。示例如下:
(Build.VERSION_CODES.M) 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()); } }
在使用Fragment相关的类时,需要注意将Fragment转换为Context的问题。根据API级别的不同,我们可以使用不同的方法来获取Fragment的上下文。上述方法可以帮助我们解决这个问题,并避免出现错误。