کار با Switch Button در اندروید

آموزش کار با دکمه switch در برنامه نویسی اندروید

در این جلسه از سری مباحث آموزش برنامه نویسی اندروید به نحوه کار با دکمه سوئیچ یا Switch Button در اندروید می‌پردازیم. از این دکمه عموما برای فعال/غیرفعال کردن یک قابلیت در برنامه‌ها استفاده می‌شود.

Switch Button چیست؟

به نام خدا. اگر تابحال نام این دکمه را نشنیده‌اید، مطمئنا به مراتب و در برنامه‌های مختلفی از آن استفاده کرده‌اید. عمده کاربرد دکمه Switch در فعال (ON) و غیرفعال (OFF) کردن امکانات و قابلیت‌های موجود در اپلیکیشن‌هاست. اگر سری به بخش تنظیمات یک برنامه مانند شبکه اجتماعی اینستاگرام بزنید، تعداد زیادی Switch Button را مشاهده خواهید کرد.

نمونه کاربرد Switch Button در اپلیکیشن اندرویدی اینستاگرام

از دیگر کاربردهای این ویجت/اِلِمان می‌توان به فعال و غیر فعال کردن تم تیره (Dark theme) در برخی برنامه‌ها اشاره کرد. این ویجت در Android 4 یعنی API 14 معرفی شده بنابراین با تمامی دستگاه‌های اندرویدی موجود در بازار سازگاری کامل دارد. بیشتر از این نیاز به توضیح پیرامون کاربرد این دکمه نیست بنابراین به اصل مطلب می‌پردازم.

ساخت پروژه Switch Button در اندروید استودیو

ابتدا طبق مبحث آموزش ساخت پروژه در اندروید استودیو یک پروژه اندرویدی با نام Switch می‌سازم. اکتیویتی را از نوع Empty Activity و زبان را Java انتخاب کردم.
در قدم نخست و در layout اکتیویتی یک Switch و یک TextView اضافه می‌کنم. Switch هم مانند سایر ویجت‌ها هم به صورت دستی در حالت Text و هم از طریق پالت اندروید استودیو و به شیوه drag & drop به لایه اضافه می‌شود:

اضافه کردن Switch Button در اکتیویتی از طریق پالت اندروید استودیو

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">

    <Switch
        android:id="@+id/switch_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Switch" />

    <TextView
        android:id="@+id/txt_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
    
</LinearLayout>

در ادامه و پس از تعریف این دو ویجت در کلاس اکتیویتی، متد شنونده (Listener) برای دکمه Switch را می‌سازم:

MainActivity.java

package ir.android_studio.aswitch;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.CompoundButton;
import android.widget.Switch;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private Switch mSwitch;
    private TextView txtView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mSwitch = findViewById(R.id.switch_btn);
        txtView = findViewById(R.id.txt_view);

        mSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {

            }
        });

    }
}

برخلاف دکمه‌های معمولی که متد شنونده آن setOnClickListener() هست، برای Switch Button ها از setOnCheckedChangeListener() استفاده می‌شود. درون این متد یک متد با نام onCheckedChanged() توسط اندروید استودیو اضافه شد که دستورات مدنظر ما درون این متد تعریف می‌شود. پارامتر دوم این متد از جنس boolean و با نام b نامگذاری شده که تغییر وضعیت دکمه را اعلام می‌کند. یک شرط به صورت زیر تعریف می‌کنم:

@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {

    if (b) {

        txtView.setText("فعال");

    } else {

        txtView.setText("غیر فعال");

    }

}

شرط فوق بررسی می‌کند چنانچه b مقدار true برگرداند یعنی دکمه در وضعیت فعال یا ON قرار گرفته باشد، قسمت اول شرط و در غیر اینصورت قسمت دوم شرط اجرا شود. پروژه را اجرا می‌کنم:

پروژه دکمه سوئیچ در برنامه نویسی اندروید

در حالت پیش فرض، دکمه در وضعیت خاموش قرار دارد. روی سوئیچ کلیک می‌کنم تا در وضعیت روشن قرار گیرد:

دکمه switch در وضعیت روشن (ON)

با قرار گرفتن وضعیت دکمه به حالت فعال یا روشن، قسمت نخست شرط اجرا و عبارت “فعال” روی TextView اعمال شد. مجددا با تغییر وضعیت دکمه به حالت غیر فعال یا خاموش، انتظار می‌رود عبارت “غیر فعال” نمایش داده شود؛ یعنی قسمت دوم شرط اجرا شود:

دکمه switch در وضعیت روشن (OFF)

در مواردی ممکن است بخواهیم خارج از متد listener دکمه سوئیچ، وضعیت خاموش یا روشن بودن آن را بررسی کنیم. در این حالت از متد isChecked() استفاده می‌کنیم. برای تمرین، یک Button به اکتیویتی اضافه می‌کنم:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">

    <Switch
        android:id="@+id/switch_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Switch"
        android:checked="true"/>

    <TextView
        android:id="@+id/txt_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="وضعیت دکمه سوئیچ" />

</LinearLayout>

سپس در متد شنونده این دکمه یک شرط تعریف می‌کنم:

mButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        if (mSwitch.isChecked()) {
            Toast.makeText(MainActivity.this, "On", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(MainActivity.this, "Off", Toast.LENGTH_SHORT).show();
        }

    }
});

در صورتی که mSwitch.isChecked() مقدار true برگرداند (یعنی Switch Button در حالت فعال قرار گرفته) قسمت اول و در غیر اینصورت قسمت دوم شرط اجرا خواهد شد.
کد کامل اکتیویتی:

MainActivity.java

package ir.android_studio.aswitch;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private Switch mSwitch;
    private TextView txtView;
    private Button mButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mSwitch = findViewById(R.id.switch_btn);
        txtView = findViewById(R.id.txt_view);
        mButton = findViewById(R.id.button);

        mSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {

                if (b) {

                    txtView.setText("فعال");

                } else {

                    txtView.setText("غیر فعال");

                }

            }
        });

        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (mSwitch.isChecked()) {
                    Toast.makeText(MainActivity.this, "On", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(MainActivity.this, "Off", Toast.LENGTH_SHORT).show();
                }

            }
        });

    }
}

مجدد پروژه را اجرا می‌کنم:

دریافت وضعیت روشن بودن دکمه Switch با متد isChecked()

دریافت وضعیت خاموش بودن دکمه Switch با متد isChecked()

با استفاده از isChecked() هر زمان که لازم باشد می‌توانیم وضعیت دکمه سوئیچ را بررسی کنیم. برای آشنایی با نحوه استایل دهی ویجت‌ها به سبک متریال دیزاین آموزش استایل و تم متریال در اندروید را مطالعه نمائید.
موفق و پیروز باشید.

مطالعه‌ی بیشتر:

https://developer.android.com/reference/android/widget/Switch

توجه : سورس پروژه درون پوشه Exercises قرار دارد

دانلود نسخه PDF این آموزش به همراه سورس پروژه
تعداد صفحات : ۱۰
حجم : ۱ مگابایت
قیمت : رایگان
دانلود رایگان با حجم ۱ مگابایت لینک کمکی
این مطلب چقدر برایتان مفید بود؟ لطفا امتیاز دهید
4.8/5 - (6 امتیاز)
پرسش‌ها و دیدگاه‌های کاربران
دوره آموزش برنامه نویسی اندروید
دوره آموزش برنامه نویسی اندروید

با دریافت این دوره به تمامی آموزش‌های غیر رایگان و رایگان موجود در وب سایت دسترسی دارید که تخفیفی برای آموزش‌های غیر رایگان نیز درنظر گرفته شده. این پکیج به دو صورت دانلودی و ارسال پستی ارائه می‌گردد.
آموزش‌های اندروید استودیو در دو دسته «پایه» و «تکمیلی» منتشر می‌شوند.
آموزش‌های پایه شامل مباحث اصلی و ضروری و آموزش‌های تکمیلی مطالبی است که می‌بایست در کنار مطالب اصلی بررسی شود.
با خرید این دوره، به تمامی آموزش‌های غیر رایگانی که در آینده منتشر می‌شود نیز به صورت رایگان دسترسی خواهید داشت!

یک دیدگاه بنویسید

پرسش‌های زیر تایید و پاسخ داده نـــخواهند شد:
۱: جزء موارد مطرح شده در صفحات مشکلات و پرسش‌های رایج و بروزرسانی‌های محتوای آموزشی باشد
۲: سوال قبلا توسط کاربران در دیدگاه‌ها مطرح و پاسخ داده شده باشد
۳: پرسش خارج از مبحث آموزشی موجود در این صفحه باشد

  • marjan گفت:

    سلام روزتون بخیر… من ی سوال داشتم: چه دستوری باید بنویسیم تا حالت سوئیچ بعد از بسته شدن برنامه ذخیره بشه؟
    من ی کد نوشتم ک صفحه گوشی روشن بمونه اما وقتی از اکتیویتی سوئیچ بیرون میام وضعیتش به حالت پیش فرض برمیگرده و تغییرات کاربر ذخیره نمیشه… ممنون میششم راهنماییم کنید.
    اینم کد من:
    SharedPreferences p = getSharedPreferences(PREFS_NAME,MODE_PRIVATE);
    boolean useMainTheme = p.getBoolean(PREFS_MAIN_THEME , false);
    if (useMainTheme)
    setTheme(R.style.AppThemeMain);
    کد بالا قبل از فراخوانی لایه نوشته شده و کد زیر بعد از فراخوانی لایه تنظیمات
    @SuppressLint(“UseSwitchCompatOrMaterialCode”)
    final Switch mswitch = findViewById(R.id.switch1);
    mswitch.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    mswitch.isChecked();
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    }
    });

  • باران گفت:

    سلام استاد
    یک اموزش پروژه محور هم بذارید. بد نیست با استفاده از این اموزش ها تا الان یک پروژه کوچک هم به کمک شما انجام بدیم

    • سیدمهدی مطهری گفت:

      تو برنامه هستش. فقط دارم وقت بیشتری میذارم تا آموزشای موضوعی رو به یه حدی برسونم که تقریبا کامل باشه ضروریاتش. بعد ان شا الله میرم سراغ آموزشای پروژه محور که ویدئویی هم خواهد بود