SharedPrefences для переключателя onOff, который имеет несколько вариантов использования - PullRequest
2 голосов
/ 15 мая 2019

У меня есть один переключатель OnOff, который при «включении» должен позволять пользователю получать уведомления на основе определенной строки, которую он выбрал.

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

Примечание, переключение переключателя также добавляет геозоны и запускает службы для опроса местоположения GPS (не важно, но я подумал, что это может помочь узнать)

Таким образом, процесс взаимодействия пользователей начинается вMainActivity, которая позволяет пользователю выбирать свою линию, нажимая кнопку типа «КРАСНАЯ ЛИНИЯ»

enter image description here

Затем добавляется статическая переменнаяк нажатой кнопке прослушивателя, называемого «Выбрать строку», и это глобальная строка, затем, после нажатия кнопки, открывается операция TimeTable, в которой и происходит вся магия.

глобальная переменная

public static String SelectedLine = "";

OnClicklistener для когда пользователь нажимает Pink Line

        mPink.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SelectedLine = "PINKLINE";
                Intent timeTableIntent = new Intent(MainActivity.this, TimeTable.class);
                startActivity(timeTableIntent);
                finish();
            }
        });

enter image description here Показывает расписание и переключатель, где пользователь может переключить его дляУведомления.

код восстановления для коммутатора

    private void service_enabled() {

        notificationSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                saveData();
                if(isChecked)
                { 
                 if (!checkPermissions()){
                        mPendingGeofenceTask = PendingGeofenceTask.ADD;
                        requestPermissions();
                        return;
                    }

                    Notifications();
                    addGeofences();

                    Intent i = new Intent(getApplicationContext(),GeoJobService.class);
                    startService(i);
                    Toast.makeText(TimeTable.this, "Notification Switch "+isChecked, Toast.LENGTH_SHORT).show();

                }
                if(!isChecked)
                {
                    Intent i = new Intent(getApplicationContext(),GeoJobService.class);
                    stopService(i);
                    if (!checkPermissions()) {
                        mPendingGeofenceTask = PendingGeofenceTask.REMOVE;
                        requestPermissions();
                        return;
                    }
                removeGeofences();
                notificationSwitch.setChecked(false);                
               }
            }
        });
    }

    private void saveData() {
        SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putBoolean(NotSwitch,notificationSwitch.isChecked());
        editor.apply();
//        Toast.makeText(this, "Saved Data", Toast.LENGTH_SHORT).show();
    }
    public void loadData()
    {
        SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS,MODE_PRIVATE);
        switchOnOff = sharedPreferences.getBoolean(NotSwitch,false);
//        Toast.makeText(this, "Loaded Data", Toast.LENGTH_SHORT).show();
    }
    public void updateView()
    {
        notificationSwitch.setChecked(switchOnOff);
    }

Я пробовал это, кажется, делать то, что я хочу, но поведение кажется странным, я думаю, из-за SharedPrefences дляЕсли он включен, он автоматически остается включенным, когда я включаю его (для всех маршрутов, которые я выбрал), но затем, когда я возобновляю или вызываю метод onCreate в каждом Actvity, метод checkNotifications вызывается для выключения соответствующего переключателя, но при этом кажется,ответ на мою проблему, это больше похоже на маску строк и ленту, чтобы исправить это

    void CheckNotifications()
    {
        String SelectedLine = MainActivity.SelectedLine;
        Toast.makeText(this, SelectedLineNotifications, Toast.LENGTH_SHORT).show();

        if(notificationSwitch.isChecked())
        {
            switch(SelectedLine)
            {
                case "REDLINE":
                    SelectedLineNotifications = "REDLINE";
                    break;
                case "BLUELINE":
                    SelectedLineNotifications = "BLUELINE";
                    break;
                case "YELLOWLINE":
                    SelectedLineNotifications = "YELLOWLINE";
                    break;
                case "GREENLINE":
                    SelectedLineNotifications = "GREENLINE";
                    break;
                case "PURPLEINE":
                    SelectedLineNotifications = "PURPLELINE";
                    break;
                case "ORANGELINE":
                    SelectedLineNotifications = "ORANGELINE";
                    break;
                case "PINKLINE":
                    SelectedLineNotifications = "PINKLINE";
                    break;
                case "GREYLINE":
                    SelectedLineNotifications = "GREYLINE";
                    break;

            }    
        }

        switch (SelectedLineNotifications)
        {
            case "REDLINE":
            case "BLUELINE":
            case "YELLOWLINE":
            case "GREENLINE":
            case "PURPLEINE":
            case "ORANGELINE":
            case "PINKLINE":
            case "GREYLINE":
                notificationSwitch.setChecked(true);
                saveData();
            break;
        }

    }

, поэтому все, что я хочу, это знать, как я могу обработать этот переключатель, чтобы он оставался включенным, если пользовательвключил переключатель в определенной строке, которую он / она выбрал, и остается выключенным в строках, выбранных пользователем, когда он включил переключатель

1 Ответ

0 голосов
/ 20 мая 2019

Мой совет - сделать несколько разных кнопок переключения для каждой строки.

Затем сохраните каждую из них в общих настройках в разных ключах, как это.

    private void saveData(String key , boolean value) {
        SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putBoolean(key,value);
        editor.apply();
    }
    public void loadData(String key)
    {
        SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS,MODE_PRIVATE);
        switchOnOff = sharedPreferences.getBoolean(key,false);
//        Toast.makeText(this, "Loaded Data", Toast.LENGTH_SHORT).show();
    }
    public void updateView(Switch selectedLineSwitch)
    {
        try{
            selectedLineSwitch.setChecked(switchOnOff);
        }catch (Exception e)
        {
            Log.e("Error", "did not update View");
        }

    }

называйте их какэто.

 if(SelectedLine == "REDLINE")
        {
            loadData("red");
            Log.d(TAG,"loaded Red Data");
            redNotificationSwitch= (Switch) findViewById(R.id.red_switch);
            redNotificationSwitch.setVisibility(View.VISIBLE);
            updateView(redNotificationSwitch);
            redNotificationSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    saveData("red",isChecked);
                    SelectedLineNotifications = "REDLINE";
                    notificationSwitchMethod(redNotificationSwitch);
                }
            });

        }
...