общие настройки не могут получить данные

#java #android #sharedpreferences #decrement

#java #Android #sharedpreferences #уменьшение

Вопрос:

Я пытаюсь создать промо-код для своего приложения, когда пользователь введет правильное значение в EditText я установлю логическое значение false , и число будет сохранено в общих настройках. Но не знаю, почему значение не уменьшается, и даже если оно уменьшается, и даже если я делаю это несколько раз, тогда оно перемещается только с 30 на 29. Итак, я создал тестовое приложение, в onClick котором я устанавливаю значение того, что происходит, когда промо-код равен. Итак, суть в том, что когда пользователь открывает приложение, число уменьшается и сохраняется обратно, когда логическое значение равно false

 public class MainActivity extends AppCompatActivity {
   TextView textView;
    Button button, button1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.textView);
        button = (Button) findViewById(R.id.button);
        button1 = (Button) findViewById(R.id.button2);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences prefs = getSharedPreferences("Admob", 0);
                SharedPreferences.Editor editor = prefs.edit();
                editor.putBoolean("ShowAd", false);
                editor.putLong("daycounter", 30);
                editor.commit();
            }
        });
        caller();
    }

    @Override
    protected void onResume() {
        super.onResume();
        caller();
    }

    @Override
    protected void onPause() {
        super.onPause();
        caller();
    }


    public void caller() {
        SharedPreferences settings = getSharedPreferences("Admob", 0);
        boolean ad_start = settings.getBoolean("ShowAd", true);
        long ad = settings.getLong("daycounter", 0);

        SharedPreferences prefs = getSharedPreferences("apprater", 0);

        SharedPreferences.Editor editor = prefs.edit();

        Log.e("toaster", ""   ad_start);
        if (!ad_start) {
            long ads = ad -1 ;

            if (ad > 0) {
                editor.putLong("daycounter", ads);
                editor.putBoolean("ShowAd", true);
                editor.commit();
                Toast.makeText(MainActivity.this, ""   ads, Toast.LENGTH_SHORT).show();
                textView.setText(ad   "R"   ad_start);
            }
        }

    }
}
  

В фиктивном приложении, в котором я показываю данные, TextView поэтому я вызываю метод onResume and onPause , в противном случае я знаю, что onCreate этого достаточно. Я не понимаю, что не так в алгоритме. Я вообще не получаю никакой ошибки, и в тосте я могу уменьшить значение только до 29. Я перепробовал все типы операций уменьшения. Любой совет будет полезен. ** Я могу сохранить данные, но проблема в том, что последнее значение не сохраняется и не уменьшается **

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

1. Вы хотите уменьшать daycouter при каждом нажатии кнопки?

2. нет, когда я открываю приложение, оно уменьшается

Ответ №1:

Поместите эти методы в свой класс utils и используйте

   public static void cacheBoolean(Context ctx, String k, Boolean v) {
    SharedPreferences prefs = getSharedPreferences(ctx);
    prefs.edit().putBoolean(k, v).apply();
}

public static Boolean getCachedBoolean(Context ctx, String k, Boolean defaultValue) {
    SharedPreferences prefs = getSharedPreferences(ctx);
    return prefs.getBoolean(k, defaultValue);
}

public static void cacheString(Context ctx, String k, String v) {
    SharedPreferences prefs = getSharedPreferences(ctx);
    prefs.edit().putString(k, v).apply();
}

public static String getCachedString(Context ctx, String k, String defaultValue) {
    SharedPreferences prefs = getSharedPreferences(ctx);
    return prefs.getString(k, defaultValue);
}

public static void cacheInt(Context ctx, String k, int v) {
    SharedPreferences prefs = getSharedPreferences(ctx);
    prefs.edit().putInt(k, v).apply();
}

public static int getCachedInt(Context ctx, String k, int defaultValue) {
    SharedPreferences prefs = getSharedPreferences(ctx);
    return prefs.getInt(k, defaultValue);
}

public static void clearCachedKey(Context context, String key) {
    getSharedPreferences(context).edit().remove(key).apply();
}
  

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

1. сэр, это простое sharepreference, я не думаю, что это имеет какое-либо значение. я знаю, как сохранить данные, и я могу сохранять и получать данные, но длинное значение не сохраняется

2. Кажется немного саморекламой, но вы можете использовать некоторые библиотеки, подобные этой , вместо того, чтобы писать так много шаблонного кода : D

Ответ №2:

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

 public class MainActivity extends AppCompatActivity {
   TextView textView;
    Button button, button1;
   SharedPreferences prefs;
   SharedPreferences.Editor editor;
   final String pref_name = "Admob";
   final String ad_name = "ShowAd";
   final String day_count = "daycounter";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.textView);
        button = (Button) findViewById(R.id.button);
        button1 = (Button) findViewById(R.id.button2);
        prefs = getSharedPreferences(pref_name, 0);
        editor = prefs.edit();
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                editor.putBoolean(ad_name, false);
                editor.putLong(day_count, 30);
                editor.commit();
            }
        });
        caller();
    }

    @Override
    protected void onResume() {
        super.onResume();
        caller();
    }

    @Override
    protected void onPause() {
        super.onPause();
        caller();
    }


    public void caller() {
        boolean ad_start = prefs.getBoolean(ad_name, true);
        long ad = prefs.getLong(day_count, 0);

        Log.e("toaster", ""   ad_start);
        if (!ad_start) {
            long ads = ad -1 ;

           if (ad < 0) {
              editor.putBoolean(ad_name, true);
            }
           editor.putLong(day_count, ads);
           editor.commit();
           Toast.makeText(MainActivity.this, ""   ads, Toast.LENGTH_SHORT).show();
           textView.setText(ad   "R"   ad_start);
        }

    }
}
  

Ответ №3:

Я допустил ошибку в этой части метода, спасибо Ахмеду, сэр, Моя ошибка заключалась в установке значения, равного
if (ad > 0) поэтому, когда значение больше нуля, логическое значение принималось как true, и данные никогда не получали шанса на большее уменьшение

  public void caller() {
    SharedPreferences settings = getSharedPreferences("Admob", 0);
    boolean ad_start = settings.getBoolean("ShowAd", true);
    long ad = settings.getLong("daycounter", 0);


    Log.e("toaster", ""   ad_start);
    if (!ad_start) {
        SharedPreferences prefs = getSharedPreferences("Admob", 0);

        SharedPreferences.Editor editor = prefs.edit();
        long ads = ad - 1;

        if (ad < 0) {
            editor.putBoolean("ShowAd", true);
        }
        editor.putLong("daycounter", ads);
        editor.commit();
        Toast.makeText(MainActivity.this, ""   ads, Toast.LENGTH_SHORT).show();
        textView.setText(ad   "R"   ad_start);
    }

}