Android 应用程序中的TextView.setText()

Android 应用程序中的TextView.setText(),android,crash,fragment,sensors,Android,Crash,Fragment,Sensors,我试图更改传感器更改上的TextView内容,但调用TextView.setText(“foo”)应用程序崩溃,就像TextView变量为空一样。我在onCreateView中设置了TextView变量。代码如下: public class fragment1 extends Fragment implements SensorEventListener { private SensorManager mSrMgr = null; private Sensor mLight;

我试图更改传感器更改上的
TextView
内容,但调用
TextView.setText(“foo”)应用程序崩溃,就像
TextView
变量为空一样。我在
onCreateView
中设置了
TextView
变量。代码如下:

public class fragment1 extends Fragment implements SensorEventListener
{
    private SensorManager mSrMgr = null;
    private Sensor mLight;
    private TextView page1;
    protected View mView;


    public fragment1()
    {
        // Required empty public constructor
    }

    public void onCreate(Bundle savedInstance)
    {
        super.onCreate(savedInstance);
        mSrMgr = (SensorManager) getActivity().getSystemService(SENSOR_SERVICE);
        mLight = mSrMgr.getDefaultSensor(Sensor.TYPE_LIGHT);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState)
    {
        page1 = container.findViewById(R.id.page1);
        View view = inflater.inflate(R.layout.fragment_fragment1, container, false);
        this.mView = view;
        return inflater.inflate(R.layout.fragment_fragment1, container, false);
    }

    public void onPause()
    {
        super.onPause();
        this.unregister();
    }

    public void onResume()
    {
        super.onResume();
        this.registerSensorListiner();
    }

    private void registerSensorListiner()
    {
        mSrMgr.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL);
    }

    private void unregister()
    {
        mSrMgr.unregisterListener(this);
    }


    @Override
    public void onSensorChanged(SensorEvent event)
    {
        Toast.makeText(getContext(),String.valueOf(event.values[0]),Toast.LENGTH_SHORT).show();
        page1.setText("elo"); //here is the crashing part
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy)
    {

    }
}
用这个

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
{            
   View view = inflater.inflate(R.layout.fragment_fragment1, container, false);
   this.mView = view;
   page1 = view.findViewById(R.id.page1);
   return view;
}
而不是这个

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState)
    {
        page1 = container.findViewById(R.id.page1);
        View view = inflater.inflate(R.layout.fragment_fragment1, container, false);
        this.mView = view;
        return inflater.inflate(R.layout.fragment_fragment1, container, false);
    }

为什么多次
R.layout.

  View view = inflater.inflate(R.layout.fragment_fragment1, container, false);
        this.mView = view;
        return inflater.inflate(R.layout.fragment_fragment1, container, false);
应该是一次。首先在这里修改

注意

你会得到的

当应用程序试图在 对象是必需的

您应该传递视图的对象

page1 = view.findViewById(R.id.page1);
最后

 View view = inflater.inflate(R.layout.fragment_fragment1, container, false);
 page1 = view.findViewById(R.id.page1);
 this.mView = view;
 return view;

首先,膨胀布局

View view = inflater.inflate(R.layout.fragment_fragment1, container, false);
this.mView = view;
page1 = view.findViewById(R.id.page1); 
return view, false);

使用
view
对象调用findViewById方法

将您的
findViewById
代码放入创建的
活动中
,如下所示:

public class fragment1 extends Fragment implements SensorEventListener {
    private SensorManager mSrMgr = null;
    private Sensor mLight;
    private TextView page1;
    protected View mView;


    public fragment1() {
        // Required empty public constructor
    }

    public void onCreate(Bundle savedInstance) {
        super.onCreate(savedInstance);
        mSrMgr = (SensorManager) getActivity().getSystemService(SENSOR_SERVICE);
        mLight = mSrMgr.getDefaultSensor(Sensor.TYPE_LIGHT);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        mView = inflater.inflate(R.layout.fragment_fragment1, container, false);
        page1 = mView.findViewById(R.id.page1);
        return mView;
    }

    public void onPause() {
        super.onPause();
        this.unregister();
    }

    public void onResume() {
        super.onResume();
        this.registerSensorListiner();
    }

    private void registerSensorListiner() {
        mSrMgr.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL);
    }

    private void unregister() {
        mSrMgr.unregisterListener(this);
    }


    @Override
    public void onSensorChanged(SensorEvent event) {
        Toast.makeText(getContext(), String.valueOf(event.values[0]), Toast.LENGTH_SHORT).show();
        page1.setText("elo"); //here is the crashing part
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
}
 @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        page1 = getActivity().findViewById(R.id.page1);
    }

有时,在片段中创建布局时,复制并粘贴具有重复ID的xml代码。然后,当您调用粘贴资源的id时,它将尝试调用第一个定义的资源,该资源在运行时可能为null。仔细检查page1 id是否仅在一个片段的Xml中找到。如果不解决“findviewbyid”。我希望这会有所帮助,代码中有一些细节(错误消息)

崩溃日志(如果有)?你是对的,只是实验中留下了一些混乱,谢谢注意。@hdw3确实如此。感谢您的回复。欢迎,您可以接受答案,也可以填写:-)快乐编码