Ejemplo de LiveData
Ejemplo de uso de LiveData
Descripción general de LiveData
Código en Github: LiveData Demo Project
ViewBinding en build.gradle
buildFeatures {
viewBinding true
}
activity_main.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"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="128dp"
android:layout_height="57dp"
android:layout_marginTop="64dp"
android:text="0"
android:textAlignment="center"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:textSize="40sp"
app:layout_constraintBottom_toTopOf="@+id/editText"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="numberSigned"
android:text="10000"
android:textAlignment="center"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:textColor="@color/purple_500"
app:layout_constraintBottom_toTopOf="@+id/startButton"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
<Button
android:id="@+id/startButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="156dp"
android:text="Start"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:textSize="40sp"
app:layout_constraintBottom_toTopOf="@+id/stopButton"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.529"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView"
app:layout_constraintVertical_bias="0.0" />
<Button
android:id="@+id/stopButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="236dp"
android:text="Stop"
android:textAllCaps="false"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:textSize="40sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.535"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView"
app:layout_constraintVertical_bias="1.0" />
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivityViewModel.java
public class MainActivityViewModel extends ViewModel {
CountDownTimer timer;
private MutableLiveData<Long> seconds = new MutableLiveData<>();
private MutableLiveData<Boolean> finished = new MutableLiveData<>();
private MutableLiveData<Long> timerValue = new MutableLiveData<>();
//public MainActivityViewModel() {
// startTimer();
//}
public LiveData<Long> getSeconds() {
return seconds;
}
public LiveData<Boolean> getFinished() {
return finished;
}
public void setTimerValue(Long t) {
timerValue.setValue(t);
}
public void startTimer() {
finished.setValue(false);
//timer = new CountDownTimer(10000, 1000) {
timer = new CountDownTimer(timerValue.getValue(), 1000) {
@Override
public void onTick(long millisUntilFinished) {
long timeLeft = millisUntilFinished / 1000;
seconds.postValue(timeLeft);
}
@Override
public void onFinish() {
finished.postValue(true);
}
};
timer.start();
}
public void stopTimer() {
timer.cancel();
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener, LifecycleOwner {
MainActivityViewModel viewmodel;
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
binding = ActivityMainBinding.inflate(getLayoutInflater());
View view = binding.getRoot();
setContentView(view);
binding.startButton.setOnClickListener(this);
binding.stopButton.setOnClickListener(this);
viewmodel = new ViewModelProvider(this).get(MainActivityViewModel.class);
subscribe();
// viewmodel.startTimer();
}
@Override
public void onClick(View view) {
if (view == binding.startButton) {
String text = binding.editText.getText().toString();
if (text.isEmpty() || text.length() < 4) {
showMessage("Invalid number, length < 4 digits");
} else {
viewmodel.setTimerValue(Long.parseLong(text));
viewmodel.startTimer();
}
}
if (view == binding.stopButton) {
viewmodel.stopTimer();
binding.textView.setText("0");
}
}
private void subscribe() {
final Observer<Long> secondsObserver = new Observer<Long>() {
@Override
public void onChanged(@Nullable final Long s) {
binding.textView.setText(String.valueOf(s));
}
};
final Observer<Boolean> finishedObserver = new Observer<Boolean>() {
@Override
public void onChanged(Boolean aBoolean) {
if (aBoolean)
showMessage("Finished!");
}
};
viewmodel.getSeconds().observe(this, secondsObserver);
viewmodel.getFinished().observe(this, finishedObserver);
}
private void showMessage(String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
}
Deja una respuesta
Lo siento, debes estar conectado para publicar un comentario.