简体   繁体   中英

Change background using shared preference

I have an application that allows my users to customize the background of my application using buttons. My app works like this: First it will lead them to my main activity, where there is a button that they can press to customize the background. When they pressed that button, it will lead them to a dialog fragment that will give users an option to choose which background image they want. I'm able to change my background, however, the shared preference is not functioning correctly. When I close my app and open it, it changes back to my default background, but when I press the dialog fragment button, it then updates the background to whatever they chose.

So basically, the background only updates when I open the button that offers the background images.

I'm not sure if I explained it well so here is a gif of my problem

The background only updates when I press the terrain button, does anyone have an idea to fix this? I'm still very new to android and java so I'm not sure if I'm just missing something...

PopupTheme.java

public class PopupTheme extends DialogFragment implements View.OnClickListener {

    private ImageButton btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btn10;

    private static final String BG_NAME = "bgName";
    private static final String BG_KEY = "bg";

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        View view =  inflater.inflate(R.layout.activity_popup_theme, container, false);

        btn1 =  view.findViewById(R.id.btn1);
        btn2 = view.findViewById(R.id.btn2);
  
        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
   
        if (getBackground() != R.drawable.bgscreen1 ){
             MainActivity.mainLayout.setBackgroundResource(getBackground());
        }

        return view;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn1:
                MainActivity.mainLayout.setBackgroundResource(R.drawable.bgscreen1);
                Toast.makeText(getContext(), "Clicked", Toast.LENGTH_SHORT).show();

                storeBackground(R.drawable.bgscreen1);
                break;

            case R.id.btn2:
                MainActivity.mainLayout.setBackgroundResource(R.drawable.bgscreen2);
                Toast.makeText(getContext(), "Clicked", Toast.LENGTH_SHORT).show();

                storeBackground(R.drawable.bgscreen2);
                break;
        }
    }

    public void storeBackground(int background) {
        SharedPreferences sharedPreferences = getActivity().getSharedPreferences(BG_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();     //accessing the shared pref
        editor.putInt(BG_KEY, background);
        editor.apply(); 
    }

    //    getting the background
    public  int getBackground() {
    
        SharedPreferences sharedPreferences = getActivity().getSharedPreferences(BG_NAME, Context.MODE_PRIVATE);
        int selectedBG = sharedPreferences.getInt(BG_KEY, R.drawable.bgscreen1); 
        return selectedBG;
    }

}

Main Activity.java

public class MainActivity extends AppCompatActivity {

    private Button btnWatch, btnReadStory, btnFavorites, btnAbout, btnListen;
    private ImageButton btnTheme;

    static ConstraintLayout mainLayout;

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

        btnTheme = findViewById(R.id.btnTheme);
        mainLayout = findViewById(R.id.layoutMain);

        btnTheme.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                PopupTheme popupTheme = new PopupTheme();
                popupTheme.show(getSupportFragmentManager(), "Popup Theme");

            }
        });
    }

}

The problem is that you update background of your MainActivity only if you opened the PopupTheme dialog, So you need to move getBackground and update code from PopupTheme to the onCreate method on MainActivity so the code will executed when the user launch the app

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

     btnTheme = findViewById(R.id.btnTheme);
     mainLayout = findViewById(R.id.layoutMain);

     int background = getBackground();
     if (background  != R.drawable.bgscreen1 ){
        mainLayout.setBackgroundResource(background);
     }

     // Other code on onCreate
}

// Move getBackground method here from PopupTheme

Note: you can use -1 as default value of background and check if it's -1 that mean the user use the default background

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM