添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

最近在项目中遇到一个问题,在项目中,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的时,FragmentBlistview还没有把数据加载出来时再次切换到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