Simple Save State Instance.
Add maven jitpack.io
and dependencies
in build.gradle (Project)
:
// build.gradle project
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
// build.gradle app/module
dependencies {
...
implementation 'com.github.gzeinnumer:KeepStateUI:version'
//required for example
implementation 'com.github.gzeinnumer:RecyclerViewAdapterBuilder:2.0.1'
}
- Activity StateUI
- Fragment StateUI
- Recyclerview StateUI
- Image StateUI
- Variable With StateUI
- Clear Value StateUI onStop
- Clear All StateUI
Save UI State like SavedInstanceState
with Bundle
. but with this library, you can keep data/value in View as long as you want,
or you can Clear Cache from your app in Application Settings
. State will keep save even when you kill
your app process.
public class MainActivity extends AppCompatActivity {
private StateUI stateUI;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
stateUI = StateUIBuilder.Build(MainActivity.class, getApplicationContext());
}
}
Use function addView(KEY, VALUE)
on onPause()
add value that you want to keep and use saveState()
to submit your value. When onPause()
called StateUI will keep your value.
public class MainActivity extends AppCompatActivity {
private StateUI stateUI;
...
@Override
protected void onPause() {
super.onPause();
stateUI.addView("binding.edUsername", binding.edUsername.getText().toString());
stateUI.addView("binding.edPass", binding.edPass.getText().toString());
stateUI.saveState();
}
}
Use function onResume()
to get value that you have been save before. Check value in StateUI
is exists, if exists than get value with it's own KEY
with getValue(KEY)
and set value to your view again.
public class MainActivity extends AppCompatActivity {
private StateUI stateUI;
...
@Override
protected void onResume() {
super.onResume();
if (stateUI.getState()) {
String userName = stateUI.getValue("binding.edUsername");
binding.edUsername.setText(userName);
String pass = stateUI.getValue("binding.edPass");
binding.edPass.setText(pass);
}
}
}
Clear your state when you no need it anymore with.
//login and clear last value on form by onClick
binding.btnLogin.setOnClickListener(v -> {
stateUI.clearState();
startActivity(new Intent(getApplicationContext(), MenuActivity.class));
});
Here is Full Code MainActivity.java & activity_main.xml
Preview:
(Before) Data lost in onBackPressed() |
(Before) Data lost in onDestroy() |
(After) Data keep in onBackPressed() |
(After) Data keep in onDestroy() |
Seems like Activity StateUI. but you need to use onViewCreated
and Override
public onPauseonResume()
and public onResume()
.
public class HomeFragment extends Fragment {
private StateUI stateUI;
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
...
stateUI = StateUIBuilder.Build(HomeFragment.class, requireContext());
}
@Override
public void onPause() {
super.onPause();
stateUI.addView("binding.edUsername", binding.edUsername.getText().toString());
stateUI.addView("binding.edPass", binding.edPass.getText().toString());
stateUI.saveState();
}
@Override
public void onResume() {
super.onResume();
if (stateUI.getState()) {
String userName = stateUI.getValue("binding.edUsername");
binding.edUsername.setText(userName);
String pass = stateUI.getValue("binding.edPass");
binding.edPass.setText(pass);
}
}
}
Here is Full Code HomeFragment.java & fragment_home.xml
Preview:
(Before) Data lost in onBackPressed() |
(Before) Data lost in onDestroy() |
(After) Data keep in onBackPressed() |
(After) Data keep in onDestroy() |
You can save List
to StateUI. Use function addViewList(KEY, ListStateReceiver<MyModel>)
to set value and getValueList(KEY, ListStateCallBack<MyModel>)
to get value.
public class RecyclerViewActivity extends AppCompatActivity {
private List<MyModel> list = new ArrayList<>();
private StateUI stateUI;
...
@Override
protected void onPause() {
super.onPause();
stateUI.addViewList("binding.rv", new ListStateReceiver<MyModel>() {
@Override
public List<MyModel> listReceived() {
return list;
}
});
stateUI.saveState();
}
@Override
protected void onResume() {
super.onResume();
if (stateUI.getState()) {
stateUI.getValueList("binding.rv", new ListStateCallBack<MyModel>() {
@Override
public Type setListModel() {
// need converter for Gson, put your ModelPojo on TypeToken
return new TypeToken<List<MyModel>>(){}.getType();
}
@Override
public void listCallBack(List<MyModel> listFromState) {
list = new ArrayList<>(listFromState);
initAdapter();
}
});
}
}
}
Here is Full Code RecyclerViewActivity.java & MyModel.java & activity_recycler_view.xml
Preview:
(Before) Data lost in onBackPressed() |
(Before) Data lost in onDestroy() |
(After) Data keep in onBackPressed() |
(After) Data keep in onDestroy() |
You can save Bitmap
from your ImageView
. Use function addViewBitmap()
to set value and getValueBitmap()
to get value.
public class ImageActivity extends AppCompatActivity {
private StateUI stateUI;
...
private void loadImageGlide() {
String imgUrl = "https://avatars3.githubusercontent.com/u/45892408?s=460&u=94158c6479290600dcc39bc0a52c74e4971320fc&v=4";
Glide.with(this).load(imgUrl).error(R.mipmap.ic_launcher).listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
try {
stateUI.addViewBitmap("binding.img", (BitmapDrawable) resource);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}).into(binding.img);
}
private void loadImagePicasso() {
String imgUrl = "https://avatars3.githubusercontent.com/u/45892408?s=460&u=94158c6479290600dcc39bc0a52c74e4971320fc&v=4";
Picasso.get().load(imgUrl).into(binding.img, new Callback() {
@Override
public void onSuccess() {
try {
stateUI.addViewBitmap("binding.img", (BitmapDrawable) binding.img.getDrawable());
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onError(Exception e) {
}
});
}
@Override
protected void onPause() {
super.onPause();
stateUI.saveState();
}
@Override
protected void onResume() {
super.onResume();
if (stateUI.getState()) {
Bitmap bitmap = stateUI.getValueBitmap("binding.img");
if (bitmap != null) {
binding.img.setImageBitmap(bitmap);
}
}
}
...
}
You can save Path
from your ImageView
. Use function addViewPath()
to set value and getValuePath()
to get value.
Note : This method Required Permission Storage
to read file
public class ImageActivity extends AppCompatActivity {
private StateUI stateUI;
...
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
...
//take image with camera or explisit intent
String path = "/storage/emulated/0/ExternalFolder/Foto/JPEG_FILE_NAME.jpg";
stateUI.addViewPath("binding.img", path);
...
}
@Override
protected void onPause() {
super.onPause();
stateUI.saveState();
}
@Override
protected void onResume() {
super.onResume();
if (stateUI.getState()) {
String path = stateUI.getValuePath("binding.img");
if (path != null){
Glide.with(this).load(new File(path)).error(R.mipmap.ic_launcher).into(binding.img);
}
}
}
...
}
Here is Full Code ImageActivity.java & activity_image.xml
Preview:
(Before) Data lost in onBackPressed() |
(Before) Data lost in onDestroy() |
(After) Data keep in onBackPressed() |
(After) Data keep in onDestroy() |
Variable
//onPause()
String data = "sentThisDataToState";
stateUI.addView("data", data);
//onResume()
String data = stateUI.getValue("data");
ViewModel
//onPause()
stateUI.addView("vm.data.getValue()", vm.data.getValue());
//onResume()
String data = stateUI.getValue("vm.data.getValue()");
vm.setData(data);
READ CAREFULLY!!! IF YOU USE THIS STEP. APP WILL KILL STATE-UI IN YOUR CURRENT ACTIVITY WHEN YOU CLOSE(NOT MINIMIZE) YOUR APP, ONLY ON CURRENT ACTIVITY
You can clear StateUI if you WONT
keep it when app killed, put stateUI.clearState()
on function onStop()
.
//ignore this if you want to keep value even when your app Killed
@Override
protected void onStop() {
super.onStop();
stateUI.clearState();
}
Call this function every where, this function will Clear All Of Your StateUI that you have been save before, in every Activity/Fragment
stateUI.destroyStateUI();
- 1.0.0
- First Release
- 1.0.1
- Clear All StateUI
- 1.0.2
- Image
- 2.0.0
- Support SDK 12
You can sent your constibution to branch
open-pull
.
Copyright 2021 M. Fadli Zein