как заставить setBackgroundResource сохранить изображение, используя SharedPreferences

#android

#Android

Вопрос:

У меня есть два разных стиля изображений карточек. У каждого есть шесть разных карт. Когда я нажимаю кнопку на верхней боковой панели, приложение изменяет изображения карт. и как только я изменю изображение карты, я хочу сохранить его до повторного изменения. Я использую sharePreferences. Я думаю, что мой код должен работать, но я не знаю, где я сделал это неправильно. Кто-нибудь может мне помочь с этим? Заранее благодарю вас.

 
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();
    }
}

  

Комментарии:

1. Достаточно всего одного экземпляра SharePreferences . В любом случае, где вы сохраняете свои изображения / состояния? Я ничего не вижу.

2. Спасибо за вашу помощь! Я очень новичок в программировании, так куда же мне поместить один экземпляр sharePreferences. и как создать единственный экземпляр sharePreferenes. Изображения доступны для рисования.

Ответ №1:

Вы должны использовать один экземпляр 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);
  

Вы можете использовать специальный класс настроек, чтобы уменьшить беспорядок.

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

Комментарии:

1. Спасибо за вашу помощь!! но проблема в том, что я не могу сохранить изображение карты даже после использования другого действия…. Я не знаю, как использовать ваш код. есть ли какой-либо способ использовать мой код для достижения этой цели?

2. Вы правильно используете настройки для своей цели, но ваша реализация неверна, поэтому вам следует исправить реализацию. Я должен написать ваш код для вас, чтобы помочь вам дальше, чем мой ответ.

3. Спасибо за вашу помощь! Я ценю это!

4. Спасибо за вашу помощь. Я пытаюсь добавить код в метод onResume. но я не знаю как. Не могли бы вы дать мне некоторую идею по этому поводу? Спасибо.