Soru & Cevap

Android Togglebutton yönetimi nasıl gerçekleştirilir?

13.12.2013 - 03:44

Merhaba daha önce de buraya bu konu hakkında soru sormuştum ve yeniden sormak istedim. Altı saydan olusan ve her bir sayfada  birer tane toggle button olan bir uygulamada, bir togglebutton tıklanıp " on " konumuna alındıgında diğer togglebuttonlardan herhangi biri acıksa onu " off " konumuna alarak yönetiminin sağlanması ne şekilde gerçekleşir? Yani biri açıksa diğeri kapanacak, bunu nasıl yapabiliriz?

Teşekkür ederim

Saygılarımla

136 Görüntülenme

3 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

picture-9853-1415485106.jpg
coder86
16.12.2013 - 05:32

Selam Yasin;

App sınıfı üzerinden buttonun tıklatıgın andakı son hali kalıyor, yani o otomatik resetleme sıkıntısı gecti fakat, örnegin farklı bir sayfaya gecip oradaki buttona tıkladıgımda bir önceki sayfada tıkladıgım buttonda acık kalıyor. Benim istedigim ise buttonun biri on oldugunda digeri off olsun.

Kodları paylasıyorum,

Bu app sınıfı;

package com.denemeservis;

import android.app.Application;
import android.widget.Button;

public class AppClass1 extends Application {

    private boolean toggle1;
    private boolean toggle2;
    private boolean toggle3;
    private boolean toggle4;
    private boolean toggle5;

    public boolean isToggle1() {
        return toggle1;
    }
    public void setToggle1(boolean toggle1) {
        this.toggle1 = toggle1;
    }
    public boolean isToggle2() {
        return toggle2;
    }
    public void setToggle2(boolean toggle2) {
        this.toggle2 = toggle2;
    }
    
    public boolean isToggle3(){
        return toggle3;
    }
    
    public void setToggle3(boolean toggle3){
        this.toggle3 = toggle3;
    }
    
    public boolean isToggle4(){
        return toggle4;
    }
    
    public void setToggle4(boolean toggle4){
        this.toggle4 = toggle4;
    }
    
    public boolean isToggle5(){
        return toggle5;
    }
    
    public void setToggle5(boolean toggle5){
        this.toggle5 = toggle5;
    }
    
}

Bu buttonun çalıştıgı sınıf;

package com.denemeservis;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.net.sip.SipSession.State;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.Toast;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.ToggleButton;

public class YurtFm extends Activity{

    private ToggleButton toggle;
    private AppClass1 app;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.yurt_fm_sayfasi);
        
        app = (AppClass1)getApplicationContext();
        
        toggle = (ToggleButton) findViewById(R.id.toggle1);
        
        toggle.setChecked(app.isToggle1());
        
        toggle.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                app.setToggle1(isChecked);    
                
                if(isChecked){
                    if (DinlemeServisi.class != null) {
                        stopService(new Intent(getApplicationContext(), DinlemeServisi.class));
                    }
                    if (DinlemeServisiRisaleFM.class != null) {
                        stopService(new Intent(getApplicationContext(), DinlemeServisiRisaleFM.class));
                    }
                    if (DinlemeServisiRahmetFM.class != null) {
                        stopService(new Intent(getApplicationContext(), DinlemeServisiRahmetFM.class));
                    }
                    if (DinlemeServisiIrsadFM.class != null) {
                        stopService(new Intent(getApplicationContext(), DinlemeServisiIrsadFM.class));
                    }
                    if (DinlemeServisiHikmetFM.class != null) {
                        stopService(new Intent(getApplicationContext(), DinlemeServisiHikmetFM.class));
                    }
                    if (DinlemeServisiYurtFM.class != null) {
                        startService(new Intent(getApplicationContext(), DinlemeServisiYurtFM.class));
                    }
                }else {
                    // Log.d("Yurt Fm Stop", "Yurt Fm Stop");
                    stopService(new Intent(getApplicationContext(), DinlemeServisiYurtFM.class));
                    // buttonyurtfm.setBackgroundResource(R.drawable.playbutton300x300);
                    }
            }
        });
        
    }

}

 

Buttonun bulundugu sayfanın Xml'i;

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="24dp"
        android:text="YURT FM SAYFASI" />

    <ToggleButton
        android:id="@+id/toggle1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="39dp" />

</RelativeLayout>

Buttonların id leride toggle1, toggle2, toggle3, toggle4, toggle5 şeklinde diğer 4 sınıfımın içerigi de YurtFm sınıfı içeriği gibi. Birde AanasayfaActivity adında bir sınıfım var onun kodlarını da gönderiyorum. AnasayfaActivity sınıfı icinde app sınıfı ile ilgili birsey yok o zaten on olarak acık kalıyordu ama tabi onunda kontrolunun yapılması gerek.

AnasayfaActivity sınıfı

package com.denemeservis;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.Toast;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ToggleButton;

public class AnasayfaActivity extends Activity implements
        OnCheckedChangeListener, OnSeekBarChangeListener {

    private static final String Sinif = "AnaSayfaActivity";
    private Button digerRadyo;
    private Button mesajGonder;
    private Button kamera;
    private MediaPlayer player;
    private ToggleButton playStop;
    private AudioManager manager;
    private SeekBar ses;
    int volume = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.anasayfa2);
        //this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        
        Log.d("onCreate", "onCreate");
        baslasinUI();
        if (!networkKontrol()) {
            baglantiMesaji();
        }

        manager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        int maxVolume = manager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        int curVolume = manager.getStreamVolume(AudioManager.STREAM_MUSIC);

        ses.setMax(maxVolume);
        ses.setProgress(curVolume);

        digerRadyo = (Button) findViewById(R.id.btndigerRadyo);
        digerRadyo.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent radyo = new Intent("android.intent.action.DigerRadyo");
                startActivity(radyo);
            }
        });

        mesajGonder = (Button) findViewById(R.id.btnmesajGonder);
        mesajGonder.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent radyo = new Intent("android.intent.action.Mesaj");
                startActivity(radyo);

            }
        });

        kamera = (Button) findViewById(R.id.btnKamera);
        kamera.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent radyo = new Intent("android.intent.action.Kamera");
                startActivity(radyo);
            }
        });
    }

    private void baslasinUI() {
        Log.d("UI", "UI");

        playStop = (ToggleButton) findViewById(R.id.tglbtnPlayStop);
        playStop.setOnCheckedChangeListener(this);

        ses = (SeekBar) findViewById(R.id.skbrSes);
        ses.setOnSeekBarChangeListener(this);
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        //try {

        if (isChecked) {
            Log.d("play", "play");
                startService(new Intent(this, DinlemeServisi.class));
                Toast.makeText(getApplicationContext(), "Açılıyor, Lütfen Bekleyiniz!", Toast.LENGTH_LONG).show();
                

        } else {
            Log.d("stop", "stop");
            stopService(new Intent(this, DinlemeServisi.class));
            
        }
        
        try {
            if(DinlemeServisiRahmetFM.class !=null){
                stopService(new Intent(this,DinlemeServisiRahmetFM.class));
            }if(DinlemeServisiYurtFM.class !=null){
                stopService(new Intent(this,DinlemeServisiYurtFM.class));
            }if(DinlemeServisiRisaleFM.class !=null){
                stopService(new Intent(this,DinlemeServisiRisaleFM.class));
            }if(DinlemeServisiIrsadFM.class !=null){
                stopService(new Intent(this,DinlemeServisiIrsadFM.class));
            }if(DinlemeServisiHikmetFM.class !=null){
                stopService(new Intent(this,DinlemeServisiHikmetFM.class));
            }else if(DinlemeServisi.class !=null){
                startService(new Intent(this,DinlemeServisi.class));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        
        
        
        
        /*} catch (Exception e) {
            e.printStackTrace();
        }*/
    }

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress,
            boolean fromUser) {
        manager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);
        volume = progress;
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        Toast.makeText(getApplicationContext(),
                "Ses : " + Integer.toString(volume), Toast.LENGTH_SHORT)
                .show();
    }

    public boolean networkKontrol() {
        try {

        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = cm.getActiveNetworkInfo();

        if (networkInfo != null && networkInfo.isConnectedOrConnecting()) {
            return true;
        }
        
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    protected void baglantiMesaji() {
        try {

        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        builder.setMessage("İnternet Bağlantınıza Ulaşamadık!" + "\n" +"Lütfen Bağlantınızı Kontrol Ediniz!")
                .setPositiveButton("Tamam",
                        new DialogInterface.OnClickListener() {

                            @Override
                            public void onClick(DialogInterface dialog,
                                    int which) {
                               
                                System.exit(0);
                                
                            }
                        });

        final AlertDialog alert = builder.create();
        alert.show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        
        if(keyCode==KeyEvent.KEYCODE_BACK){
            AlertDialog.Builder backbuilder = new AlertDialog.Builder(this);
            
            backbuilder.setMessage("Uygulamadan Çıkmak Üzeresiniz!").setTitle("ÇIKIŞ").setCancelable(false)
            .setPositiveButton("Evet", new DialogInterface.OnClickListener() {
                
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    AnasayfaActivity.this.finish();
                    moveTaskToBack(false);
                    
                    try {
                        if(DinlemeServisiRahmetFM.class !=null){
                            stopService(new Intent(getApplicationContext(),DinlemeServisiRahmetFM.class));
                        }if(DinlemeServisiYurtFM.class !=null){
                            stopService(new Intent(getApplicationContext(),DinlemeServisiYurtFM.class));
                        }if(DinlemeServisiRisaleFM.class !=null){
                            stopService(new Intent(getApplicationContext(),DinlemeServisiRisaleFM.class));
                        }if(DinlemeServisiIrsadFM.class !=null){
                            stopService(new Intent(getApplicationContext(),DinlemeServisiIrsadFM.class));
                        }if(DinlemeServisiHikmetFM.class !=null){
                            stopService(new Intent(getApplicationContext(),DinlemeServisiHikmetFM.class));
                        }else if(DinlemeServisi.class !=null){
                            stopService(new Intent(getApplicationContext(),DinlemeServisi.class));
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    
                }
            })
            .setNegativeButton("Hayır", new DialogInterface.OnClickListener() {
                
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                    
                }
            });
            AlertDialog alertDialog = backbuilder.create();
            alertDialog.show();
        }
        
        return super.onKeyDown(keyCode, event);
    }
    
    
}

Fragment kullanılmadı sadece activity. Yardımların için çok teşekkür ederim.

Profile picture for user yasinkafadar
yasinkafadar
14.12.2013 - 12:22

Selam Nurettin,

Bir önceki sorunda bunu Application sınıfı üzerinden yapmaya çalışyordun, böyle yaptığın zaman istediğin şekilde çalışmadı mı nasıl bir sorun ile karşılaştın?

- Application sınıfı üzerinde eğer toggle butonlarının id'si bir birinden farklıysa aktif buton id bilgisini tutabilirsin

- Id'ler farklı değilse o sayfana ait unique bir değer tanımlayıp onu application üzerinde tutabilirsin.

- Uygulaman kapatılıp açıldığı zaman tekrar aktif olan devam etsin diyorsan SharedPreferences'da tutabilirsin.

Yani aslında koşullara göre bir çok farklı yöntem deneyebilirsin.

Yapmak istediğini bize kod üzerinden veya daha açık bir şekilde sorabilirsen daha hızlı yardımcı olabiliriz.

Örneğin sayfalarının hepsi activity mi yoksa bir activity içinde açılan fragment'mi bu detay da bilgi paylaşabilirsen güzel olur.

Kolay gelsin.

Profile picture for user vlkn
vlkn
13.12.2013 - 07:15

Merhaba öncelikle toogle butonda ki normal şeklimize göre nasıl olduğunu kavradıysan bunu da kavrayacağından eminim 

 

     final ToggleButton toggle = (ToggleButton) findViewById(R.id.toggleButton1);
            
            toggle.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
                    if(toggle.isChecked()){
                       ses.start();
                    }
                    else
                    ses.pause();
                                    
                }
            });

 

Burada sen toogle birisi için aç kapa yaptın diğer sayfalar içinse sanırım if ile yapabilirsin eğer bir toogle açıksa diğeri on olduğunda diğeri off olsun