#java #android-studio #android-togglebutton
Вопрос:
что я делаю ?
Я в основном создаю кнопку переключения, которая отправляет уведомление, когда статус проверки соответствует действительности.
что было сделано до сих пор?
в Activity_setting.xml
lt;com.google.android.material.switchmaterial.SwitchMaterial android:id="@ id/toggleButtonAlert" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="4dp" android:checked="true" /gt;
в SettingActivity.java
public class SettingsActivity extends AppCompatActivity { SharedPreferences notificationsPreferences; SharedPreferences eScoreAlertPreferences; SharedPreferences.Editor escoreEditor; SwitchMaterial toggleButtonAlert; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_settings); toggleButtonAlert = findViewById(R.id.toggleButtonAlert); toggleButtonAlert.setOnCheckedChangeListener((buttonView, isChecked) -gt; { if (isChecked) { eScoreAlertPreferences = getSharedPreferences("AlertLastChange", Context.MODE_PRIVATE); escoreEditor= eScoreAlertPreferences.edit(); editor.putBoolean("key_ToggleValue", true).commit(); // Saving boolean - true/false } else { eScoreAlertPreferences = getSharedPreferences("AlertLastChange", Context.MODE_PRIVATE); escoreEditor= eScoreAlertPreferences.edit(); editor.putBoolean("key_ToggleValue", false).commit(); // Saving boolean - true/false } }); } }
извлекать значения в FeedActivity.java(другой класс java) и вызов функции push-уведомления
public class FeedActivity extends AppCompatActivity { private Boolean AlertStat; public NotificationManager notificationManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); View v2 = inflater.inflate(R.layout.fragment_feed, container, false); SharedPreferences prefs=context.getSharedPreferences("AlertLastChange", Context.MODE_PRIVATE); AlertStat = prefs.getBoolean("key_ToggleValue", true); makePushEscoreNotification(); } private void makePushEscoreNotification() { if (AlertStat) { String channelId = "1234"; NotificationCompat.Builder builder = new NotificationCompat.Builder(context, channelId) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("sometitle") .setStyle(new NotificationCompat.BigTextStyle() .bigText("Some text")) .setSound(Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE "://" context.getPackageName() "/" R.raw.negativetone)) .setVibrate(new long[]{0L}); notificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE); if (Build.VERSION.SDK_INT gt;= Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel(channelId, "ReviewProbe",NotificationManager.IMPORTANCE_HIGH); assert notificationManager != null; notificationManager.createNotificationChannel(channel); } assert notificationManager != null; builder.setPriority(NotificationCompat.PRIORITY_HIGH); notificationManager.notify(0, builder.build()); } } }
Проблема: что пошло не так ? кнопка переключения не сохраняет состояние и всегда включена, даже если мы пытаемся отключить ее вручную . раздел отправки уведомлений работает нормально
Комментарии:
1. Вы должны окончательно использовать константы для строк, которые используются чаще, например, ваш ключ общих предпочтений
2. да , да, тай , за твой вклад, я буду
Ответ №1:
Задание Активности:
private boolean isSwitchOpenNotification; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); switchNotification.setClickable(false); switchNotification.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { goToNotificationSettings(); return false; } }); } private void verifyNotificationSetting() { if (NotificationManagerCompat.from(baseActivity) != null) { isSwitchOpenNotification = NotificationManagerCompat.from(baseActivity).areNotificationsEnabled(); ObLogger.i(TAG, "onResume: Notification is gt;gt; " isSwitchOpenNotification); // add store value isSwitchOpenNotification in SharedPreferences. if (isSwitchOpenNotification) { switchNotification.setChecked(true); } else { switchNotification.setChecked(false); } } } private void goToNotificationSettings() { if (Build.VERSION.SDK_INT gt;= Build.VERSION_CODES.LOLLIPOP) { Intent intent = new Intent(); intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS"); //for Android 5-7 intent.putExtra("app_package", baseActivity.getPackageName()); intent.putExtra("app_uid", baseActivity.getApplicationInfo().uid); // for Android 8 and above intent.putExtra("android.provider.extra.APP_PACKAGE", baseActivity.getPackageName()); startActivity(intent); } else { // for API Level 17,18,19,20 ObLogger.i(TAG, "onTouch: Notification open...."); Intent intent = new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setData(Uri.parse("package:" baseActivity.getPackageName())); startActivity(intent); } } @Override public void onResume() { super.onResume(); ObLogger.i(TAG, "onResume: "); verifyNotificationSetting(); }
Комментарии:
1. вы тестировали этот код раньше? что такое AppUtils и isAdded() здесь?
2. удалите эту строку.
3. обновите мой ответ, пожалуйста, проверьте его
4. этот код приводит меня к настройке уведомлений приложения при нажатии кнопки переключения, и кнопка переключения зависает включенной
5. что я хотел , так это уведомление о push-сообщениях с опцией включения/выключения, поэтому , когда состояние переключения является истинным , уведомление о push-сообщениях включено, тогда как в случае ложного , оно просто сохраняет состояние кнопки переключения в общих общих настройках