llf2580 2023-03-30 16:40 采纳率: 66.7%
浏览 62
已结题

Android Studio如何获取fragment的context?

诚信求一个答案,能解决问题必定采纳!
我定义了数据库DBHelper继承SQLiteOpenHelper,MainActivity里放置四个滑动的fragment,里面fragment要打开数据库要怎么写?context一直填不对。
fragment有空的构造方法CommunityFragment()、自带的onCreateView(),还有一个自己写的onActivityCreated()方法,通过getActivity().findViewById()获取控件的代码都写在onActivityCreated()方法里。
我想知道DBHelper dbHelper = new DBHelper(context);这句应该写在哪里?是最外层还是哪个方法内部?
上面的context应该填什么?
我写在最外层,然后填getActivity().getApplicationContext()、getContent()没有成功
写在onActivityCreated()里,再填getActivity().getApplicationContext()、getContent()还是没有成功。
DBHelper代码:

public class DBHelper extends SQLiteOpenHelper {
    //声明数据库名,版本号,表名
    private static final String DB_NAME = "DB_ChangShou.db";
    private static final int DB_VERSION = 1;
    public static final String table_Accounts = "Accounts";

    public DBHelper(Context context) {
        super(context,DB_NAME,null,DB_VERSION);//上下文,数据库名,空,版本号
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        //创建用户信息数据表Accounts:_id,账号,昵称,密码
        String sql = "CREATE TABLE IF NOT EXISTS "+DBHelper.table_Accounts+"(_id INTEGER PRIMARY KEY AUTOINCREMENT,account VARCHAR(20),name VARCHAR(20),password VARCHAR(10))";
        db.execSQL(sql);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }
}

MainActivity代码:

public class MainActivity extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener, ViewPager.OnPageChangeListener {
    ViewPager viewPager;
    BottomNavigationView bottomNavigationView;
    HomeFragment homeFragment = new HomeFragment();
    CommunityFragment communityFragment = new CommunityFragment();
    MallFragment mallFragment = new MallFragment();
    MineFragment mineFragment = new MineFragment();
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();//初始化
    }
    private void init() {
        //获取页面标签对象
        viewPager = findViewById(R.id.viewPager);
        viewPager.setOnPageChangeListener(this);//添加页面切换监视器
        bottomNavigationView = findViewById(R.id.bottomNavigation);
        bottomNavigationView.setOnNavigationItemSelectedListener(this);//添加导航栏选择监视器
        viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {//给页面添加适配器
            @NonNull
            @Override
            public Fragment getItem(int position) {
                switch(position) {
                    case 0:return homeFragment;
                    case 1:return communityFragment;
                    case 2:return mallFragment;
                    case 3:return mineFragment;
                }
                return null;
            }
            @Override
            public int getCount() {//界面个数
                return 4;
            }
        });
    }
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {    }
    @Override
    public void onPageSelected(int position) {
        bottomNavigationView.getMenu().getItem(position).setChecked(true);
    }
    @Override
    public void onPageScrollStateChanged(int state) {    }
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        viewPager.setCurrentItem(item.getOrder());
        return true;
    }
}

fragment代码:

public class MineFragment extends Fragment {
    public MineFragment() {
        // Required empty public constructor
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_mine, container, false);
        // Inflate the layout for this fragment
        return view;
    }
    //前面代码是创建fragment时自动生成的,删除了多余的,上面两个方法没有动,自己写的代码在onActivityCreated()里
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        // 这里数据库没有打开,显示空指针错误,可能是context出了问题
        DBHelper dbHelper = new DBHelper(getContext());
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        // 点击“修改身材”按钮
        //控件都是通过加上getActivity()获取的
        Button btnModifyFigure = getActivity().findViewById(R.id.mine_button_modifyFigure);
        btnModifyFigure.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getContext(), ModifyFigureActivity.class);
                startActivity(intent);
            }
        });
    }
}
  • 写回答

5条回答 默认 最新

  • Z01_77328519 2023-03-30 17:00
    关注

    回答引用ChatGPT:您可以在fragment的onActivityCreated()方法中获取context,因为在此方法中,fragment已经与activity关联并且activity的onCreate()方法已经完成。

    在onActivityCreated()方法中,您可以使用以下代码获取context:

    Context context = getContext();
    

    如果您使用的是support库,则可以使用以下代码:

    Context context = requireContext();
    

    然后,您可以使用获取到的context创建DBHelper对象,如下所示:

    DBHelper dbHelper = new DBHelper(context);
    

    在您的代码示例中,您可以在MineFragment的onActivityCreated()方法中使用以下代码来打开数据库:

    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    
        DBHelper dbHelper = new DBHelper(requireContext());
        SQLiteDatabase db = dbHelper.getReadableDatabase();
    
        Button btnModifyFigure = getActivity().findViewById(R.id.mine_button_modifyFigure);
        btnModifyFigure.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getContext(), ModifyFigureActivity.class);
                startActivity(intent);
            }
        });
    }
    

    如果数据库在访问时没有正确打开,则会抛出NullPointerException异常。您可能需要检查您的DBHelper类以确保它正确地创建和打开数据库。

    在Fragment中获取Context的最佳方式是通过调用getContext()方法来获取。所以你可以在onCreate()或onCreateView()方法中获取Context。在这个例子中,你可以在onCreateView()方法中获取Context,并将其传递给DBHelper类的构造函数。

    你可以在onCreateView()方法中添加以下代码:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_mine, container, false);
        DBHelper dbHelper = new DBHelper(getContext());
        SQLiteDatabase db = dbHelper.getReadableDatabase();
    
        Button btnModifyFigure = view.findViewById(R.id.mine_button_modifyFigure);
        btnModifyFigure.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getContext(), ModifyFigureActivity.class);
                startActivity(intent);
            }
        });
    
        return view;
    }
    

    在这里,getContext()方法将返回与Fragment关联的上下文,你可以将其传递给DBHelper类的构造函数来打开数据库。在此之后,你可以像正常使用数据库一样使用它。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 4月8日
  • 已采纳回答 3月31日
  • 创建了问题 3月30日

悬赏问题

  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥80 部署运行web自动化项目