Сохранить состояние кнопки (включить и отключить)

Я делаю приложение в студии Android, в своем приложении я добавляю функцию, если пользователь нажимает кнопку во второй раз, тогда кнопка отключается и сохраняет состояние кнопки в общем преферансе, и если пользователь закрыл приложение и снова открыл приложение, то отображается состояние кнопки сохранения (если кнопка отключена, отображается кнопка отключения, в противном случае отображается состояние включения). Я помещаю много кодов общих настроек в свой код, но каждый раз, когда возникает ссылка на нулевой объект. Мой код приведен ниже, и я поместил код общих настроек на эту кнопку, но как?

Джава:

 button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                counrClick = counrClick + 1;
                if (counrClick == 1) {

                    downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
                    Uri uri = Uri.parse("Url");
                    DownloadManager.Request request = new DownloadManager.Request(uri);
                    request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);
                    request.setAllowedOverRoaming(false);
                    request.setTitle("" + "" + "");
                    request.setDescription("Downloading " + "" + "");
                    request.setVisibleInDownloadsUi(true);
                    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                    Long reference = downloadManager.enqueue(request);
                    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "/" + "filename");
                    refid = downloadManager.enqueue(request);
                    Log.e("OUT", "" + refid);
                    if (counrClick == 2) {
                        button.setEnabled(false);

                    }


                }
            }

        });

Вы можете опубликовать код sharedpref

akshay_shahane 27.06.2019 09:20

Возможный дубликат Что такое исключение NullPointerException и как его исправить?

Vladyslav Matviienko 27.06.2019 09:25

@VladyslavMatviienko, как вы можете сказать дубликат ссылки, предоставленной вам выше?

Hari N Jha 27.06.2019 09:35

Я не вижу ничего, связанного с общим доступом, а также где вы использовали логику для проверки условия и включения или отключения кнопки после открытия приложения? Было бы хорошо дать вам правильное решение, если вы подробно предоставите соответствующий фрагмент кода.

Hari N Jha 27.06.2019 09:37

Редактор SharedPreferences.Editor; настройки SharedPreferences; частная статическая конечная строка ADD = "ADD_KEY"; предпочтения = getSharedPreferences (ДОБАВИТЬ, Context.MODE_PRIVATE); Общие настройки saveFavPrefs = getSharedPreferences(mydata, MODE_PRIVATE);; button.setClickable(saveFavPrefs.getBoolean("isclick", true));

Hassan Ali Mughal 27.06.2019 09:58

button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { counrClick = counrClick + 1; if (counrClick == 1) { //code// if (counrClick == 2) { button. setEnabled(false); SaveState(button.isEnable()); }

Hassan Ali Mughal 27.06.2019 10:04

следующий шаг private void SaveState(boolean isChecked) { editor = preferences.edit(); editor.putBoolean (ДОБАВИТЬ, isChecked); редактор.коммит();

Hassan Ali Mughal 27.06.2019 10:05

первый шаг public boolean GetState() { return preferences.getBoolean(ADD, false);

Hassan Ali Mughal 27.06.2019 10:05

пожалуйста, дайте подходящий ответ на эту проблему

Hassan Ali Mughal 27.06.2019 10:05

@HassanAliMughal Я думаю, вы используете невозможное условие, которое вы сказали if (counrClick == 1) { if (counrClick ==2)}} второе условие не будет выполнено, потому что вы поместили его внутрь if (counrClick ==1)

Ugas 27.06.2019 10:19

@HariNJha, конечно, прочитав вопрос: but every time the null object reference occurs.

Vladyslav Matviienko 27.06.2019 11:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
11
571
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

//Добавляем этот код при нажатии кнопки

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        prefs.edit().putString("enabled", "").apply();

//Добавить этот код в метод OnCreate/OncreateView

  String statusLocked1 =  prefs.getString("enabled","");
    if (statusLocked1.equals("enabled")){
        //enable the button 
    }else{
        //disbale the button 
    }

Возникла ошибка, вызванная: java.lang.NullPointerException: попытка вызвать виртуальный метод «void android.widget.Button.setOnClickListener(android.view.View$O‌​nClickListener)» для ссылки на нулевой объект — только что Хасан Али Могол

Hassan Ali Mughal 27.06.2019 11:36

Попробуйте это, он отключит кнопку в следующий раз, когда вы запустите свою активность, если она ранее была нажата дважды;

Button button;
SharedPreferences preferences;
boolean firstclick = true;

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

    // SharePrefs
    preferences = getSharedPreferences("yourprefsname", 0);
    firstclick = preferences.getBoolean("countclick", false);
    button = findViewById(R.id.yourbutton);

    //disables if it is clicked twice 
    if (!firstclick){
        button.setEnabled(false);
    }


    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (firstclick) {

                downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
                Uri uri = Uri.parse("Url");
                DownloadManager.Request request = new DownloadManager.Request(uri);
                request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);
                request.setAllowedOverRoaming(false);
                request.setTitle("" + "" + "");
                request.setDescription("Downloading " + "" + "");
                request.setVisibleInDownloadsUi(true);
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                Long reference = downloadManager.enqueue(request);
                request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "/" + "filename");
                refid = downloadManager.enqueue(request);
                Log.e("OUT", "" + refid);
                else{
                    //edit prefs                   
             preferences.edit().putBoolean("countclick",firstclick).apply();
                    button.setEnabled(false);

                }


            }
        }
    });
}

Ошибка возникает из-за: java.lang.NullPointerException: попытка вызвать виртуальный метод 'void android.widget.Button.setOnClickListener(android.view.View$O‌​nClickListener)' для ссылки на нулевой объект

Hassan Ali Mughal 27.06.2019 11:23

Приведенный выше код не работает, он не сохраняет состояние кнопки при закрытии приложения.

Hassan Ali Mughal 28.06.2019 13:30

я фазирую еще одну проблему, когда я помещаю 4 кнопки в приложение, если я нажимаю на одну кнопку и закрываю приложение, когда я открываю приложение, тогда состояние кнопки применяется к 4 кнопкам, а не к одной, хочу, когда я открываю приложение, тогда только одна кнопка отключить не следующие 3 кнопки

Hassan Ali Mughal 28.06.2019 13:31
Ответ принят как подходящий

Пожалуйста, обратитесь к приведенному ниже коду. и, пожалуйста, помните, что вы можете использовать имя предпочтения ("MY_PREF") и имя ключа ("DOWNLOAD_BUTTON_STATUS"), чтобы изменить предпочтение в любом другом месте вашего приложения. Вы даже можете создать отдельный класс для управления всеми настройками в вашем приложении.

 private SharedPreferences sharedPreferences;
private Button btn_download_one, btn_download_two, btn_download_three, btn_download_four;
private final String DOWNLOAD_BUTTON_STATUS_KEY_ONE = "DOWNLOAD_BUTTON_STATUS_ONE";
private final String DOWNLOAD_BUTTON_STATUS_KEY_TWO = "DOWNLOAD_BUTTON_STATUS_TWO";
private final String DOWNLOAD_BUTTON_STATUS_KEY_THREE = "DOWNLOAD_BUTTON_STATUS_THREE";
private final String DOWNLOAD_BUTTON_STATUS_KEY_FOUR = "DOWNLOAD_BUTTON_STATUS_FOUR";
private int clickCountOne = 0, clickCountTwo = 0, clickCountThree = 0, clickCountFour = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btn_download_one = findViewById(R.id.button1);
    btn_download_two = findViewById(R.id.button2);
    btn_download_three = findViewById(R.id.button3);
    btn_download_four = findViewById(R.id.button4);
    sharedPreferences = getSharedPreferences("MY_PREF", 0);
    btn_download_one.setEnabled(getDownloadButtonStatusPref(DOWNLOAD_BUTTON_STATUS_KEY_ONE));
    btn_download_two.setEnabled(getDownloadButtonStatusPref(DOWNLOAD_BUTTON_STATUS_KEY_TWO));
    btn_download_three.setEnabled(getDownloadButtonStatusPref(DOWNLOAD_BUTTON_STATUS_KEY_THREE));
    btn_download_four.setEnabled(getDownloadButtonStatusPref(DOWNLOAD_BUTTON_STATUS_KEY_FOUR));


    btn_download_one.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //... some code
            clickCountOne++;
            if (clickCountOne == 2)
                changeDownloadButtonStatusPref(DOWNLOAD_BUTTON_STATUS_KEY_ONE, false);

        }
    });
    btn_download_two.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //... some code
            clickCountTwo++;
            if (clickCountTwo == 2)
                changeDownloadButtonStatusPref(DOWNLOAD_BUTTON_STATUS_KEY_TWO, false);

        }
    });
    btn_download_three.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //... some code
            clickCountThree++;
            if (clickCountThree == 2)
                changeDownloadButtonStatusPref(DOWNLOAD_BUTTON_STATUS_KEY_THREE, false);

        }
    });
    btn_download_four.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //... some code
            clickCountFour++;
            if (clickCountFour == 2)
                changeDownloadButtonStatusPref(DOWNLOAD_BUTTON_STATUS_KEY_FOUR, false);

        }
    });

}

private void changeDownloadButtonStatusPref(String key, boolean status) {
    sharedPreferences.edit().putBoolean(key, status).apply();
    switch (key) {
        case DOWNLOAD_BUTTON_STATUS_KEY_ONE:
            btn_download_one.setEnabled(status);
            clickCountOne = 0;
            break;
        case DOWNLOAD_BUTTON_STATUS_KEY_TWO:
            btn_download_two.setEnabled(status);
            clickCountTwo = 0;
            break;
        case DOWNLOAD_BUTTON_STATUS_KEY_THREE:
            btn_download_three.setEnabled(status);
            clickCountThree = 0;
            break;
        case DOWNLOAD_BUTTON_STATUS_KEY_FOUR:
            btn_download_four.setEnabled(status);
            clickCountFour = 0;
            break;
    }
}

private boolean getDownloadButtonStatusPref(String key) {
    return sharedPreferences.getBoolean(key, true);
}

я решаю еще одну проблему. Я использую ваш код в своем приложении, но этот код работает только на одной кнопке, но не на нескольких кнопках. когда я помещаю 4 кнопки в приложение, если я нажимаю на одну кнопку и закрываю приложение, когда я открываю приложение, тогда состояние кнопки применяется к 4 кнопкам, а не к одной, хочу, когда я открываю приложение, тогда отключается только одна кнопка, а не следующие 3 кнопки

Hassan Ali Mughal 28.06.2019 13:37

Проверьте сейчас, и вы можете использовать тот же подход для поддержки большего количества кнопок. Если вы потратите некоторое время на просмотр и рефакторинг кода, вы сможете сократить шаблонный код.

Geo 01.07.2019 07:10

Другие вопросы по теме

Как получить контекст внутри объекта?
Создайте библиотеку зависимостей gradle с включением транзитивных зависимостей
Запутался в обработке ошибок на сетевом уровне при реализации MVVM в Android. Как уведомить пользователя о том, что что-то не так?
Предложите пользователям обновить приложение Android с помощью Google Play (поддержка Google In-App Update)
Firebase – получение URL-адреса изображения
Как переключиться с одного фрагмента на другой при нажатии на элемент списка?
Очистить теги OneSignal, когда пользователь удаляет приложение
Как настроить представление, когда пользователь нажимает кнопку «Назад» телефона, он возвращается к представлению в том же классе Java
Отправлять данные на сервер каждую минуту (для проверки статуса пользователя)
Не удается найти версию «androidx.annotation:annotation», которая удовлетворяет ограничениям версии: ошибка при запуске androidTests