অ্যান্ড্রয়েডে নির্বাচিত, পরীক্ষিত এবং সক্রিয় রাষ্ট্রগুলির মধ্যে পার্থক্য কী?


114

আমি জানতে চাই যে এই রাজ্যগুলির মধ্যে কী পার্থক্য রয়েছে। আমি এটির ব্যাখ্যা দিয়ে কোনও ওয়েবপৃষ্ঠা পাইনি।


4
দর্শনগুলির রাজ্যগুলি (উদাহরণস্বরূপ একটি তালিকাভিত্তিক আইটেম) বিকাশকারী
লুই

stackoverflow.com/questions/13634259/… একটি অনুরূপ প্রশ্ন যা আমাকে এটি আরও ভালভাবে বুঝতে সাহায্য করেছে। আপনি আরও জানতে চাইলে এটি পরীক্ষা করে দেখুন।
Acsor

উত্তর:


182

চেক করা এবং অ্যাক্টিভেটেড মধ্যে পার্থক্য আসলে বেশ আকর্ষণীয়। এমনকি গুগল ডকুমেন্টেশনও ক্ষমাশীল (নীচে জোর দেওয়া হয়েছে):

... উদাহরণস্বরূপ, একক বা একাধিক নির্বাচন সক্ষম করার সাথে তালিকার দৃশ্যে, বর্তমান নির্বাচনী সেটে দর্শনগুলি সক্রিয় করা হয়েছে। (উম, হ্যাঁ, আমরা এখানে পরিভাষাটির জন্য গভীরভাবে দুঃখিত।) সক্রিয় রাষ্ট্রটি সেট করা দর্শনটির শিশুদের কাছে প্রচার করা হয়।

সুতরাং এখানে পার্থক্য:

  1. অ্যাক্টিভেটেড হানিকম্বে প্রবর্তিত হয়েছিল যাতে আপনি এটির আগে এটি ব্যবহার করতে পারবেন না
  2. সক্রিয় এখন প্রতিটি দর্শন সম্পত্তি। এটিতে পদ্ধতিগুলি অ্যাক্টিভেটেড () এবং এটিএ্যাকটিভেটেড () রয়েছে
  3. সক্রিয় করা হয়েছে যা দেখেছে তার বাচ্চাদের কাছে প্রচার করে
  4. চেক করাযোগ্য চেকযোগ্য ইন্টারফেস প্রয়োগকারী একটি দর্শন ঘুরে। পদ্ধতিগুলি চেকড (), চেকড (), টগল () সেট করে
  5. লিস্টভিউ (হানিকম্বের পরে) সেটকেচেড () বা সেটঅ্যাক্টিভেটেড () নীচের হিসাবে অ্যান্ড্রয়েড সংস্করণের উপর নির্ভর করে কল করেছে (অ্যান্ড্রয়েড উত্স কোড থেকে নেওয়া):

    if (mChoiceMode != CHOICE_MODE_NONE && mCheckStates != null) {
        if (child instanceof Checkable) {
            ((Checkable) child).setChecked(mCheckStates.get(position));
        } else if (getContext().getApplicationInfo().targetSdkVersion
                >= android.os.Build.VERSION_CODES.HONEYCOMB) {
            child.setActivated(mCheckStates.get(position));
        }
    }
    

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

  6. হানিকম্বের আগে আমাদের তালিকা আইটেমগুলিতে state_ চেক করা প্রতিফলিত করার জন্য আমাদের কাজের ক্ষেত্রগুলি প্রয়োগ করতে হয়েছিল। এর কারণ, তালিকাভিউ কেবলমাত্র লেআউটের শীর্ষতম ভিউতে সেটচেকড () কেবল কল করে (এবং বিন্যাসগুলি চেকযোগ্য প্রয়োগ করে না) ... এবং এটি সাহায্য ছাড়াই প্রচার করে না। এই কাজের ক্ষেত্রগুলি নিম্নলিখিত ফর্মের ছিল: চেকযোগ্যটি কার্যকর করতে মূল বিন্যাস প্রসারিত করুন। এর নির্মাতায়, চেকযোগ্য কার্যকর করে এমন সমস্ত শিশুকে পুনরাবৃত্তভাবে সন্ধান করুন। যখন সেটচেকড () ইত্যাদি ... কল করা হয় তখন সেই দর্শনগুলিতে কলটি পাস করুন। যদি এই মতামতগুলি রাজ্য তালিকা পরীক্ষাযোগ্য (যেমন একটি চেকবক্স) কে রাষ্ট্র_ যাচাইয়ের জন্য আলাদা আঁকতে সক্ষম করে তবে চেক করা রাষ্ট্রটি ইউআইতে প্রতিবিম্বিত হয়।

  7. মধুচক্রের পরে একটি তালিকা আইটেমটিতে একটি দুর্দান্ত ব্যাকগ্রাউন্ড করার জন্য আপনার যা যা করা দরকার তা হল রাজ্য রাজ্যটির জন্য একটি অঙ্কনযোগ্য একটি রাজ্য তালিকা থাকতে হবে_এর জন্য চালিত (এবং অবশ্যই সেটআইটেম চেকড (অবশ্যই ব্যবহার করুন):

    <item android:state_pressed="true"
        android:drawable="@drawable/list_item_bg_pressed"/>
    <item android:state_activated="true"
        android:drawable="@drawable/list_item_bg_activated"/>
    <item android:drawable="@drawable/list_item_bg_normal"/>
    

  8. হানিকম্বের পূর্বে একটি তালিকা আইটেমটিতে একটি দুর্দান্ত ব্যাকগ্রাউন্ড করতে আপনি state_checked এর জন্য উপরের মতো কিছু করতে হবে এবং চেকযোগ্য ইন্টারফেসটি প্রয়োগ করতে আপনাকে আপনার শীর্ষতম দৃষ্টিভঙ্গি প্রসারিত করতে হবে। এর মধ্যে আপনার পরে অ্যান্ড্রয়েডকে বলা দরকার যে আপনি যে রাষ্ট্রটি প্রয়োগ করছেন সেটি অনক্রিটড্রেবলযোগ্য স্টেট () প্রয়োগ করে এবং যখনই রাষ্ট্র পরিবর্তন হয় তখন রিফ্রেশড্র্যাবলস্টেট () কল করে true

    <item android:state_pressed="true"
        android:drawable="@drawable/list_item_bg_pressed"/>
    <item android:state_checked="true"
        android:drawable="@drawable/list_item_bg_checked"/>
    <item android:drawable="@drawable/list_item_bg_normal"/>
    

... এবং একটি সম্পর্কিত সম্পর্কিত লেআউটে রাষ্ট্র_চেক করা এর সাথে চেকযোগ্য কার্যকর করার কোডটি হতে পারে:

public class RelativeLayoutCheckable extends RelativeLayout implements Checkable {

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

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

    private boolean mChecked = false;

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
    }
    @Override
    public boolean isChecked() {
        return mChecked;
    }

    @Override
    public void setChecked(boolean checked) {
        mChecked = checked;
        refreshDrawableState();
    }

    private static final int[] mCheckedStateSet = {
        android.R.attr.state_checked,
    };

    @Override
    protected int[] onCreateDrawableState(int extraSpace) {
        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
        if (isChecked()) {
            mergeDrawableStates(drawableState, mCheckedStateSet);
        }
        return drawableState;
    }    

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

নিম্নলিখিত ধন্যবাদ:

http://sriramramani.wordpress.com/2012/11/17/custom-states/

স্ট্যাকওভারফ্লো: কীভাবে কাস্টম বোতামের রাজ্য যুক্ত করা যায়

স্ট্যাকওভারফ্লো : কাস্টম চেকযোগ্য ভিউ যা নির্বাচককে প্রতিক্রিয়া জানায়

http://www.charlesharley.com/2012/programming/custom-drawable-states-in-android/

http://developer.android.com/guide/topics/resources/drawable-resource.html#StateList

http://blog.marvinlabs.com/2010/10/29/custom-listview-ability-check-items/


4
এই উত্তর অমূল্য। আমি আশা করি কীভাবে চেকযোগ্য লেআউট ইত্যাদি বাস্তবায়িত করার জন্য কাজ করার চেষ্টা করার আগে আমি এটি পড়েছি Thank ধন্যবাদ আপনাকে অনেক ধন্যবাদ।
ব্লেক ম্যামফোর্ড 5'14

12
দুর্দান্ত উত্তর, কিন্তু "নির্বাচিত" আইটেমগুলিকে সম্বোধন করে না। আপনি যে উদ্ধৃত করেছেন তার ঠিক আগে বাক্যগুলিতে আমি উত্তরটি পেয়েছি: Selection is a transient property, representing the view (hierarchy) the user is currently interacting with. Activation is a longer-term state that the user can move views in and out of. For example, in a list view with single or multiple selection enabled, the views in the current selection set are activated. (Um, yeah, we are deeply sorry about the terminology here.) উত্স
woojoo666

আমার কাস্টম ব্যাকগ্রাউন্ডের রঙ কেবল নির্বাচিত / setItemChecked()android:state_activated="true"
ফোকাসড

1
আপনাকে অনেক ধন্যবাদ, আমি শেষ পর্যন্ত নিজেকে "পরীক্ষিত, নির্বাচিত এবং সক্রিয়করণের মধ্যে কী পার্থক্য" জিজ্ঞাসা করার সিদ্ধান্ত না নেওয়ার আগে পর্যন্ত এই বিষয়টি খুঁজে বের করার চেষ্টা করে 3 দিন নষ্ট করেছি, যে মেনু হিসাবে এত সাধারণ কিছু নিয়ে কাজ করা এই জটিল, অতিমাত্রায় কাজ করা উচিত গুগলের প্রতিভা দ্বারা, প্রায়শই মনে হয় এই সংস্থাটি অন্যকে মন্থর করার উদ্দেশ্যে উদ্দেশ্য স্থির করেছে।
গুব্যাট্রন

20

ডক অনুসারে :

  • অ্যান্ড্রয়েড: রাজ্য_নির্বাচিত বুলিয়ান । " true" যদি এই আইটেমটি ব্যবহার করা উচিত যখন কোনও নির্দেশিক নিয়ন্ত্রণ (যেমন একটি ডি-প্যাডের সাথে তালিকার সাহায্যে নেভিগেট করার সময়) যখন নেভিগেট করার সময় অবজেক্টটি বর্তমান ব্যবহারকারী নির্বাচন হয়; " false" যদি বস্তুটি নির্বাচন না করা হয় তবে এই আইটেমটি ব্যবহার করা উচিত। ফোকাস (অ্যান্ড্রয়েড: state_focused) পর্যাপ্ত না হলে নির্বাচিত রাষ্ট্রটি ব্যবহার করা হয় (যেমন যখন তালিকার দৃশ্যে ফোকাস থাকে এবং এর মধ্যে একটি আইটেমটি ডি-প্যাড দিয়ে নির্বাচিত হয়)।

  • অ্যান্ড্রয়েড: রাজ্য_বিহীন বুলিয়ান । " true" যদি বস্তুটি পরীক্ষা করা হয় তখন এই আইটেমটি ব্যবহার করা উচিত; " false" যদি বস্তুটি পরীক্ষা না করা হয় তবে এটি ব্যবহার করা উচিত।

  • অ্যান্ড্রয়েড: স্টেট_অ্যাক্টিভেটেড বুলিয়ান । " true" যদি আইটেমটি অবিচ্ছিন্ন নির্বাচন হিসাবে সক্রিয় করা হয় তখন এটি ব্যবহার করা উচিত (যেমন স্থির নেভিগেশন ভিউতে পূর্বে নির্বাচিত তালিকা আইটেমটি "হাইলাইট" করা); " false" যদি বস্তুটি সক্রিয় না হয় তখন এটি ব্যবহার করা উচিত। চালু এপিআই স্তর 11

আমার মনে হয় ডকটি বেশ পরিষ্কার, তাই সমস্যা কী?


5
আপনি কি অ্যান্ড্রয়েডের উপর বিস্তারিত বর্ণনা করতে পারেন: state_selected। এটি সত্য হিসাবে সেট করা হলে কী পরিস্থিতিতে?
অ্যান্ডারসন

@ অ্যান্ডারসন এটি আপনি যে ভিউগ্রুপটি ব্যবহার করছেন তার উপর নির্ভর করবে - লিস্টভিউ, রিসাইক্লারভিউ (সম্ভবত এটির লেআউট ম্যানেজারস), গ্রিডভিউতে পৃথক পৃথক বাস্তবায়ন থাকতে পারে: লিস্টভিউ কলগুলি সেটফোকাসড যেখানে গ্রিডভিউ কলসকে নির্বাচিত উদাহরণ হিসাবে বেছে নিয়েছে। এটি কেবলমাত্র বিভিন্ন প্ল্যাটফর্ম সংস্করণে আপনার অ্যাপ্লিকেশনটি পরীক্ষা করার ক্ষেত্রে হতে পারে।
আতাউলম

1
@ অ্যান্ডারসন: আপনার যদি একটি তালিকা থাকে এবং ব্যবহারকারীর কাছে তীর কী থাকে, একটি "নির্বাচিত" হয় এবং সেগুলি নীচে / নীচে তীরটি নিলে নির্বাচনটি উপরে / নিচে চলে যায়। যখন তারা "অ্যাক্টিভেট" কী টিপে, এটি নিয়ন্ত্রণটি "সক্রিয়" করে, এটিকে মাউসওভারের মতো অস্পষ্টরূপে নির্বাচন হিসাবে বিবেচনা করে এবং ক্লিক / সক্রিয়করণকে অস্পষ্টভাবে ক্লিক করার মতো মনে করে।
হাঁস মোইং

আমি ভাবছিলাম, আমি একটি তালিকা ভিউতে একটি আইটেম হাইলাইট করার জন্য অ্যাক্টিভেটেড ব্যবহার করব, তবে এটি কি অন্য তালিকা আইটেমগুলির জন্য অ্যাক্টিভেটটিকে মিথ্যা হিসাবে সেট করে ... যদি না হয় তবে এটির জন্য আমাকে খুঁজে বের করতে হবে না অন্যান্য সক্রিয় শিশু আইটেম এবং অ্যাক্টিভেশন মিথ্যা সেট?
সিংহ 789

0

এই সমস্যার অন্যান্য সমাধান এখানে দেওয়া হয়েছে: https://github.com/jiahaoliulu/CustomizedListRow/blob/master/src/com/jiahaoliulu/android/customizedlistview/MainActivity.java

আমি কোডটিআইটেমিক্লিকলিস্টনার পদ্ধতিটি ওভাররাইড করেছি এবং কোডে পৃথক কেসগুলি পরীক্ষা করেছি। তবে স্পষ্টতই মারভিনের সমাধান আরও ভাল।

listView.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position,
        long id) {
    CheckedTextView checkedTextView =
            (CheckedTextView)view.findViewById(R.id.checkedTextView);
    // Save the actual selected row data
    boolean checked = checkedTextView.isChecked();
    int choiceMode = listView.getChoiceMode();
    switch (choiceMode) {
    // Not choosing anything
    case (ListView.CHOICE_MODE_NONE):
        // Clear all selected data
        clearSelection();
        //printCheckedElements();
        break;
    // Single choice
    case (ListView.CHOICE_MODE_SINGLE):
        // Clear all the selected data
        // Revert the actual row data
        clearSelection();
        toggle(checked, checkedTextView, position);
        //printCheckedElements();
        break;
    // Multiple choice
    case (ListView.CHOICE_MODE_MULTIPLE):
    case (ListView.CHOICE_MODE_MULTIPLE_MODAL):
        // Revert the actual selected row data
        toggle(checked, checkedTextView, position);
        //printCheckedElements();
        break;
    }
    }
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.