Android:Fragment无法转换为Context

时间:2017-09-01 15:46:59

标签: java android android-fragments

我有一个应用程序,我使用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();
}
 }

谢谢!

2 个答案:

答案 0 :(得分: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());
    }
}

公平地警告说,目前这两种方法都需要调用。

答案 1 :(得分:0)

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();
}
 }

我已经编辑了您的课程以使用正确的上下文。但是请注意,如果您愿意,也可以获得应用程序级别上下文,当您执行与活动没有直接关系的内容时,这会派上用场。