একটি নির্বাচিত রাষ্ট্রের সাথে অ্যান্ড্রয়েড ইমেজবটন?


87

আমি যদি তার চিত্রের পটভূমির জন্য কোনও নির্বাচক সহ কোনও চিত্রবিতনটি ব্যবহার করতাম, এমন কোনও অবস্থা কি আমি পরিবর্তন করতে পারি যা এটির উপস্থিতি পরিবর্তন করবে? এখনই আমি এটি টিপলে চিত্রগুলি পরিবর্তন করতে পারি, তবে সেখানে কোনও "হাইলাইটেড" বা "নির্বাচিত" বা অনুরূপ রাজ্য নেই যা আমাকে নিজের ইচ্ছায় এটির উপস্থিতি টগল করতে দেয়।

এখানে আমার এক্সএমএল; এটি চাপলে কেবল চেহারা পরিবর্তন হয়।

 <selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:state_pressed="false" android:drawable="@drawable/map_toolbar_details_selected" />
<item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/map_toolbar_details_selected" />
<item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/map_toolbar_details_selected" />
<item android:drawable="@drawable/map_toolbar_details" />


4
একটি ইমেজবাটন ব্যবহার করে এবং নির্বাচিত রাজ্যটিকে ট্র্যাক করা কিছুটা হ্যাক বলে মনে হচ্ছে। আপনি যদি কার্যকারিতা টগল করতে চান তবে আপনার একটি টগল বোতাম ব্যবহার করা উচিত।
আন্দ্রেস বালেজ লজ্জা

উত্তর:


215

এটি আমার পক্ষে কাজ করে:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- NOTE: order is important (the first matching state(s) is what is rendered) -->
    <item 
        android:state_selected="true" 
        android:drawable="@drawable/info_icon_solid_with_shadow" />
    <item 
        android:drawable="@drawable/info_icon_outline_with_shadow" />
 </selector>

এবং তারপরে জাভাতে:

//assign the image in code (or you can do this in your layout xml with the src attribute)
imageButton.setImageDrawable(getBaseContext().getResources().getDrawable(R.drawable....));

//set the click listener
imageButton.setOnClickListener(new OnClickListener() {

    public void onClick(View button) {
        //Set the button's appearance
        button.setSelected(!button.isSelected());

        if (button.isSelected()) {
            //Handle selected state change
        } else {
            //Handle de-select state change
        }

    }

});

মসৃণ রূপান্তরের জন্য আপনি অ্যানিমেশন সময় উল্লেখ করতে পারেন:

<selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_mediumAnimTime">

4
এটি আমার পক্ষে কাজ করেছে, তবে আমি যুক্ত করতে চাই যে আপনার আঁকা যায় এমন ফোল্ডারে এই এক্সএমএলটি তৈরি করা উচিত এবং আপনি যদি ইমেজবটনটি চাপার সময় হাইলাইট করতে চান তবে আপনার রাজ্য_ নির্বাচিতের পরিবর্তে অ্যান্ড্রয়েড: state_pressed ব্যবহার করা উচিত। এছাড়াও, এই রাষ্ট্রটি রাষ্ট্র ব্যতীত কোনও আইটেমের উপরে হওয়া উচিত, কারণ এটি কম সাধারণ general
ডেনিস কুতলুবায়েভ

4
NOTE: order is important (the first matching state(s) is what is renderedএটি কাজ করেছে কিন্তু আজব আমি কেন পেলাম না?
মুহাম্মদ বাবর

4
কোনও রাষ্ট্রীয় বৈশিষ্ট্যের অভাবে আইটেমটি কোনও রাজ্যের সাথে মিলবে। সুতরাং নির্বাচকটির দ্বিতীয় আইটেমটিকে "সমস্তই ধরুন" অবস্থা হিসাবে ভাবুন।
joshrl

4
অর্ডারটি গুরুত্বপূর্ণ নয় আপনি কেবলমাত্র একটি android:state_selected="false" ডিফল্ট সরবরাহ করেছেন তা নিশ্চিত করা দরকার !
মুহাম্মদ বাবর

আমি কীভাবে উইজেটে একই কাজ করতে পারি? আমার একটি বোতাম আছে তবে আমি কীভাবে এটি করব তা অনুভব করতে পারছি না।
Si8

19

ToggleImageButtonযা Checkableইন্টারফেস এবং সমর্থন OnCheckedChangeListenerএবং android:checkedএক্সএমএল বৈশিষ্ট্য প্রয়োগ করে :

public class ToggleImageButton extends ImageButton implements Checkable {
    private OnCheckedChangeListener onCheckedChangeListener;

    public ToggleImageButton(Context context) {
        super(context);
    }

    public ToggleImageButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        setChecked(attrs);
    }

    public ToggleImageButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setChecked(attrs);
    }

    private void setChecked(AttributeSet attrs) {
        TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ToggleImageButton);
        setChecked(a.getBoolean(R.styleable.ToggleImageButton_android_checked, false));
        a.recycle();
    }

    @Override
    public boolean isChecked() {
        return isSelected();
    }

    @Override
    public void setChecked(boolean checked) {
        setSelected(checked);

        if (onCheckedChangeListener != null) {
            onCheckedChangeListener.onCheckedChanged(this, checked);
        }
    }

    @Override
    public void toggle() {
        setChecked(!isChecked());
    }

    @Override
    public boolean performClick() {
        toggle();
        return super.performClick();
    }

    public OnCheckedChangeListener getOnCheckedChangeListener() {
        return onCheckedChangeListener;
    }

    public void setOnCheckedChangeListener(OnCheckedChangeListener onCheckedChangeListener) {
        this.onCheckedChangeListener = onCheckedChangeListener;
    }

    public static interface OnCheckedChangeListener {
        public void onCheckedChanged(ToggleImageButton buttonView, boolean isChecked);
    }
}

res / মান / attrs.xML:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="ToggleImageButton">
        <attr name="android:checked" />
    </declare-styleable>
</resources>

4
আমি কীভাবে এটি ব্যবহার করতে পারি? আমি এই নির্দেশিকাটিতে অনুসরণ করেছি: developer.android.com/training/custom-views/create-view.html তবে আমি এটি কার্যকর করতে পারিনি।
atisman

4
ধন্যবাদ! মনে রাখবেন যে কোনও নির্বাচক state_checkedএটির সাথে কাজ করে না, আপনাকে ব্যবহার করতে হবে state_selected
ফ্লোরিয়ান ভন স্টোসচ

11

আরও ছবি ছাড়াই এটি করার সর্বোত্তম উপায়:

public static void buttonEffect(View button){
    button.setOnTouchListener(new OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN: {
                    v.getBackground().setColorFilter(0xe0f47521,PorterDuff.Mode.SRC_ATOP);
                    v.invalidate();
                    break;
                }
                case MotionEvent.ACTION_UP: {
                    v.getBackground().clearColorFilter();
                    v.invalidate();
                    break;
                }
            }
            return false;
        }
    });
}

4
আপনি আপনার এক্সএমএল থেকে রঙিন করতে getResources ()। getColor (R.color.lightblue) ব্যবহার করতে পারেন।
বেটো ক্যালডাস

@ অ্যান্ড্রেসকে আরও কিছুক্ষণ বোতাম টিপতে হবে। তুমি জানো কেন?
সিংহেলমেসি

3

একটি res/drawableফোল্ডারে একটি এক্সএমএল-ফাইল তৈরি করুন । উদাহরণস্বরূপ, "বিটিএন_আইমেজ.এক্সএমএল":

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/bg_state_1"
          android:state_pressed="true"
          android:state_selected="true"/>
    <item android:drawable="@drawable/bg_state_2"
          android:state_pressed="true"
          android:state_selected="false"/>
    <item android:drawable="@drawable/bg_state_selected"
          android:state_selected="true"/>
    <item android:drawable="@drawable/bg_state_deselected"/>
</selector>

আপনি পছন্দ করেছেন এমন ফাইলগুলি একত্রিত করতে পারেন, উদাহরণস্বরূপ, "bg_state_1" "bg_state_deselected" এবং "bg_state_2" "" bg_state_selected "এ পরিবর্তন করুন।

এই ফাইলগুলির যে কোনওটিতে আপনি এমন কিছু লিখতে পারেন:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <solid android:color="#ccdd00"/>
    <corners android:radius="5dp"/>
</shape>

নিম্নলিখিত বৈশিষ্ট্যগুলি সহ একটি চিত্র-ভিউ বা ইমেজবটন একটি বিন্যাস ফাইল তৈরি করুন:

<ImageView
    android:id="@+id/image"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:adjustViewBounds="true"
    android:background="@drawable/btn_image"
    android:padding="10dp"
    android:scaleType="fitCenter"
    android:src="@drawable/star"/>

পরে কোডে:

image.setSelected(!image.isSelected());

2

এটা চেষ্টা কর:

 <item
   android:state_focused="true"
   android:state_enabled="true"
   android:drawable="@drawable/map_toolbar_details_selected" />

রঙগুলির জন্যও আমার সাফল্য ছিল

<selector
        xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:state_selected="true"

            android:color="@color/primary_color" />
        <item
            android:color="@color/secondary_color" />
</selector>

হুঁ। সাহায্য বলে মনে হচ্ছে না। আমি একটি যৌগিক বাটন ব্যবহার করছি। অফ-অফের জন্য কি সেই ধরণের বোতামের সাথে নির্দিষ্ট কোনও রাজ্য রয়েছে?
জোরেেন

হ্যাঁ এটিকে চেক করা দেখুন ( চেক করা দেখুন ) চেকড () বিকাশকারী
বোস্টউইকনেটর

0
if (iv_new_pwd.isSelected()) {
                iv_new_pwd.setSelected(false);
                Log.d("mytag", "in case 1");
                edt_new_pwd.setInputType(InputType.TYPE_CLASS_TEXT);
            } else {
                Log.d("mytag", "in case 1");
                iv_new_pwd.setSelected(true);
                edt_new_pwd.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
            }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.