首页 > 解决方案 > 如何使 setBackgroundResource 使用 SharedPreferences 保存图像

问题描述

我有两种不同风格的卡片图像。每一张都有六张不同的卡片。当我单击上侧栏上的按钮时,应用程序会更改卡片图像。一旦我更改了卡片图像,我想保留它,直到我重新更改它。我正在使用共享首选项。我认为我的代码应该可以工作,但我不知道我在哪里做错了。谁能帮我这个?先感谢您。


public class CardFragment extends Fragment {

    private int num = 0;
    private final int RANDOM_NUM = 0;
    private int cardNum1, cardNum2, cardNum3, cardNum4, cardNum5, cardNum6;
    private ImageView view1, view2, view3, view4, view5, view6;
    private Statement stmt2;
    private ResultSet rs, rs2;
    private Bible bible;
    private String categoryName;
   // private InterstitialAd mInterstitialAd;
    private SharedPreferences imageDialog;
    private SharedPreferences imageChange;
    private SharedPreferences imageCard1, imageCard2, imageCard3, imageCard4, imageCard5, imageCard6;
    private int cardee1, cardee2, cardee3, cardee4, cardee5, cardee6, carde1, carde2, carde3, carde4, carde5, carde6;
    public static final int REQUEST_CODE = 101;

    @SuppressLint("SourceLockedOrientationActivity")
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

       
           View view = inflater.inflate(R.layout.fragment_card, container, false);
        view1 = view.findViewById(R.id.card1);
        view1.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                // displayInterstitial();
                //Toast.makeText(context, cardNum1, Toast.LENGTH_SHORT).show();
                Log.d("cardNum1", String.valueOf(cardNum1));
                drawCard(cardNum1);


            }
        });

        view2 = view.findViewById(R.id.card2);
        view2.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {

                // Toast.makeText(getContext(), cardNum1, Toast.LENGTH_SHORT).show();
                Log.d("cardNum2", String.valueOf(cardNum2));
                drawCard(cardNum2);


            }
        });

        view3 = view.findViewById(R.id.card3);
        view3.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {

                //Toast.makeText(getContext(), cardNum1, Toast.LENGTH_SHORT).show();
                Log.d("cardNum3", String.valueOf(cardNum3));
                drawCard(cardNum3);


            }
        });

        view4 = view.findViewById(R.id.card4);
        view4.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {

                //Toast.makeText(getContext(), cardNum1, Toast.LENGTH_SHORT).show();
                Log.d("cardNum4", String.valueOf(cardNum4));
                drawCard(cardNum4);


            }
        });

        view5 = view.findViewById(R.id.card5);
        view5.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {

                //Toast.makeText(getContext(), cardNum1, Toast.LENGTH_SHORT).show();
                Log.d("cardNum5", String.valueOf(cardNum5));
                drawCard(cardNum5);


            }
        });

        view6 = view.findViewById(R.id.card6);
        view6.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {

                //Toast.makeText(getContext(), cardNum1, Toast.LENGTH_SHORT).show();
                Log.d("cardNum6", String.valueOf(cardNum6));
                drawCard(cardNum6);


            }
        });
        setHasOptionsMenu(true);
        return view;
    }

    public void drawCard(int num) {
        Log.d("card", "card");
        Log.d("num", num + "");
        /*String dbName = "bible.db";
        Connection conn = Utiles.dbConnection();*/

        MyDatabaseHelper db = new MyDatabaseHelper(getActivity());
        Cursor cursor = db.readCardData(num);
        cursor.moveToFirst();
        bible = new Bible();
        Log.d("cursorid", String.valueOf(cursor.getInt(0)));
        bible.setId(cursor.getInt(0));
        bible.setVerse(cursor.getString(1));
        bible.setContent(cursor.getString(2));
        bible.setNum(cursor.getInt(3));
        bible.setCnum(cursor.getInt(4));
        bible.setVnum(cursor.getInt(5));
        bible.setImagenum(cursor.getInt(6));
        bible.setTimestamp(cursor.getString(7));
        Log.d("content", bible.getContent());
        Log.d("bible.getCnum", String.valueOf(bible.getCnum()));
        Cursor cursor1 = db.getCategoryName(bible.getCnum());
        cursor1.moveToFirst();
        categoryName = cursor1.getString(0);

        Log.d("!!!!!bible", bible.toString());
        Intent intent = new Intent(getActivity(), VerseActivity.class);
        // intent.putExtra("cardBible", bible);
        intent.putExtra("cardBible", bible);
        intent.putExtra("cName", categoryName);
        startActivity(intent);

     
    }


    @Override
    public void onResume() {
        super.onResume();
        int[] cardNumArray = new int[6];
        Map<Integer, Integer> map = new HashMap<>();
        ArrayList<Integer> cardNumList = new ArrayList<>();
        cardNumList.clear();
        map.clear();

        while (true) {
            num = (int) (Math.random() * 212) + 1;
            map.put(num, num);


            if (map.size() > 5) {
                // Log.d("Test", "Test");
                break;
            }
        }
        Set<Integer> key = map.keySet();
        for (int c : key) {
            cardNumList.add(c);
        }

        for (int i = 0; i < cardNumList.size(); i++) {
            Log.d("Number!!!!!", String.valueOf(cardNumList.size()));
            cardNumArray[i] = cardNumList.get(i);
            Log.d("cardIndex[" + i + "]", String.valueOf(cardNumArray[i]));
        }
        cardNum1 = cardNumArray[0];
        cardNum2 = cardNumArray[1];
        cardNum3 = cardNumArray[2];
        cardNum4 = cardNumArray[3];
        cardNum5 = cardNumArray[4];
        cardNum6 = cardNumArray[5];

        imageCard1 = this.getActivity().getSharedPreferences("imageCard1", Context.MODE_PRIVATE);
        imageCard2 = this.getActivity().getSharedPreferences("imageCard2", Context.MODE_PRIVATE);
        imageCard3 = this.getActivity().getSharedPreferences("imageCard3", Context.MODE_PRIVATE);
        imageCard4 = this.getActivity().getSharedPreferences("imageCard4", Context.MODE_PRIVATE);
        imageCard5 = this.getActivity().getSharedPreferences("imageCard5", Context.MODE_PRIVATE);
        imageCard6 = this.getActivity().getSharedPreferences("imageCard6", Context.MODE_PRIVATE);

    }

    @Override
    public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
        inflater.inflate(R.menu.settings_actions, menu);
    }


    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {

        switch (item.getItemId()) {
            case R.id.setting:
                imageDialog = this.getActivity().getSharedPreferences("imageDialog", Context.MODE_PRIVATE);
                boolean imageD = imageDialog.getBoolean("imageDialog", true);
                imageChange = this.getActivity().getSharedPreferences("imageChange", Context.MODE_PRIVATE);
                boolean imageChg = imageChange.getBoolean("imageChange", true);


                if (imageD) {
                    imageChDialogPopup(imageChg);
                } else {
                    if (imageChg) {
                        cardee1 = imageCard1.getInt("cardee1", R.drawable.cardee1);
                        cardee2 = imageCard2.getInt("cardee2", R.drawable.cardee2);
                        cardee3 = imageCard3.getInt("cardee3", R.drawable.cardee3);
                        cardee4 = imageCard4.getInt("cardee4", R.drawable.cardee4);
                        cardee5 = imageCard5.getInt("cardee5", R.drawable.cardee5);
                        cardee6 = imageCard6.getInt("cardee6", R.drawable.cardee6);
                        view1.setBackgroundResource(cardee1);
                        view2.setBackgroundResource(cardee2);
                        view3.setBackgroundResource(cardee3);
                        view4.setBackgroundResource(cardee4);
                        view5.setBackgroundResource(cardee5);
                        view6.setBackgroundResource(cardee6);
                        SharedPreferences.Editor editor = imageChange.edit();
                        editor.putBoolean("imageChange", false);
                        editor.commit();
                    } else {
                        carde1 = imageCard1.getInt("cardee1", R.drawable.carde1);
                        carde2 = imageCard2.getInt("cardee2", R.drawable.carde2);
                        carde3 = imageCard3.getInt("cardee3", R.drawable.carde3);
                        carde4 = imageCard4.getInt("cardee4", R.drawable.carde4);
                        carde5 = imageCard5.getInt("cardee5", R.drawable.carde5);
                        carde6 = imageCard6.getInt("cardee6", R.drawable.carde6);
                        view1.setBackgroundResource(carde1);
                        view2.setBackgroundResource(carde2);
                        view3.setBackgroundResource(carde3);
                        view4.setBackgroundResource(carde4);
                        view5.setBackgroundResource(carde5);
                        view6.setBackgroundResource(carde6);

                        SharedPreferences.Editor editor = imageChange.edit();
                        editor.putBoolean("imageChange", true);
                        editor.commit();

                    }
                }
                return true;

        }
        return super.onOptionsItemSelected(item);
    }

    private void imageChDialogPopup(final boolean imageChg) {
        final AlertDialog.Builder builder = new AlertDialog.Builder(getContext(), R.style.AlertDialogCustom);
        builder.setTitle("Changing Card Theme");
        builder.setMessage("If you select this button, the cards will be changed.");
        builder.setPositiveButton("Change",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {


                        if (imageChg) {
                            cardee1 = imageCard1.getInt("cardee1", R.drawable.cardee1);
                            cardee2 = imageCard2.getInt("cardee2", R.drawable.cardee2);
                            cardee3 = imageCard3.getInt("cardee3", R.drawable.cardee3);
                            cardee4 = imageCard4.getInt("cardee4", R.drawable.cardee4);
                            cardee5 = imageCard5.getInt("cardee5", R.drawable.cardee5);
                            cardee6 = imageCard6.getInt("cardee6", R.drawable.cardee6);
                            view1.setBackgroundResource(cardee1);
                            view2.setBackgroundResource(cardee2);
                            view3.setBackgroundResource(cardee3);
                            view4.setBackgroundResource(cardee4);
                            view5.setBackgroundResource(cardee5);
                            view6.setBackgroundResource(cardee6);
                            SharedPreferences.Editor editor = imageChange.edit();
                            editor.putBoolean("imageChange", false);
                            editor.commit();
                        } else {
                            carde1 = imageCard1.getInt("cardee1", R.drawable.carde1);
                            carde2 = imageCard2.getInt("cardee2", R.drawable.carde2);
                            carde3 = imageCard3.getInt("cardee3", R.drawable.carde3);
                            carde4 = imageCard4.getInt("cardee4", R.drawable.carde4);
                            carde5 = imageCard5.getInt("cardee5", R.drawable.carde5);
                            carde6 = imageCard6.getInt("cardee6", R.drawable.carde6);
                            view1.setBackgroundResource(carde1);
                            view2.setBackgroundResource(carde2);
                            view3.setBackgroundResource(carde3);
                            view4.setBackgroundResource(carde4);
                            view5.setBackgroundResource(carde5);
                            view6.setBackgroundResource(carde6);

                            SharedPreferences.Editor editor = imageChange.edit();
                            editor.putBoolean("imageChange", true);
                            editor.commit();

                        }

                    }
                });
        builder.setNegativeButton("Don\'t show this message, again.",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        SharedPreferences.Editor editor = imageDialog.edit();
                        editor.putBoolean("imageDialog", false);
                        editor.commit();

                        Toast.makeText(getContext(), "You select \'Don\'t show this message, again.\'", Toast.LENGTH_SHORT).show();
                    }
                });
        builder.show();
    }
}

标签: android

解决方案


您应该在片段上使用单个 SharedPreferences 实例。

SharedPreferences preferences = context.getSharedPreferences(MY_SHARED_PREF_ID,Context.MODE_PRIVATE);

使用不同的键将数据保存到该实例。

preferences.edit().putInt(IMAGE_CARD_1_KEY,R.drawable.cardee1).apply();
preferences.edit().putInt(IMAGE_CARD_2_KEY,R.drawable.cardee2).apply();

使用相同的密钥获取您的数据。

int cardee1 = preferences.getInt(IMAGE_CARD_1_KEY,0);

您可以使用专用的 Preferences 类来减少混乱。

public class Preferences {  
    private static Preferences instance;
    private SharedPreferences preferences;
    private final String MY_SHARED_PREF_ID = "a shared pref name";
    private final String KEY_IMAGE_1 = "keyImage1";

public static Preferences getInstance(Context context) {
    if (instance == null)
        instance = new Preferences();
    instance.init(context);
    return instance;
}

private Preferences() {

}

private void init(Context context) {
    preferences = context.getSharedPreferences(MY_SHARED_PREF_ID, Context.MODE_PRIVATE);
}

public String getImage1() {
    return preferences.getInt(KEY_IMAGE_1, 0);
}

public void setImage1(int img1) {
    preferences.edit().putInt(KEY_IMAGE_1, img1).apply();
}
}

在任何片段/活动/服务中

Preferences preferences = Preferences.getInstance(context);
int image1 = preferences.getImage1();

推荐阅读