TextView.setText () во фрагменте вылетает приложение - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь изменить содержимое TextView при смене датчика, но после вызова TextView.setText("foo"); приложение вылетает, как если бы переменная TextView была нулевой. Я установил переменную TextView в onCreateView. Вот код:

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)
    {

    }
}

Ответы [ 6 ]

0 голосов
/ 27 июля 2019

Иногда при создании макетов во фрагментах вы копируете и вставляете код XML с дублирующими идентификаторами. Когда вы затем вызываете id вставленных ресурсов, он попытается вызвать первые определенные ресурсы, которые, вероятно, равны нулю во время выполнения. Дважды проверьте, найден ли идентификатор страницы1 только в одном фрагменте XML. Если не работает обход "findviewbyid". Надеюсь, это поможет, в вашем коде мало подробностей (Ошибка msg)

0 голосов
/ 25 апреля 2018

введите код findViewById в onActivityCreated, как показано ниже:

 @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        page1 = getActivity().findViewById(R.id.page1);
    }
0 голосов
/ 25 апреля 2018
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) {

    }
}
0 голосов
/ 25 апреля 2018

Сначала надуйте макет

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

использовать view объект для вызова метода findViewById

0 голосов
/ 25 апреля 2018

Почему несколько раз R.layout.?

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

Это должен быть один раз.Сначала измените здесь.

Примечание

Вы получите NullPointerException.

Выдается, когда приложение пытается использовать ноль в случае, когда требуется объект.

Вы должны передать View's object.

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;
0 голосов
/ 25 апреля 2018

Используйте это

@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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...