Мой хронометр останавливается, когда я меняю активность. Как я могу предотвратить это? - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть одно упражнение и три фрагмента.Во фрагменте (1) у меня есть хронометр, который работает отлично.Во-первых, я нажимаю кнопку запуска хронометра.Когда хронометр показывает 00:10, я открываю фрагмент (2).Затем я возвращаюсь через 6 секунд, хронометр показывает 00:00.Я хочу, чтобы он показывал 00:16 и продолжал работать, пока я меняю фрагменты.

Fragment (1) xml.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>

<Chronometer
    android:id="@+id/chronometer"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="25dp"
    android:textSize="70dp"
    android:textColor="#fff"
    />

<Button
    android:id="@+id/btn_Start"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Start"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="20dp"
    android:layout_below="@+id/chronometer"
    android:background="@drawable/btn_bg"
    android:textColor="#fff"
    />

<Button
    android:id="@+id/btn_Pause"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Pause"
    android:layout_centerHorizontal="true"
    android:layout_below="@+id/btn_Start"
    android:background="@drawable/btn_bg"
    android:layout_marginTop="20dp"
    android:textColor="#fff"/>

<Button
    android:id="@+id/btn_Reset"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Reset"
    android:layout_centerHorizontal="true"
    android:layout_below="@+id/btn_Pause"
    android:background="@drawable/btn_bg"
    android:layout_marginTop="20dp"
    android:textColor="#fff"/>

<Button
    android:id="@+id/btn_Back"
    android:layout_width="50dp"
    android:layout_height="wrap_content"
    android:layout_alignTop="@+id/btn_Reset"
    android:layout_alignParentStart="true"
    android:layout_alignParentLeft="true"
    android:layout_marginLeft="20dp"
    android:layout_marginTop="0dp"
    android:background="@drawable/btn_bg_2"
    android:drawableRight="@drawable/ic_fast_rewind_black_24dp"
    android:textColor="#fff" />

<Button
    android:id="@+id/btn_Forward"
    android:layout_width="50dp"
    android:layout_height="wrap_content"
    android:layout_alignTop="@+id/btn_Reset"
    android:layout_alignParentRight="true"
    android:layout_marginRight="30dp"
    android:background="@drawable/btn_bg_2"
    android:drawableLeft="@drawable/ic_fast_forward_black_24dp"
    android:textColor="#fff" />

</RelativeLayout>

Это мой фрагмент (1) java-кода.

public class HomeFragment extends Fragment {


private Button btn_start;
private Button btn_pause;
private Button btn_reset;
private Button btn_back;
private Button btn_forward;


@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable 
ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view= inflater.inflate(R.layout.fragment_home, container, false);



    chronometer = view.findViewById(R.id.chronometer);
    chronometer.setFormat("%s");

    btn_forward= view.findViewById(R.id.btn_Forward);
    btn_back = view.findViewById(R.id.btn_Back);
    btn_start= view.findViewById(R.id.btn_Start);
    btn_pause= view.findViewById(R.id.btn_Pause);
    btn_reset= view.findViewById(R.id.btn_Reset);

    btn_back.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            backChronometer();
        }
    });

    btn_forward.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            forwardChronometer();
        }
    });

    btn_start.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            startChronometer();
        }
    });

    btn_pause.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            pauseChronometer();
        }
    });

    btn_reset.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            pauseChronometer();
            resetChronometer();
        }
    });

    return view;
}
}

Это код Java хронометра.(методы)

public class Chronometer {

public static long pauseOffset;
public static boolean running;

public static void startChronometer (){
    if(!running){
        chronometer.setBase(SystemClock.elapsedRealtime() - pauseOffset);
        chronometer.start();
        running = true;
    }

}
public static void pauseChronometer (){

    if (running){
        pauseOffset = SystemClock.elapsedRealtime() - chronometer.getBase();
        chronometer.stop();
        running = false;
    }

}
public static void resetChronometer (){

    chronometer.setBase(SystemClock.elapsedRealtime());
    pauseOffset = 0;
}
public static void forwardChronometer (){
    if (running) {
        chronometer.setBase(chronometer.getBase()-1000);
    }
}
public static void backChronometer (){
    if (running) {
        chronometer.setBase(chronometer.getBase()+1000);
    }
}
}

MainActivity Java-код.

public class MainActivity extends AppCompatActivity {

public static Chronometer chronometer;
public static TextView tv_rune;
public static SeekBar sb_rune;
public static int minrune = 0, maxrune = 35, currentrune;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    BottomNavigationView bottomNav = findViewById(R.id.bottom_navigation);
    bottomNav.setOnNavigationItemSelectedListener(navListener);

    getSupportFragmentManager().beginTransaction().replace(R.id.main_frame, 
new HomeFragment()).commit();

}
private BottomNavigationView.OnNavigationItemSelectedListener navListener =
        new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem 
menuItem) {

                Fragment selectedFragment = null;

                switch (menuItem.getItemId()){
                    case R.id.navigation_home:
                        selectedFragment = new HomeFragment();
                        break;

                    case R.id.navigation_notifications:
                        selectedFragment = new NotificationsFragment();
                        break;

                    case R.id.navigation_info:
                        selectedFragment = new InfoFragment();
                        break;
                }


getSupportFragmentManager().beginTransaction().replace(R.id.main_frame,
                        selectedFragment).commit();

                return true;
            }
        };

}

Также я хочу сохранить данные поисковой панели от фрагмента (2), чтобы использовать их во фрагменте (1).На самом деле, мне интересно, как мы можем защитить данные.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018
0 голосов
/ 08 ноября 2018

Попробуйте использовать setRetainInstance (true) в onCreate фрагмента, как описано здесь.

https://stackoverflow.com/a/22884377/5343907

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...