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

Android - 在寻呼机中获取片段的上下文

如何在android的片段中设置应用程序上下文?

片段中的 Android ListView ArrayAdapter 不起作用