android.widget.Switch - চালু / বন্ধ ইভেন্ট শ্রোতা?


229

আমি একটি সুইচ বোতাম, android.widget.Switch (API v.14 থেকে উপলব্ধ) প্রয়োগ করতে চাই।

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

তবে আমি নিশ্চিত না কীভাবে বোতামটির জন্য ইভেন্ট শ্রোতা যুক্ত করবেন। এটি কি "অনক্লিক" শ্রোতা হওয়া উচিত? এবং এটি কীভাবে "চালু" আছে তা আমি কীভাবে জানব?


6
এক্সএমএলের মাধ্যমে অনক্লিক আসলে কাজ করে - তবে কেবলমাত্র বোতামের "ক্লিক" জন্য, "স্লাইড" এর জন্য নয়।
m02ph3u5

উত্তর:


492

উত্তরাধিকারের CompoundButtonবৈশিষ্ট্যগুলিতে স্যুইচ করুন , সুতরাং আমি অন - চেকড চ্যাঞ্জলিস্টনারকে সুপারিশ করব

mySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        // do something, the isChecked will be
        // true if the switch is in the On position
    }
});

2
@ জোহান কোন ঝামেলা নেই আমি আপনার সম্পর্কে জানি না কিন্তু আমি মনে করি তারা এটা OnCheckChangedListener নামে, OnItemSelectedListener অনুরূপ, যেহেতু অন ইচ্ছুক বিশেষ্য - ক্রিয়া -Listener একটি প্রতিষ্ঠিত নামকরণ convetion হয়।
স্যাম

2
তবে আপনি উদাহরণস্বরূপ কোনও খণ্ডটি স্থাপন করার সময়, আপনি যখন স্যুইচ অনটি সেট করেন আপনি যখনই খণ্ডটি পুনরায় ঘুরে দেখেন তখন সেই জিনিসটি সর্বদা আগুন ধরে যায়।
ক্লাচ

1
@ সাম আমি যদি পদ্ধতি সেটচেকড () পদ্ধতিটি ব্যবহার করে অন বা অফ স্টেটে স্যুইচটি পরিবর্তন করতে চাই এবং অন-চেকড চেঞ্জড পদ্ধতিটি সম্পাদন করতে না চাই তবে কী হবে? কিন্তু ব্যবহারকারী যখন আবার স্যুইচ পদ্ধতিতে ট্যাপ করেন তখন চেকড চ্যাঞ্জড কার্যকর হয়ে যায় ... এটি করার কোনও উপায় আছে কি?
কুমার

2
বাটন আছে OnCLick, সুইচ নেই OnChange! গুগল দলটির নকশা ঠিকঠাক!
ভ্যাসিলিস

1
@ কেজেওনে আমি এখানে যা করেছি তা ক্লিক করে শ্রোতাদের রাষ্ট্র পরিবর্তন করতে ব্যবহার করা হয় এবং পদ্ধতিটি (আমার ক্ষেত্রে এপিআই কল) এ স্যুইচটি পাস করে এবং তারপরে রাজ্যটি পরিবর্তন করতে সেটচেকড () পদ্ধতিটি ব্যবহার করে (যেমন এপিআই কলটিতে অনর্থক / অনুলিপি)) । আশা করি এইটি কাজ করবে.
কুমার

53

এক্সএমএলের মাধ্যমে আপনার বিন্যাসে একটি স্যুইচ যোগ করতে নিম্নলিখিত স্নিপেটটি ব্যবহার করুন:

<Switch
     android:id="@+id/on_off_switch"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:textOff="OFF"
     android:textOn="ON"/>

তারপরে আপনার ক্রিয়াকলাপের অনক্রিট পদ্ধতিতে আপনার স্যুইচের একটি রেফারেন্স পান এবং এটির অন-চেকড চেঞ্জলিস্টনার সেট করুন:

Switch onOffSwitch = (Switch)  findViewById(R.id.on_off_switch); 
onOffSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    Log.v("Switch State=", ""+isChecked);
}       

});

3
এটি মিলিয়ে যাওয়ার জন্য আপনাকে লেআউট এবং কোড দেয় এর আরও পরিষ্কার উত্তর।
অ্যাশেজটোস অ্যাশেজ

একক শ্রোতার একাধিক সুইচকম্যাট পরিচালনা করবেন কীভাবে? দয়া করে এর জন্য উত্তরটি পরামর্শ দিন
আনন্দ সাবজানি

22

কোটলিন ব্যবহারকারীদের জন্য, আপনি mySwitchনিম্নরূপে একটি স্যুইচ (আইডি থাকা এই ক্ষেত্রে ) জন্য শ্রোতা সেট করতে পারেন :

    mySwitch.setOnCheckedChangeListener { _, isChecked ->
         // do whatever you need to do when the switch is toggled here
    }

isChecked সত্য যদি স্যুইচটি বর্তমানে (চালু) পরীক্ষা করা হয় এবং অন্যথায় মিথ্যা।


19

আপনার এক্সএমএল লেআউটটি সংজ্ঞায়িত করুন:

<RelativeLayout 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"
    tools:context="com.neoecosystem.samplex.SwitchActivity">

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

</RelativeLayout> 

তারপরে একটি ক্রিয়াকলাপ তৈরি করুন

public class SwitchActivity extends ActionBarActivity implements CompoundButton.OnCheckedChangeListener {

    Switch mySwitch = null;


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


        mySwitch = (Switch) findViewById(R.id.myswitch);
        mySwitch.setOnCheckedChangeListener(this);
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            // do something when check is selected
        } else {
            //do something when unchecked
        }
    }

    ****
}

======== নীচে এআইপি 14 এর জন্য সুইচকম্প্যাট ========= ব্যবহার করুন

এক্সএমএল

<RelativeLayout 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"
    tools:context="com.neoecosystem.samplex.SwitchActivity">

    <android.support.v7.widget.SwitchCompat
        android:id="@+id/myswitch"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content" />

</RelativeLayout>

কার্যকলাপ

public class SwitchActivity extends ActionBarActivity implements CompoundButton.OnCheckedChangeListener {

    SwitchCompat mySwitch = null;


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


        mySwitch = (SwitchCompat) findViewById(R.id.myswitch);
        mySwitch.setOnCheckedChangeListener(this);
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            // do something when checked is selected
        } else {
            //do something when unchecked
        }
    }
   *****
}

2
বোতাম ভিউ.ইস.প্রেসড ()
জ্যাকসনএফএফ 1

5

স্যুইচ উইজেটের জন্য বিন্যাসটি এরকম।

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <Switch
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="20dp"
        android:gravity="right"
        android:text="All"
        android:textStyle="bold"
        android:textColor="@color/black"
        android:textSize="20dp"
        android:id="@+id/list_toggle" />
</LinearLayout>

ক্রিয়াকলাপ শ্রেণিতে, আপনি দুটি উপায়ে কোড করতে পারেন। আপনি কোড করতে পারেন তার উপর নির্ভর করে।

প্রথম উপায়

public class ActivityClass extends Activity implements CompoundButton.OnCheckedChangeListener {
Switch list_toggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.return_vehicle);

    list_toggle=(Switch)findViewById(R.id.list_toggle);
    list_toggle.setOnCheckedChangeListener(this);
    }
}

public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
    if(isChecked) {
        list_toggle.setText("Only Today's");  //To change the text near to switch
        Log.d("You are :", "Checked");
    }
    else {
        list_toggle.setText("All List");   //To change the text near to switch
        Log.d("You are :", " Not Checked");
    }
}

দ্বিতীয় উপায়

public class ActivityClass extends Activity {
Switch list_toggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.return_vehicle);

    list_toggle=(Switch)findViewById(R.id.list_toggle);
    list_toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
       @Override
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
          if(isChecked) {
             list_toggle.setText("Only Today's");  //To change the text near to switch
             Log.d("You are :", "Checked");
          }
          else {
             list_toggle.setText("All List");  //To change the text near to switch
             Log.d("You are :", " Not Checked");
          }
       }       
     });
   }
}

2

আপনি স্যুইচ চেকড চেঞ্জ ইভেন্টের জন্য ডেটাবাইন্ডিং এবং ভিউমোডেল ব্যবহার করতে পারেন

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <variable
                name="viewModel"
                type="com.example.ui.ViewModel" />
    </data>
    <Switch
            android:id="@+id/on_off_switch"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onCheckedChanged="@{(button, on) -> viewModel.onCheckedChange(on)}"
     />


1
android.widget.Switch এ onCheckedChanged attirbute নেই। আপনি ত্রুটি পাবেন : এএপটি: ত্রুটি: অ্যাট্রিবিউট অ্যান্ড্রয়েড: onCheckedChanged পাওয়া যায় নি।
বিক্রি হয়েছে

1

দুটি উপায় আছে,

  1. এক্সএমএল অনক্লিক ভিউ ব্যবহার করে নীচে হিসাবে এক্সএমএল এ সুইচ ইন করুন:

    <Switch
    android:id="@+id/switch1"
    android:onClick="toggle"/>

আপনারঅ্যাক্টিভিটি ক্লাসে (যেমন মেইনএকটিভিটি.জভা জন্য)

    Switch toggle; //outside oncreate
    toggle =(Switch) findViewById(R.id.switch1); // inside oncreate

    public void toggle(View view) //outside oncreate
    {
        if( toggle.isChecked() ){
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                start.setBackgroundColor(getColor(R.color.gold));
                stop.setBackgroundColor(getColor(R.color.white));
            }
        }
        else
        {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                stop.setBackgroundColor(getColor(R.color.gold));
                start.setBackgroundColor(getColor(R.color.white));
            }
        }
    }
  1. ক্লিক শ্রোতার উপর ব্যবহার করে

এক্সএমএলকে নীচে হিসাবে যুক্ত করুন:

আপনারঅ্যাক্টিভিটি ক্লাসে (যেমন মেইনএকটিভিটি.জভা জন্য)

    Switch toggle; // outside oncreate
    toggle =(Switch) findViewById(R.id.switch1);  // inside oncreate


    toggle.setOnClickListener(new View.OnClickListener() {   // inside oncreate
        @Override
        public void onClick(View view) {

            if( toggle.isChecked() ){
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    start.setBackgroundColor(getColor(R.color.gold));
                }
            }
            else
            {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    stop.setBackgroundColor(getColor(R.color.gold));
                }
            }

        }

    });

0

আমার সমাধান, একটি SwitchCompatএবং কোটলিন ব্যবহার করে । আমার পরিস্থিতিতে, যদি ইউআই এর মাধ্যমে ব্যবহারকারী ট্রিগার করে তবেই আমার পরিবর্তনের বিষয়ে প্রতিক্রিয়া জানানো দরকার। আসলে, একটি আমার সুইচ ক্ষীণভাবে প্রতিক্রিয়া LiveData, এবং এই উভয় প্রণীত setOnClickListenerএবং setOnCheckedChangeListenerঅব্যবহারযোগ্য। setOnClickListenerপ্রকৃতপক্ষে ব্যবহারকারীর মিথস্ক্রিয়ায় সঠিকভাবে প্রতিক্রিয়া জানায়, তবে যদি ব্যবহারকারীটি স্যুইচ জুড়ে থাম্বটি টানেন তবে এটি ট্রিগার হয় না। setOnCheckedChangeListenerঅন্য প্রান্তেও ট্রিগার করা হয় যদি স্যুইচটি প্রোগ্রামালিকভাবে টগল করা হয় (উদাহরণস্বরূপ কোনও পর্যবেক্ষকের দ্বারা)। এখন আমার ক্ষেত্রে স্যুইচটি দুটি টুকরোতে উপস্থিত ছিল এবং তাই রিস্টোরইনস্ট্যান্সস্টেটটি কিছু ক্ষেত্রে পুরানো মান সহ সঠিক মানকে ওভাররাইট করে ট্রিগার করবে।

সুতরাং, আমি স্যুইচকম্প্যাট কোডটি দেখেছিলাম এবং ক্লিক এবং টেনে আলাদা করতে এটি সাফল্যের সাথে তার আচরণের নকল করতে সক্ষম হয়েছি এবং এটি ব্যবহার করে একটি কাস্টম টাচলিস্টিনার তৈরি করতে সক্ষম হয়েছিল যা এটি হওয়া উচিত। এখানে আমরা যাচ্ছি:

/**
 * This function calls the lambda function passed with the right value of isChecked
 * when the switch is tapped with single click isChecked is relative to the current position so we pass !isChecked
 * when the switch is dragged instead, the position of the thumb centre where the user leaves the
 * thumb is compared to the middle of the switch, and we assume that left means false, right means true
 * (there is no rtl or vertical switch management)
 * The behaviour is extrapolated from the SwitchCompat source code
 */
class SwitchCompatTouchListener(private val v: SwitchCompat, private val lambda: (Boolean)->Unit) :  View.OnTouchListener {
    companion object {
        private const val TOUCH_MODE_IDLE = 0
        private const val TOUCH_MODE_DOWN = 1
        private const val TOUCH_MODE_DRAGGING = 2
    }

    private val vc = ViewConfiguration.get(v.context)
    private val mScaledTouchSlop = vc.scaledTouchSlop
    private var mTouchMode = 0
    private var mTouchX = 0f
    private var mTouchY = 0f

    /**
     * @return true if (x, y) is within the target area of the switch thumb
     * x,y and rect are in view coordinates, 0,0 is top left of the view
     */
    private fun hitThumb(x: Float, y: Float): Boolean {
        val rect = v.thumbDrawable.bounds
        return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom
    }

    override fun onTouch(view: View, event: MotionEvent): Boolean {
        if (view == v) {
            when (MotionEventCompat.getActionMasked(event)) {
                MotionEvent.ACTION_DOWN -> {
                    val x = event.x
                    val y = event.y
                    if (v.isEnabled && hitThumb(x, y)) {
                        mTouchMode = TOUCH_MODE_DOWN;
                        mTouchX = x;
                        mTouchY = y;
                    }
                }
                MotionEvent.ACTION_MOVE -> {
                    val x = event.x
                    val y = event.y
                    if (mTouchMode == TOUCH_MODE_DOWN &&
                        (abs(x - mTouchX) > mScaledTouchSlop || abs(y - mTouchY) > mScaledTouchSlop)
                    )
                        mTouchMode = TOUCH_MODE_DRAGGING;
                }
                MotionEvent.ACTION_UP,
                MotionEvent.ACTION_CANCEL -> {
                    if (mTouchMode == TOUCH_MODE_DRAGGING) {
                        val r = v.thumbDrawable.bounds
                        if (r.left + r.right < v.width) lambda(false)
                        else lambda(true)
                    } else lambda(!v.isChecked)
                    mTouchMode = TOUCH_MODE_IDLE;
                }
            }
        }
        return v.onTouchEvent(event)
    }
}

এটি কিভাবে ব্যবহার করতে:

প্রকৃত স্পর্শ শ্রোতা যা কার্যকর করতে কোড সহ একটি ল্যাম্বডাকে গ্রহণ করে:

myswitch.setOnTouchListener(
    SwitchCompatTouchListener(myswitch) {
        // here goes all the code for your callback, in my case
        // i called a service which, when successful, in turn would 
        // update my liveData 
        viewModel.sendCommandToMyService(it) 
    }
)

সম্পূর্ণতার স্বার্থে, রাষ্ট্রের জন্য পর্যবেক্ষক switchstate(যেমন আপনার কাছে থাকে) এমনভাবে দেখছিলেন:

switchstate.observe(this, Observer {
    myswitch.isChecked = it
})

অ্যান্ড্রয়েড দলের সত্যই এটি ঠিক করা উচিত ... আমি যা ইনস্টাস্ট করেছি তা আমার লাইভ ডেটা পর্যবেক্ষকের মধ্যে রয়েছে, আমি অন-চেকটি নিবন্ধভুক্ত করি, আমার ক্রিয়াটি করি, তারপরে এটি আবার সেট করে ফেলি। এটি কেবলমাত্র কাজ করে কারণ ইউআই পরিবর্তনগুলি 1 থ্রেডে (মূল থ্রেড) ঘটে।
জেরেমি জাও

0

কোটলিনে:

        switch_button.setOnCheckedChangeListener { buttonView, isChecked ->
        if (isChecked) {
            // The switch enabled
            text_view.text = "Switch on"

        } else {
            // The switch disabled
            text_view.text = "Switch off"

        }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.