Question

J'ai un écran (activité) qui effectue les opérations suivantes: il a un bouton à bascule qui permet de basculer le mode avion; il le fait en utilisant un service qui fraient hors un nouveau fil. Il a également un bouton qui fait exactement la même chose exactement de la même façon. Il n'y a vraiment rien d'extraordinaire que les extraits de code ci-dessous montrent. Alors que tout fonctionne comme prévu pour le bouton à bascule (mode avion passe à « sur » si actuellement le téléphone est en mode avion, les changements à « off » si actuellement en mode avion), lorsque le bouton est cliqué, le mode avion permet de basculer en continu (mode avion de bascule « sur » à « off » et sur « oN » et « off » ...) comme si elle tombe dans une boucle. Après quelques recherches sur Internet, je doutais avait quelque chose à voir avec la façon dont l'intention / BroadcastReceiver de l'État téléphone / service a été tiré dans Android; que le bouton à bascule a deux états qui empêche efficacement l'intention d'être diffusé à nouveau. Est-ce correct?? Si oui, quelle serait la bonne façon de basculer le mode avion en utilisant un bouton (par rapport à une ou RadioButton togglebutton)?

/** Handler for the button. */
runToggleAirplaneModeServiceBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
    startService(new Intent(SleepScheduleController.this, AirplaneModeService.class));
}
});
/** Handler for the toggle button. */
airplaneModeToggleButton.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    startService(new Intent(SleepScheduleController.this, AirplaneModeService.class));
}
});
/** In the same screen as the toggle button and the button.
 * Need this to update the state of the toggle button once 
 * the toggling command is executed.
 */
intentFilter = new IntentFilter("android.intent.action.SERVICE_STATE");
receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        displayAirplaneMode();
    }};
registerReceiver(receiver, intentFilter);

private void displayAirplaneMode() {
    if(airplaneModeToggler.isInAirplaneMode()){
        airplaneModeToggleButton.setChecked(true);
        airplaneModeTextView.setText(R.string.airplane_mode_on);
    }else{
     airplaneModeToggleButton.setChecked(false);
     airplaneModeTextView.setText(R.string.airplane_mode_off);
    }
}

/** Code snippet in AirplaneModeService*/
@Override
public void onCreate() {
    airplaneModeToggler = new AirplaneModeToggler(this);
    Thread mThread = new Thread(null, airplaneModeToggleTask, "AirplaneModeToggleTask");
    mThread.start();
}

private Runnable airplaneModeToggleTask = new Runnable() {
    @Override
    public void run() {
        airplaneModeToggler.toggle(null);
        AirplaneModeService.this.stopSelf();
    }
};

/** Code snippet in the Utility class used by AirplaneModeService.*/
public Boolean toggleAirplaneMode(Boolean enabling) {
    boolean _enabling = enabling == null ? !isInAirplaneMode() : enabling.booleanValue();
Settings.System.putInt(mContext.getContentResolver(),
            Settings.System.AIRPLANE_MODE_ON, 
            _enabling ? AIRPLANE_MODE_ON : AIRPLANE_MODE_OFF);
    Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
    intent.putExtra("state", _enabling);
    mContext.sendBroadcast(intent);
    return _enabling;
}
Était-ce utile?

La solution

Je traqué le bug. Elle est causée par la OnCheckedChangeListener du togglebutton re-Executing la commande dans mon code. Dites si la commande basculement a déjà été appelé par programme, ou en cliquant sur l'autre bouton, puis ceux-ci provoquerait le changement d'état vérifié sur le togglebutton, qui exécute ensuite la même commande le basculement, ce qui se traduirait par une autre série de changement d'état vérifié sur ToggleButton.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top