Я делаю приложение в студии 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);
}
}
}
});
Возможный дубликат Что такое исключение NullPointerException и как его исправить?
@VladyslavMatviienko, как вы можете сказать дубликат ссылки, предоставленной вам выше?
Я не вижу ничего, связанного с общим доступом, а также где вы использовали логику для проверки условия и включения или отключения кнопки после открытия приложения? Было бы хорошо дать вам правильное решение, если вы подробно предоставите соответствующий фрагмент кода.
Редактор SharedPreferences.Editor; настройки SharedPreferences; частная статическая конечная строка ADD = "ADD_KEY"; предпочтения = getSharedPreferences (ДОБАВИТЬ, Context.MODE_PRIVATE); Общие настройки saveFavPrefs = getSharedPreferences(mydata, MODE_PRIVATE);; button.setClickable(saveFavPrefs.getBoolean("isclick", true));
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()); }
следующий шаг private void SaveState(boolean isChecked) { editor = preferences.edit(); editor.putBoolean (ДОБАВИТЬ, isChecked); редактор.коммит();
первый шаг public boolean GetState() { return preferences.getBoolean(ADD, false);
пожалуйста, дайте подходящий ответ на эту проблему
@HassanAliMughal Я думаю, вы используете невозможное условие, которое вы сказали if (counrClick == 1) { if (counrClick ==2)}} второе условие не будет выполнено, потому что вы поместили его внутрь if (counrClick ==1)
@HariNJha, конечно, прочитав вопрос: but every time the null object reference occurs.




//Добавляем этот код при нажатии кнопки
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$OnClickListener)» для ссылки на нулевой объект — только что Хасан Али Могол
Попробуйте это, он отключит кнопку в следующий раз, когда вы запустите свою активность, если она ранее была нажата дважды;
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$OnClickListener)' для ссылки на нулевой объект
Приведенный выше код не работает, он не сохраняет состояние кнопки при закрытии приложения.
я фазирую еще одну проблему, когда я помещаю 4 кнопки в приложение, если я нажимаю на одну кнопку и закрываю приложение, когда я открываю приложение, тогда состояние кнопки применяется к 4 кнопкам, а не к одной, хочу, когда я открываю приложение, тогда только одна кнопка отключить не следующие 3 кнопки
Пожалуйста, обратитесь к приведенному ниже коду. и, пожалуйста, помните, что вы можете использовать имя предпочтения ("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 кнопки
Проверьте сейчас, и вы можете использовать тот же подход для поддержки большего количества кнопок. Если вы потратите некоторое время на просмотр и рефакторинг кода, вы сможете сократить шаблонный код.
Вы можете опубликовать код sharedpref