Android: Fragment 无法转换为 Context

12 浏览
0 Comments

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 List 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() {
        @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谢谢!

0
0 Comments

public class _6_ViewAll extends Fragment {

private AppCompatTextView textViewName;

private RecyclerView recyclerViewUsers;

private List listUsers;

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的问题了。

0
0 Comments

在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的上下文。上述方法可以帮助我们解决这个问题,并避免出现错误。

0