当我更改活动时,我的计时器停止计时。我该如何预防呢?

时间:2018-11-07 20:52:59

标签: java android android-studio android-fragments

我有一个活动和三个片段。在fragment(1)中,我有一个精密计时的天文钟。首先,我单击天文钟开始按钮。当计时器显示00:10时,我打开fragment(2)。然后我在6秒钟后返回,计时器显示00:00。我希望它显示00:16并在我更改片段时继续工作。

片段(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>

这是我的fragment(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;
            }
        };

}

我还想保留来自fragment(2)的seekbar数据,以在片段(1)中使用它们。 实际上,我想知道如何保护数据。

2 个答案:

答案 0 :(得分:0)

尝试在片段的onCreate中使用setRetainInstance(true),如此处所述。

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

答案 1 :(得分:0)