Шагомер во фрагменте

Я пытаюсь использовать датчик шагомера во фрагменте для подсчета количества шагов, пройденных с момента последней перезагрузки устройства.

Я могу заставить шагомер работать в Activity, но не могу заставить его работать в fragment. Я новичок в использовании фрагментов, поэтому, вероятно, очень просто, что я делаю неправильно.

Мой класс ниже:

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import static com.example.application.placepicker.R.id.count;


public class Tab3 extends Fragment implements SensorEventListener {

private SensorManager sensorManager;
private TextView textView;
boolean activityRunning;
private Button buttonReturn;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.tab3, container, false);
    return rootView;
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    count = (TextView) getActivity().findViewById(count);  **error

    sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);     **error

}

@Override
public void onResume() {
    super.onResume();
    activityRunning = true;
    Sensor countSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
    if (countSensor != null) {
        sensorManager.registerListener(this, countSensor, SensorManager.SENSOR_DELAY_UI);
    } else {
        Toast.makeText(this, "Count sensor not available!", Toast.LENGTH_LONG).show();                            **error
    }

}

@Override
public void onPause() {
    super.onPause();
    activityRunning = false;
}

@Override
public void onSensorChanged(SensorEvent event) {
    if (activityRunning) {
        count.setText(String.valueOf(event.values[0]));         **error
    }

}

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

}
}

Мой файл XML для сопровождения:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.application.placepicker.TabbedActivity$PlaceholderFragment">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_marginTop="114dp"
    android:gravity="center"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true">

    <TextView
        android:id="@+id/textLogin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Step counter"
        android:textSize="40sp"
        android:textColor="@color/colorAccent"
        android:fontFamily="sans-serif"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="33dp"
        android:layout_gravity="center_horizontal"
        android:textSize="26dp"
        android:text="Steps walked so far today:"
        android:textColor="@color/colorAccent" />

    <TextView
        android:id="@+id/count"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:layout_marginLeft="50dp"
        android:text="---"
        android:textColor="@color/colorAccent"
        android:textSize="36dp" />

</LinearLayout>


person DToon12    schedule 05.12.2017    source источник
comment
Если не работает, то что происходит? Ошибка при компиляции? Приложение вылетает?   -  person Bö macht Blau    schedule 05.12.2017
comment
При построении проекта есть ошибки. Я выделил выше в коде, где ошибки. Я не уверен, что count = (TextView) getActivity().findViewById(count); и sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); находятся в правильном месте, так как я не привык к фрагментам.   -  person DToon12    schedule 05.12.2017
comment
Для sensorManager перейдите по ссылке на как использовать getSystemService().   -  person Bö macht Blau    schedule 05.12.2017
comment
И эта ссылка должна быть полезна для инициализации TextView   -  person Bö macht Blau    schedule 05.12.2017


Ответы (2)


У вас нет переменной-члена для подсчета

private SensorManager sensorManager;
private TextView textView;
boolean activityRunning;
private Button buttonReturn;

являются примерами переменных-членов в вашем классе фрагментов

count = (TextView) getActivity().findViewById(count);

устанавливает TextView на неизвестную ссылку, пожалуйста, правильно инициализируйте счетчик, т.е.

TextView count = (TextView) getActivity().findViewById(count);

как член функции или:

private TextView count;

с другими переменными-членами класса

тогда вам нужно будет позвонить

sensorManager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE)

поскольку фрагмент сам по себе не имеет ссылки на метод getSystemService, поэтому ему необходимо пройти через его удерживающую активность

person Community    schedule 06.12.2017
comment
Я сделал это и избавился от этой ошибки. Я все еще получаю сообщение об ошибке sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); и не могу понять, как ее решить. Меня направили на это но не могу перевести это в свое приложение - person DToon12; 06.12.2017
comment
вам нужно будет вызвать sensorManager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE), насколько мне известно, ваш фрагмент не имеет ссылки на метод getSystemService сам по себе - person ; 06.12.2017
comment
Вот и все! Спасибо за вашу помощь :) - person DToon12; 06.12.2017
comment
Я обновил свой ответ, чтобы охватить комментарии и помочь другим - person ; 08.12.2017

также я знаю, что вы должны измениться

 count = (TextView) getActivity().findViewById(count);

to

count = (TextView)getView().findViewById(R.id.count);

потому что вы должны определить представление, не вызывайте активность.

person nilesh singh dahiya    schedule 17.07.2021