希望你能在这里帮助我!我想制作一个开关按钮,以打开每日推送通知功能。我怎么做?
开关按钮位于“设置”片段上
我的MainActivity.java:
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.addDrawerListener(toggle); toggle.syncState(); NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); displayView(R.id.nav_home); } @Override public void onBackPressed() { DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); return; } if (getSupportFragmentManager().findFragmentById(R.id.content_main) instanceof Article) { ((Article) getSupportFragmentManager().findFragmentById(R.id.content_main)).handleOnBackPress(); return; } if (getSupportFragmentManager().getBackStackEntryCount() == 0) { displayView(R.id.nav_home); } else { super.onBackPressed(); } } private void displayView(int itemId) { Fragment fragment = null; switch (itemId) { case R.id.nav_home: fragment = new Article(); break; case R.id.nav_Recipes: fragment = new RecipesMain(); break; case R.id.nav_Converter: fragment = new Converter(); break; case R.id.nav_Videos: fragment = new Videos(); break; case R.id.nav_Tracking: fragment = new Tracking(); break; case R.id.nav_TrainerMenu: fragment = new TrainerMenu(); break; case R.id.nav_Settings: fragment = new Settings(); break; case R.id.nav_About: showDialog(); break; } if (fragment != null) { final Fragment finalFragment = fragment; new Handler().postDelayed(new Runnable() { @Override public void run() { getSupportFragmentManager() .beginTransaction() .setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right) .replace(R.id.content_main, finalFragment) .commit(); } }, 0); } DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); } @SuppressWarnings("StatementWithEmptyBody") @Override public boolean onNavigationItemSelected(MenuItem item) { displayView(item.getItemId()); return true; } private void showDialog() { String text2 = "<font color=#6774bd>About SG50 App</font>"; AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AppCompatAlertDialogStyle); builder.setTitle(Html.fromHtml(text2)); String text3 = "<font color=#A4A4A4>App made by Matan Cohen , Please contact me for any questions.</font>";//for custom message builder.setMessage(Html.fromHtml(text3)); builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast toast = Toast.makeText(getApplicationContext(), "תודה על שימוש", Toast.LENGTH_SHORT); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); } }); builder.show(); } }
片段Settings.java 的“ editor.getBoolean”给我无法解决错误! 我能做什么?:
public class Settings extends Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_settings, container, false); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); getActivity().setTitle("הגדרות"); Switch aSwitch = (Switch) getView().findViewById(R.id.dailyTipSwitch); SharedPreferences sharedPreferences = getActivity().getSharedPreferences("key", 0); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putBoolean("switchValue", aSwitch.isChecked()); editor.apply(); boolean showNotifications = editor.getBoolean("key",false); if (aSwitch.isChecked() != showNotifications) { editor.putBoolean("key",!showNotifications).apply(); } else { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY,19); calendar.set(Calendar.MINUTE,27); Intent intent = new Intent(getActivity().getApplicationContext(),NotificationReciever.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity().getApplicationContext(),100,intent,PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager alarmManager = (AlarmManager) getActivity().getSystemService(ALARM_SERVICE); alarmManager.setRepeating(alarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY,pendingIntent); } } }
Notification_Reciever.java
public class NotificationReciever extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); Intent repeatingIntent = new Intent(context,MainActivity.class); repeatingIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(context,100,repeatingIntent,PendingIntent.FLAG_UPDATE_CURRENT); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context) .setSmallIcon(R.mipmap.ic_launcher) .setStyle(new NotificationCompat.BigTextStyle().bigText("בוקר טוב אלוף! תאכל ותשתה טוב!")) .setContentText(context.getString(R.string.NotificationText)) .setContentTitle(context.getString(R.string.GoodMorningNotification)) .setContentIntent(pendingIntent) .setAutoCancel(true); notificationManager.notify(100, mBuilder.build()); } }
fragemnt_settings.XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="30dp" android:paddingBottom="30dp" android:paddingTop="30dp" android:paddingRight="30dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:weightSum="1"> <Switch android:id="@+id/switch1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0" android:layout_gravity="left" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:layout_gravity="right" android:text="@string/daily_tip" android:textSize="20sp"/> </LinearLayout> </LinearLayout>
谢谢!!希望你能帮我!
editor.getBoolean给我无法解决错误!!!我能做什么???
您将需要将开关的值保存在某个地方(SQLite或SharedPreferences),并检查它是否为当前开关值,然后将其值保持 在选中或未选中的位置
这是创建SharedPreferences并放入值的方法:
SharedPreferences sharedPreferences = getSharedPreferences("key", 0); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putBoolean("switchValue", aSwitch.isChecked()); editor.apply();
这是检查SharedPreferences值并进行更改的方法:
Boolean showNotifications = editor.getBoolean("key",false); if (aSwitch.isChecked() != showNotifications) { editor.putBoolean("key",!showNotifications).apply(); }
您要在其中通知通知的位置,应检查SharedPreferences值:
Boolean showNotifications = editor.getBoolean("key",false);
已编辑 这是您触发通知的方式:
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.your_drawable) .setStyle(new NotificationCompat.BigTextStyle().bigText("notification text")) .setContentText(notificationToNotify.getText()) .setContentTitle(CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, "notification title")) .setContentIntent(contentPendingIntent) .setDeleteIntent(deletePendingIntent) .setAutoCancel(true); //notify the Notification mNotifyMgr.notify(notification_id, mBuilder.build());
notification_id-您可以为每个通知提供的int ID。您可以设置删除意图和内容意图(如果用户单击通知)
男人,您需要使用相同的“密钥”。像那样:
SharedPreferences sharedPreferences = getActivity().getSharedPreferences("key", 0); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putBoolean("**switchValue**", aSwitch.isChecked()); editor.apply(); boolean showNotifications = editor.getBoolean("**switchValue**",false);