0

I have 2 activities. Which I tried to convert into fragments but somehow, the code I use for the activities won't work within fragments. I get a bunch of errors.

The first activity is a card where when clicked a random text will appear and the card is flipping.

The second activity is a timer with a 3th party progress bar that the fragment gives an error.

Now my question is, how can I use 2 activities within a tabLayout since I cannot convert the activity code into a fragment? I have been searching the internet for hours but I can only find that you can use fragments within a tabLayout.

Is there a tutorial on how to create a tabLayout with 2 activities?

I also followed the tutorial https://mkyong.com/android/android-tablayout-example/ but that didn't work.

This is my Timer activity: Kotlin:

class NewTimerActivity : AppCompatActivity() {

        enum class TimerState {
        Stopped, Paused, Running
    }

    private lateinit var timer: CountDownTimer
    private var timerLengthSeconds: Int = 30
    private var timerState = TimerState.Stopped
    private var secondsRemaining = 0





    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_new_timer)
        val display = supportActionBar
        display?.title = ""
        display?.setDisplayHomeAsUpEnabled(true)

        val fab_start = findViewById<Button>(R.id.fab_start)
        val fab_pause = findViewById<Button>(R.id.fab_pause)
        val fab_stop = findViewById<Button>(R.id.fab_stop)


        fab_start.setOnClickListener {
            startTimer()
            timerState = TimerState.Running
            updateButtons()
        }

        fab_pause.setOnClickListener {
            timer.cancel()
            timerState = TimerState.Paused
            updateButtons()
        }

        fab_stop.setOnClickListener {
            timer.cancel()
            onTimerFinished()
            updateButtons()
        }


    }

    override fun onResume() {
        super.onResume()
        initTimer()
    }

    override fun onPause() {
        super.onPause()

        if (timerState == TimerState.Running) {
            timer.cancel()
        } else if (timerState == TimerState.Paused) {

        }
        PrefUtil.setPreviousTimerLengthSeconds(timerLengthSeconds, this)
        PrefUtil.setSecondsRemaining(secondsRemaining, this)
        PrefUtil.setTimerState(timerState, this)


    }

    fun initTimer() {
        timerState = PrefUtil.getTimerState(this)

        if (timerState == TimerState.Stopped)
            setNewTimerLength()
        else
            setPreviousTimerLength()

        secondsRemaining = if (timerState == TimerState.Running || timerState == TimerState.Paused)
            PrefUtil.getSecondsRemaining(this).toInt()
        else
            timerLengthSeconds

        if (timerState == TimerState.Running)
            startTimer()
        updateButtons()
        updateCountdownUI()
    }

    private fun onTimerFinished() {
        var progress_countdown = findViewById<ProgressBar>(R.id.progress_countdown)
        timerState = TimerState.Stopped
        setNewTimerLength()

        progress_countdown.progress = 0
        PrefUtil.setSecondsRemaining(timerLengthSeconds, this)
        secondsRemaining = timerLengthSeconds

        updateButtons()
        updateCountdownUI()
    }

    private fun startTimer() {
        timerState = TimerState.Running
        timer = object : CountDownTimer((secondsRemaining * 1000).toLong(), 1000) {
            override fun onFinish() = onTimerFinished()

            override fun onTick(millisUntilFinished: Long) {
                secondsRemaining = (millisUntilFinished / 1000).toInt()
                updateCountdownUI()
            }
        }.start()
    }

    private fun setNewTimerLength() {
        var progress_countdown = findViewById<ProgressBar>(R.id.progress_countdown)
        var lengthInMinutes = PrefUtil.getTimerLength(this)
        timerLengthSeconds = ((lengthInMinutes * 60L).toInt())
        progress_countdown.max = timerLengthSeconds.toInt()
    }

    private fun setPreviousTimerLength() {
        var progress_countdown = findViewById<ProgressBar>(R.id.progress_countdown)
        timerLengthSeconds = PrefUtil.getPreviousTimerLengthSeconds(this).toInt()
        progress_countdown.max = timerLengthSeconds.toInt()
    }

    private fun updateCountdownUI() {
        var progress_countdown = findViewById<ProgressBar>(R.id.progress_countdown)
        val textView_Countdown = findViewById<TextView>(R.id.timer_textview)
        val minutesUntilFinished = secondsRemaining / 60
        val secondsInMinutesUntilFinished = secondsRemaining - minutesUntilFinished * 60
        val secondsStr = secondsInMinutesUntilFinished.toString()
        textView_Countdown.text = "$minutesUntilFinished:${
            if (secondsStr.length == 2) secondsStr
            else "0" + secondsStr}"
        progress_countdown.progress = (timerLengthSeconds - secondsRemaining).toInt()
    }

    private fun updateButtons() {
        val fab_start = findViewById<Button>(R.id.fab_start)
        val fab_pause = findViewById<Button>(R.id.fab_pause)
        val fab_stop = findViewById<Button>(R.id.fab_stop)
        when (timerState) {
            TimerState.Running -> {
                fab_start.isEnabled = false
                fab_pause.isEnabled = true
                fab_stop.isEnabled = true
            }

            TimerState.Stopped -> {
                fab_start.isEnabled = true
                fab_pause.isEnabled = false
                fab_stop.isEnabled = false
            }

            TimerState.Paused -> {
                fab_start.isEnabled = true
                fab_pause.isEnabled = false
                fab_stop.isEnabled = true
            }
        }
        }
    }

XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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="@drawable/achtergrondnowhite"
    tools:context=".NewTimerActivity">

    <TextView
        android:id="@+id/timer_textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:gravity="center"
        android:text="30"
        android:textColor="#FFF"
        android:textSize="70dp" />

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/Theme.KlimaatAmbitieGame.AppBarOverlay">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/Theme.KlimaatAmbitieGame.PopupOverlay" />

    </com.google.android.material.appbar.AppBarLayout>


    <me.zhanghai.android.materialprogressbar.MaterialProgressBar
        android:id="@+id/progress_countdown"
        style="@style/Widget.MaterialProgressBar.ProgressBar"
        android:layout_width="306dp"
        android:layout_height="306dp"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentBottom="true"
        android:layout_marginStart="52dp"
        android:layout_marginTop="215dp"
        android:layout_marginEnd="52dp"
        android:layout_marginBottom="210dp"
        android:minWidth="306dp"
        android:minHeight="306dp"
        app:mpb_indeterminateTint="@color/white"
        app:mpb_progressBackgroundTint="@color/white"

        app:mpb_progressTint="@color/white"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/fab_stop"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentBottom="true"
        android:layout_gravity="bottom|end"
        android:layout_marginStart="274dp"
        android:layout_marginEnd="27dp"
        android:layout_marginBottom="131dp"
        android:background="@color/black"
        android:minWidth="50dp"
        android:minHeight="50dp"
        android:text="Stop"
        android:textColor="@color/white"
        app:srcCompat="@drawable/ic_stop" />

    <Button
        android:id="@+id/fab_pause"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentBottom="true"
        android:layout_gravity="bottom|center"
        android:layout_marginStart="156dp"
        android:layout_marginTop="@dimen/bigger_fab_margin"
        android:layout_marginEnd="151dp"
        android:layout_marginBottom="131dp"
        android:background="@color/black"
        android:minWidth="150dp"
        android:minHeight="50dp"
        android:text="Pause"
        android:textColor="@color/white"
        app:srcCompat="@drawable/ic_pause" />

    <Button
        android:id="@+id/fab_start"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentBottom="true"
        android:layout_gravity="bottom|start"
        android:layout_marginStart="45dp"
        android:layout_marginTop="@dimen/bigger_fab_margin"
        android:layout_marginEnd="280dp"

        android:layout_marginBottom="133dp"
        android:background="@color/black"
        android:minWidth="100dp"
        android:minHeight="50dp"
        android:text="Start"
        android:textColor="@color/white" />

</RelativeLayout>

PrefUtil

class PrefUtil {
    companion object {
        fun getTimerLength(context: Context): Double {
            //placeholder
            return 0.5
        }

        //private var defValue: Long
        private const val PREVIOUS_TIMER_LENGTH_SECONDS_ID = "com.resoconder.timer.previous_timer_length"

        fun getPreviousTimerLengthSeconds(context: Context): Long {
            val preferences = PreferenceManager.getDefaultSharedPreferences(context)
            return preferences.getLong(PREVIOUS_TIMER_LENGTH_SECONDS_ID, 0)
        }

        fun setPreviousTimerLengthSeconds(seconds: Int, context: Context) {
            val editor = PreferenceManager.getDefaultSharedPreferences(context).edit()
            editor.putLong(PREVIOUS_TIMER_LENGTH_SECONDS_ID, seconds.toLong())
            editor.apply()
        }

        private const val TIMER_STATE_ID = "com.resocoder.timer.timer_state"

        fun getTimerState(context: Context): NewTimerActivity.TimerState {
            val preferences = PreferenceManager.getDefaultSharedPreferences(context)
            val ordinal = preferences.getInt(TIMER_STATE_ID, 0)
            return NewTimerActivity.TimerState.values()[ordinal]
        }

        fun setTimerState(state: NewTimerActivity.TimerState, context: Context) {
            val editor = PreferenceManager.getDefaultSharedPreferences(context).edit()
            val ordinal = state.ordinal
            editor.putInt(TIMER_STATE_ID, ordinal)
            editor.apply()
        }

        private const val SECONDS_REMAINING_ID = "com.resoconder.timer.previous_timer_length"

        fun getSecondsRemaining(context: Context): Long {
            val preferences = PreferenceManager.getDefaultSharedPreferences(context)
            return preferences.getLong(SECONDS_REMAINING_ID, 0)
        }

        fun setSecondsRemaining(seconds: Int, context: Context) {
            val editor = PreferenceManager.getDefaultSharedPreferences(context).edit()
            editor.putLong(SECONDS_REMAINING_ID, seconds.toLong())
            editor.apply()
        }
    }
}

And this is my Card activity: Kotlin:

class StartKaartActivity : AppCompatActivity() {

    lateinit var front_anim:AnimatorSet
    lateinit var back_anim:AnimatorSet
    var isFront = false

    @SuppressLint("ResourceType")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_start_kaart)

        //Set Backbutton Bar
        val display = supportActionBar
        display?.title = ""
        display?.setDisplayHomeAsUpEnabled(true)
        display?.setDisplayUseLogoEnabled(true)
        display?.setLogo(R.drawable.logo)



        val scale = applicationContext.resources.displayMetrics.density
        val tvstartkaart = findViewById<TextView>(com.fotf.klimaatambitiegame.R.id.tvstartkaart)
        val tvstartkaartachterkant = findViewById<TextView>(com.fotf.klimaatambitiegame.R.id.tvstartkaartachterkant)
        tvstartkaart.cameraDistance = 8000 * scale
        tvstartkaartachterkant.cameraDistance = 8000 * scale
        front_anim = AnimatorInflater.loadAnimator(applicationContext, R.anim.font_animation) as AnimatorSet
        back_anim = AnimatorInflater.loadAnimator(applicationContext, R.anim.back_animation) as AnimatorSet



        val Carts = arrayOf("" +
"Random Text",

)



        tvstartkaart.setOnClickListener() {

            if (isFront) {

                front_anim.setTarget(tvstartkaart)
                back_anim.setTarget(tvstartkaartachterkant)
                front_anim.start()
                back_anim.start()
                isFront = false
            } else {

                val random = Carts.random()
                tvstartkaart.setText(random)

                front_anim.setTarget(tvstartkaartachterkant)
                back_anim.setTarget(tvstartkaart)
                front_anim.start()
                back_anim.start()
                isFront = true
            }

        };
    }
}


XML:

<?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="@drawable/achtergrondnowhite"
    tools:context=".StartKaartActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="176dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="177dp"
        android:paddingHorizontal="10dp"
        android:text="Klik op de kaart om een nieuwe kaart te krijgen. \n\nGeef het goede antwoord op de vraag en verdien een houder."
        android:textColor="@color/white"
        android:textSize="20dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tvstartkaart"
        android:layout_width="350dp"
        android:layout_height="450dp"
        android:layout_marginTop="28dp"
        android:background="@drawable/kaartstartvoorkant"
        android:gravity="left|center"
        android:padding="15dp"
        android:paddingHorizontal="10dp"
        android:text=""
        android:textColor="@color/black"
        android:textSize="20dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.491"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

    <TextView
        android:id="@+id/tvstartkaartachterkant"
        android:layout_width="350dp"
        android:layout_height="450dp"
        android:layout_marginTop="28dp"
        android:background="@drawable/kaartstartachterkant"
        android:gravity="left|center"
        android:padding="15dp"
        android:paddingHorizontal="10dp"
        android:textColor="@color/black"
        android:textSize="20dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.491"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

</androidx.constraintlayout.widget.ConstraintLayout>

0 Answers0