So I have two Activities -
- MainActivity : Retrieves all the saved values from SharedPreferences. User launch SecondActivity on click where ...
- SecondActivity : User stores all the values into SharedPreferences and go back to the main activity.
Problem - Values read in the MainActivity are 0
Code -
MainActivity.java:
public class MainActivity extends AppCompatActivity {
private AppBarConfiguration mAppBarConfiguration;
private DataViewModel dataViewModel;
private StateData StateData;
private int currinterface = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*-- Hide System Interface---*/
hideSystemUI();
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
DrawerLayout drawer = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
mAppBarConfiguration = new AppBarConfiguration.Builder(
R.id.nav_home)
.setDrawerLayout(drawer)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
NavigationUI.setupWithNavController(navigationView, navController);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_home); // custom home icon
StateData = new StateData();
dataViewModel = new ViewModelProvider(this).get(dataViewModel.class);
stateObservers();
}
private void stateObservers(){
dataViewModel.getLevel().observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer val) {
currinterLevel = val;
StateData.setLevel(val);
SharedPrefManager.getInstance(MainActivity.this).setState(StateData);
}
});
dataViewModel.getSpeed().observe(this, new Observer<Float>() {
@Override
public void onChanged(Float val) {
switch (currinterLevel){
case 0:
StateData.setSpeedLevelOne(val);
break;
case 1:
StateData.setSpeedLevelTwo(val);
break;
case 2:
StateData.setSpeedLevelThree(val);
break;
}
SharedPrefManager.getInstance(MainActivity.this).setState(StateData);
}
});
}
@Override
protected void onPause() {
super.onPause();
/*Save all the setting when app closes*/
}
@Override
public boolean onSupportNavigateUp() {
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
return NavigationUI.navigateUp(navController, mAppBarConfiguration)
|| super.onSupportNavigateUp();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_one:
break;
case R.id.menu_two:
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
}
DataViewModel.java
public class DataViewModel extends ViewModel {
private MutableLiveData<Float> speed;
private MutableLiveData<Integer> level;
public DataViewModel(){
this.level = new MutableLiveData<>();
this.speed = new MutableLiveData<>();
}
// Level
public void setLevel(int val){
level.setValue(val);
}
public LiveData<Integer> getLevel(){
return level;
}
// scan
public void setSpeed(Float val){
speed.setValue(val);
}
public LiveData<Float> getSpeed(){
return speed;
}
}
public class StateData {
private float speedOne;
private float speedTwo;
private float speedThree;
private int lastLevel;
public StateData() {
}
public float getSpeedLevelOne() {
return speedOne;
}
public void setSpeedLevelOne(float speedOne) {
this.speedOne = speedOne;
}
public float getSpeedLevelTwo() {
return speedTwo;
}
public void setSpeedLevelTwo(float speedTwo) {
this.speedTwo = speedTwo;
}
public float getSpeedLevelThree() {
return speedThree;
}
public void setSpeedLevelThree(float speedThree) {
this.speedThree = speedThree;
}
public int getLastLevel() {
return lastLevel;
}
public void setLastLevel(int lastLevel) {
this.lastLevel = lastLevel;
}
}
HomeFragment.java
import static androidx.fragment.app.FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT;
public class HomeFragment extends Fragment implements RadioGroup.OnCheckedChangeListener, SeekBar.OnSeekBarChangeListener {
private static String TAG = "FRAGMENT_PARENT";
private DataViewModel dataViewModel;
private StateData stateData;
private int currentLevel=0;
private LinearLayout mSelector;
private LinearLayout mController;
private ViewPager viewPager;
private SeekBar mSpeed;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
dataViewModel = new ViewModelProvider((ViewModelStoreOwner) getContext()).get(DataViewModel.class);
stateData = SharedPrefManager.getInstance(getActivity()).getState();
return inflater.inflate(R.layout.fragment_home, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mSpeed = view.findViewById(R.id.Speed);
mSpeed.setOnSeekBarChangeListener(this);
viewPager = view.findViewById(R.id.interfacePager);
InterfacePagerAdapter myPagerAdapter = new InterfacePagerAdapter(getChildFragmentManager(), BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
viewPager.setAdapter(myPagerAdapter);
viewPager.addOnPageChangeListener(pageChangeListener);
}
private ViewPager.OnPageChangeListener pageChangeListener = new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
currentLevel = position;
dataViewModel.setLevel(position); // SET THE LEVEL DATA IN MAIN ACTIVITY VIA VIEW MODEL
}
@Override
public void onPageScrollStateChanged(int state) {
}
};
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initFun();
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onPause() {
super.onPause();
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
float progressPercentageFloat = (float)progress / 10.0f;
switch (seekBar.getId()){
case R.id.Speed:
dataViewModel.setSpeed(progressPercentageFloat); // SET SPEED DATA IN THE SELECTED LEVEL IN MAIN ACTIVITY VIA VIEW MODEL
break;
default:
break;
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
private void initFun(){
viewPager.setCurrentItem(stateData.getLastLevel());
pageChangeListener.onPageSelected(stateData.getLastLevel());
mSpeed.setProgress((int)(stateData.getSpeedLevelOne()*10));
mSpeed.setProgress((int)(stateData.getSpeedLevelTwo()*10));
mSpeed.setProgress((int)(stateData.getSpeedLevelThree()*10));
}
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
}
}