使用共享偏好更改背景

Posted

技术标签:

【中文标题】使用共享偏好更改背景【英文标题】:Change background using shared preference 【发布时间】:2021-03-23 18:01:01 【问题描述】:

我有一个应用程序,它允许我的用户使用按钮自定义我的应用程序的背景。我的应用程序是这样工作的:首先它将引导他们进入我的主要活动,在那里他们可以按下一个按钮来自定义背景。当他们按下那个按钮时,它会引导他们进入一个对话框片段,让用户可以选择他们想要的背景图像。我可以更改我的背景,但是,共享首选项无法正常运行。当我关闭并打开我的应用程序时,它会变回我的默认背景,但是当我按下对话框片段按钮时,它会将背景更新为他们选择的任何内容。

所以基本上,只有当我打开提供背景图像的按钮时,背景才会更新。

我不确定我是否解释得很好,所以这是我的 gif problem

只有当我按下地形按钮时背景才会更新,有人有解决这个问题的想法吗?我对 android 和 java 还很陌生,所以我不确定我是否只是遗漏了一些东西......

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");

            
        );
    


【问题讨论】:

【参考方案1】:

问题是只有在打开 PopupTheme 对话框时才更新 MainActivity 的背景,因此您需要将 getBackground 和更新代码从 PopupTheme 移动到 MainActivity 上的 onCreate 方法,以便在用户启动应用程序时执行代码

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

注意:您可以使用 -1 作为背景的默认值,并检查是否为 -1 表示用户使用默认背景

【讨论】:

非常感谢!现在我知道了,我觉得自己很愚蠢。抱歉问了一个愚蠢的问题,我还是新手,再次感谢! 不客气,每个人都有错误 :D 祝你好运

以上是关于使用共享偏好更改背景的主要内容,如果未能解决你的问题,请参考以下文章

使用 css sprite 而不是更改背景 url 的好处

iOS 扩展 - 检测“扩展状态更改”(背景/前景)

跨多个视图控制器共享背景图像

根据用户设置设置背景视图

在对话框内悬停时更改视图的背景

组策略 设置桌面背景