最近在项目中遇到一个问题,在项目中,Fragment中的一个图标,需要在点击缩放动画完成后,跳转到另一个界面,但是经常会出现getActivity()或getContext()方法返回值为空的问题。在网上查找了很多解决方案,大概有以下几种:
1. 根据fragment的生命周期,将方法的调用写到onStart()方法内部。我将方法的调用写到了onResume()方法中,都同样会出现空指针。
2. 不使用getActivity()和getContext()方法,重写onAttach()方法,自定义一个Context,获取onAttach()时,传入的context。试了这个方法,一样会出现异常。
3. 使用applicationContext(),试了这个方法,同样会出现异常,异常的信息为Fragment not attached to Activity。
4. 还有的说是因为Activity被回收,需要对onSaveBundle()方法做相关处理,但是我是在当前Acitivity刚打开的时候就会出现这个问题,并没有进行切换。
使用了第二种方式,自定义了一个Context,接收onAttach()方法中传入的context,然后在onDetach()方法中释放引用 context = null; 同样出现了空指针异常。
@Override
public void onResume() {
super.onResume();
// 设置点击事件
imgType.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(context != null) { // 判断是否已经添加到了Activity中
LogZS.d(TAG+"->onClick","Context值为"+context.toString());
showRoom();
private void showRoom(){
// 点击反馈的动画
ValueAnimator valueAnimator = ValueAnimator.ofFloat(1.0f,1.1f,1.0f);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue();
imgType.setScaleX(value);
imgType.setScaleY(value);
valueAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
LogZS.d(TAG+"->onAnimationStart","动画开始");
@Override
public void onAnimationEnd(Animator animation) {
LogZS.d(TAG+"->onAnimationEnd","Context为:"+context.toString());
Intent intent = new Intent(context, RoomDetailActivity.class); // 报错位置
intent.putExtra("roomNum", grpNo);
startActivity(intent);
@Override
public void onAnimationCancel(Animator animation) {
@Override
public void onAnimationRepeat(Animator animation) {
valueAnimator.setDuration(350);
valueAnimator.start();
通过日志打印看到,在方法调用前,context是不为空的,动画可以执行,日志有输出,但是在动画执行完之后,context为空。
所以我猜测,应该是动画执行的时候触发了Fragment的onDetach()方法释放了context,于是加了打印的日志。
@Override
public void onDetach() {
super.onDetach();
context = null;
LogZS.d(TAG+"->onDetach","Context被清空");
日志打印的结果,发现”Context被清空”的信息调用了多次,也就是说onDetach()方法被调用了多次,我是ViewPager中显示的fragment,
所以猜测问题原因可能是每次viewPager刷新数据源adapter.notifyDataSetChange()时,导致的fragment调用了onDetach()方法,
于是在数据源刷新出增加日志输出。
LogZS.e(TAG + "->loadRoom", "LoadRoom被调用");
adapter.notifyDataSetChanged();
结果”loadRoom被调用”打印的次数和”Context被清空的次数相同”。
所以问题的原因就是数据源刷新的时候,viewPager中的fragment从activity上分离,所以才会出现异常。
在知道了问题原因的基础下,使用以上任何一中解决方案都没有问题,前提是,在代码执行之前,要调用isAdd()方法,进行判断,确保fragment
与Activity的状态是关联的状态。
问题描述 最近在项目中遇到一个问题,在项目中,Fragment中的一个图标,需要在点击缩放动画完成后,跳转到另一个界面,但是经常会出现getActivity()或getContext()方法返回值为空的问题。在网上查找了很多解决方案,大概有以下几种: 1. 根据fragment的生命周期,将方法的调用写到onStart()方法内部。我将方法的调用写到了onResume()方法中,都同样会
在日常开发中的时候,我们经常会使用ViewPager+Fragment进行视图滑动,在某些部分逻辑也许我们需要利用上下文Context(例如基本的Toast),但是由于Fragment只是依附在Activity容器的一个试图,如果需要拿到当前的Activity的上下文Context就必须通过getActivity()获取。
然而,不知道各位程序猿有没有遇过出现getActivity()出现null的时候导致程序报出空指针异常。
其实原因可以归结于因为我们在:
(一)切换fragment的时候,会频繁被crash
(二)系统内存不足
(三)横竖屏幕切换的时候
最近在搞蓝牙通信的时候碰到一个很恼火的问题,就是在Fragment中使用activity的方法,,,new一个activity老是报空指针。
解决方法:
在Fragment的onAttach(Context context)方法中调用(activity)getActivity()即可解决;
哈哈,很简单吧。。。
转载于:https://www....
MainActivity.this:表示MainActivity对象,一般用在内部类中指示外面的this,如果在内部类直接用this,指示的是内部类本身。因为MainActivity继承Activity,而Activity继承Context,所以它也可以用来提供Activity Contex;
this:表示当前对象;一般而言,在哪个类中调用,就是指向该对象。
getContext():这个是Vie
1.在Fragment中找到getContext()方法如下:
* Return the {@link Context} this fragment is currently associated with.
public Context getContext() {
return mHost == null ? null : mHost.getContext();
做一个小项目的时候遇到了一个空指针问题, 项目的大概是这样FragmentA中是一些普通布局,FragmentB中是一个listview显示数据,当我从FragmentA中点击 到FragmentB的时,FragmentB中listview还没有把数据加载出来时再次切换到FragmentA就会发现闪退异常空指针
然后我看了一下原因发现FragmentB里的listview适配器中的Conte
<script type="text/javascript">
var canvas = document.getElementById("canvas");
var can = canvas.getContext("2d");
can.fillStyle = "#990099";
can.fillRect(0, 0, 5...
在Fragment中使用findViewById方法,需要先获取Fragment的根视图,然后再通过根视图调用findViewById方法来查找对应的视图控件。具体步骤如下:
1. 在Fragment的onCreateView方法中,通过LayoutInflater的inflate方法将布局文件转换成View对象,并返回该View对象作为Fragment的根视图。
2. 在Fragment的onViewCreated方法中,通过根视图调用findViewById方法来查找对应的视图控件,并将其赋值给成员变量。
例如,在Fragment中查找一个TextView控件的代码如下:
public class MyFragment extends Fragment {
private TextView mTextView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_layout, container, false);
return rootView;
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mTextView = view.findViewById(R.id.text_view);
在上面的代码中,我们先通过LayoutInflater的inflate方法将布局文件fragment_layout转换成View对象,并将其作为Fragment的根视图返回。
然后,在onViewCreated方法中,我们通过根视图view调用findViewById方法来查找id为text_view的TextView控件,并将其赋值给成员变量mTextView。这样,在Fragment的其他方法中就可以直接使用mTextView来操作TextView控件了。
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView