d2jsp
Log InRegister
d2jsp Forums > Off-Topic > Computers & IT > Programming & Development > Android - Help Please
Add Reply New Topic New Poll
Member
Posts: 1,849
Joined: May 31 2008
Gold: 2,571.50
Sep 12 2020 06:15pm
Hello. So this is my first android app in 5 years and it is very simple, but I have been hitting my head against this bug for hours...

Goal:
Have 3 separate timers that should run independently/save variables independently.

I set the times to be; 2:10, 1:25: and 0:30. If I let the bottom timer run, the expectation is that when I hit the reset button that it would reset to 30 seconds, but it instead resetting to the "last modified timer"



Here is the code. Any help or direction is appreciated, I feel out of my depth/comfort zone with android...

Main.XML
Code

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"

tools:context=".MainActivity">

<ImageView
android:layout_width="403dp"
android:layout_height="111dp"
android:layout_marginStart="280dp"
android:layout_marginLeft="280dp"
android:layout_marginTop="28dp"
android:src="@drawable/benshot"
app:layout_constraintBottom_toTopOf="@+id/countDownComponent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.521" />

<com.example.benshottimer.CountDownComponent
android:id="@+id/countDownComponent"
android:layout_width="match_parent"

android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="116dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<com.example.benshottimer.CountDownComponent
android:layout_width="962dp"
android:layout_height="200dp"

android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="256dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<com.example.benshottimer.CountDownComponent
android:layout_width="962dp"
android:layout_height="200dp"

android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="396dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>



Main.Java

Code

package com.example.benshottimer;

import android.app.Activity;
import android.os.Bundle;


public class MainActivity extends Activity {

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

}


Component.XML
Code

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

<Button
android:id="@+id/button_start_timer"
android:layout_width="130dp"
android:layout_height="100dp"
android:layout_marginStart="320dp"
android:layout_marginLeft="320dp"
android:layout_marginTop="28dp"
android:background="#09ED13"
android:text="Start"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<Button
android:id="@+id/button_add_five"
android:layout_width="130dp"
android:layout_height="100dp"
android:layout_marginStart="796dp"
android:layout_marginLeft="796dp"
android:layout_marginTop="28dp"
android:text="+5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<Button
android:id="@+id/button_reset_timer"
android:layout_width="130dp"
android:layout_height="100dp"
android:layout_marginStart="480dp"
android:layout_marginLeft="480dp"
android:layout_marginTop="28dp"
android:background="#FF3300"
android:text="Reset"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<Button
android:id="@+id/button_minus_five"
android:layout_width="130dp"
android:layout_height="100dp"
android:layout_marginStart="640dp"
android:layout_marginLeft="640dp"
android:layout_marginTop="28dp"
android:text="-5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/text_view_countdown"
android:layout_width="242dp"
android:layout_height="114dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_marginStart="44dp"
android:layout_marginLeft="44dp"
android:layout_marginTop="12dp"
android:text="00:00"
android:textColor="@android:color/black"
android:textSize="90sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />


</androidx.constraintlayout.widget.ConstraintLayout>


Component.Java
Code

package com.example.benshottimer;

import android.content.Context;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import java.util.Locale;

public class CountDownComponent extends LinearLayout {

// Globals
private static final String TAG = "My Logs";
private static final long START_TIME_IN_MILLISECONDS = 90000;

// View
private Button startButton;
private Button resetButton;
private Button addFiveButton;
private Button minusFiveButton;
private TextView mTextViewCountDown;
private CountDownTimer mCountDownTimer;

// Other
private String mCountDownStatus;
private long mRemainingTimeMilliseconds;
private static long mStartTimeOverRide;

public CountDownComponent(Context context, AttributeSet attrs) {
super(context, attrs);
inflate(context, R.layout.count_down_timer,this);
wireUpButtons();
setDefaultValues();
resetButton.setVisibility(View.GONE);
updateCountDownText();
}


private void setDefaultValues() {
mTextViewCountDown = findViewById(R.id.text_view_countdown);
mCountDownStatus = "READY";
mRemainingTimeMilliseconds = START_TIME_IN_MILLISECONDS;
mStartTimeOverRide = START_TIME_IN_MILLISECONDS;
}

private void wireUpButtons() {
//wireUpStartButton
startButton = findViewById(R.id.button_start_timer);
startButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startTimer();
}
});

//wireUpResetButton
resetButton = findViewById(R.id.button_reset_timer);
resetButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
resetTimer();
}
});

//wireUpAddFiveButton
addFiveButton = findViewById(R.id.button_add_five);
addFiveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addFiveSeconds();
}
});

//wireUpMinusFiveButton
minusFiveButton = findViewById(R.id.button_minus_five);
minusFiveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
minusFiveSeconds();
}
});
}

private void startTimer() {
Log.v(TAG, "Starting Timer");
mCountDownStatus = "RUNNING";
startButton.setVisibility(View.GONE);
addFiveButton.setVisibility(View.GONE);
minusFiveButton.setVisibility(View.GONE);
resetButton.setVisibility(View.VISIBLE);

mCountDownTimer = new CountDownTimer(mRemainingTimeMilliseconds, 1000) {
@Override
public void onTick(long mRemainingTime) {
mRemainingTimeMilliseconds = mRemainingTime;
updateCountDownText();
}
@Override
public void onFinish() {
mCountDownStatus = "DONE";
}
}.start();

}

private void updateCountDownText() {
int minutes = (int) (mRemainingTimeMilliseconds / 1000) / 60;
int seconds = (int) (mRemainingTimeMilliseconds / 1000) % 60;
String timeLeftFormatted = String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds);
mTextViewCountDown.setText(timeLeftFormatted);
}

// private void stopTimer() {
// Log.v(TAG, "Stop Timer");
// mCountDownStatus = "DONE";
// }

private void resetTimer() {
Log.v(TAG, "Reset Timer");
mCountDownStatus = "RUNNING";
startButton.setVisibility(View.VISIBLE);
addFiveButton.setVisibility(View.VISIBLE);
minusFiveButton.setVisibility(View.VISIBLE);
resetButton.setVisibility(View.GONE);
mCountDownTimer.cancel();
mRemainingTimeMilliseconds = mStartTimeOverRide;
updateCountDownText();
}

private void addFiveSeconds() {
Log.v(TAG, "Add Five Seconds To Timer");
mRemainingTimeMilliseconds = mRemainingTimeMilliseconds + 5000;
mStartTimeOverRide = mRemainingTimeMilliseconds;
updateCountDownText();
}

private void minusFiveSeconds() {
Log.v(TAG, "Remove Five Seconds From Timer");
mRemainingTimeMilliseconds = mRemainingTimeMilliseconds - 5000;
mStartTimeOverRide = mRemainingTimeMilliseconds;
updateCountDownText();
}

Member
Posts: 1,849
Joined: May 31 2008
Gold: 2,571.50
Sep 15 2020 07:15pm
One of my friends figured it out.

The issue was some of these variables being set to "static"
Go Back To Programming & Development Topic List
Add Reply New Topic New Poll