Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 片段上的Sensormanager(如果可见,则添加;如果不可见,则删除)_Java_Android_Android Activity_Fragment_Sensormanager - Fatal编程技术网

Java 片段上的Sensormanager(如果可见,则添加;如果不可见,则删除)

Java 片段上的Sensormanager(如果可见,则添加;如果不可见,则删除),java,android,android-activity,fragment,sensormanager,Java,Android,Android Activity,Fragment,Sensormanager,我希望在片段上有一个sensormanager,它仅在片段处于活动状态时才处于活动状态。如果用户更改了片段,则应删除侦听器 添加和删除侦听器非常简单。当片段出现/消失时,我不知道片段端有任何侦听器/函数。还有一个问题是,在几乎所有函数上,this.getActivity()返回一个空指针。在片段中保留活动引用以处理该空指针异常 下面是一个片段的示例 public class YourFragment extends Fragment { private Activity mActivi

我希望在片段上有一个sensormanager,它仅在片段处于活动状态时才处于活动状态。如果用户更改了片段,则应删除侦听器


添加和删除侦听器非常简单。当片段出现/消失时,我不知道片段端有任何侦听器/函数。还有一个问题是,在几乎所有函数上,
this.getActivity()
返回一个空指针。

在片段中保留活动引用以处理该空指针异常

下面是一个片段的示例

public class YourFragment extends Fragment {

    private Activity mActivity;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mActivity = activity;
    }

    @Override
    public void onResume() {
        super.onResume();
        // BIND sensor here with mActivity, 
        // could also be done in other fragment lifecycle events, 
        // depends on how you handle configChanges

    }

    @Override
    public void onPause() {
        super.onPause();
        // UNBIND sensor here from mActivity, 
        // could also be done in other fragment lifecycle events, 
        // depends on how you handle configChanges
    }

}
调试该代码以确定您是应该在那里处理绑定,还是应该在另一个方法(例如,onCreate of a fragment)中处理绑定。我没有为您的目的测试此代码

编辑: 正如下面所评论的,这确实是一个肮脏的修复,在某些情况下可以很容易地解析为异常。我只是想展示如何使用片段生命周期方法绑定和解除绑定带有活动引用的传感器。我现在学习片段已经有一段时间了,但仍然没有完全理解它们。我建议您查看一下所涉及的组件和其他组件的来源。这是唯一一个完整记录碎片的地方,因此在我看来,关于参考的文档并不是那么解释性的

有关空值活动的一些选项:

  • 如果您想完全确保getActivity不返回null,那么应该等待调用。这个方法告诉片段它的活动已经结束 已完成自己的活动。onCreate()。在此之后,getActivity()将不会返回null,直到FragmentManager调用initState()

     // Called by the fragment manager once this fragment has been removed,
     // so that we don't have any left-over state if the application decides
     // to re-use the instance.  This only clears state that the framework
     // internally manages, not things the application sets.
    
    void initState() {
        mIndex = -1;
        mWho = null;
        mAdded = false;
        mRemoving = false;
        mResumed = false;
        mFromLayout = false;
        mInLayout = false;
        mRestored = false;
        mBackStackNesting = 0;
        mFragmentManager = null;
        mActivity = null;
        mFragmentId = 0;
        mContainerId = 0;
        mTag = null;
        mHidden = false;
        mDetached = false;
        mRetaining = false;
        mLoaderManager = null;
        mLoadersStarted = false;
        mCheckedForLoaderManager = false;
    }
    
  • 在调用getActivity之前,始终可以通过调用isAdded()方法检查activity是否为null。正如您在下面看到的,这个方法检查mActivity是否为null。或者,您可以使用Handler.postdayed创建一个递归函数,该函数尝试在intervalls中返回非null活动(您应该添加一个max-try计数器)。但这也是一个肮脏的伎俩

    //Return true if the fragment is currently added to its activity.
    
    final public boolean isAdded() {
        return mActivity != null && mAdded;
    }
    

  • 这是我的解决方案。我试着把它从我的碎片上剪下来。如果有任何错误/语法问题,请告诉我

    public class MyFragment extends Fragment implements SensorEventListener {
        private SensorManager mSensorManager;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mSensorManager = (SensorManager) this.getActivity().getSystemService(Activity.SENSOR_SERVICE);
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.mylayout, container, false);
    
            return rootView;
        }
    
        @Override
        public void onSensorChanged(SensorEvent event) {
            float x = event.values[0], y = event.values[1];
        }
    
        @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { }
    
        @Override
        public void setMenuVisibility(boolean menuVisible) {
            super.setMenuVisibility(menuVisible);
    
            // First starts (gets called before everything else)
            if(mSensorManager == null) {
                return;
            }
    
            if(menuVisible) {
                this.registerSensorListener();
            } else {
                this.unregisterSensorListener();
            }   
        }
    
        @Override
        public void onStart() {
            super.onStart();
    
            if(this.getUserVisibleHint()) {
                this.registerSensorListener();
            }
        }
    
        @Override
        public void onStop() {
            super.onStop();
            this.unregisterSensorListener();
        }
    
        private void registerSensorListener() {
            mSensorManager.registerListener(this, mSensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0), SensorManager.SENSOR_DELAY_FASTEST);
        }
    
        private void unregisterSensorListener() {
            mSensorManager.unregisterListener(this);
        }
    }
    

    你能在这里显示你的代码吗???@PiyushGupta我发布了我的解决方案我添加了一些关于空值的注释,这确实是一个肮脏的把戏,在大多数情况下都有效。我已经详细阐述了正常的方式是什么(onActivityCreated+isAdded)@user1281750非常感谢。碎片现在对我来说有点清楚了。这是在fragment类中存储活动的一种好方法还是这些肮脏的解决方案之一?@Niklas。但这样做的目的是让活动不知道片段的作用。然而,活动必须知道片段做什么,只要你必须在片段之间“交谈”,这应该总是通过活动来完成,从片段实现侦听器是的,我通过接口来交谈。然而,我找到了一个解决方案(见下文),我不需要存储活动,它仍然可以工作。