Android에서 선택, 확인 및 활성화 된 상태의 차이점은 무엇입니까?


114

그 상태가 무엇이 다른지 알고 싶습니다. 이것을 명확히하는 웹 페이지를 찾지 못했습니다.


4
보기 상태 (예 : ListView 항목) developer.android.com/guide/topics/resources/…
Louis

stackoverflow.com/questions/13634259/… 유사한 질문이이 문제를 더 잘 이해하는 데 도움이되었습니다. 자세한 내용을 보려면 확인하십시오.
Acsor

답변:


182

Checked와 Activated의 차이점은 실제로 매우 흥미 롭습니다. Google 문서조차도 사과 적입니다 (아래 강조 추가됨).

... 예를 들어, 단일 또는 다중 선택이 활성화 된 목록보기에서 현재 선택 세트의보기가 활성화됩니다. (음, 예, 여기에있는 용어에 대해 정말 죄송합니다.) 활성화 된 상태는 설정된 뷰의 자식에게 전파됩니다.

따라서 차이점은 다음과 같습니다.

  1. Activated는 Honeycomb에 도입되었으므로 그 전에는 사용할 수 없습니다.
  2. Activated는 이제 모든보기의 속성입니다. setActivated () 및 isActivated () 메서드가 있습니다.
  3. 활성화 됨은 설정된 뷰의 하위 항목으로 전파됩니다.
  4. Checked는 Checkable 인터페이스를 구현하는 뷰를 중심으로 회전합니다. setChecked (), isChecked (), toggle () 메소드
  5. ListView (Honeycomb 이후)는 아래와 같이 Android 버전에 따라 setChecked () 또는 setActivated ()를 호출합니다 (Android 소스 코드에서 가져옴).

    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));
        }
    }

    mCheckStates 변수에 유의하십시오. 목록에서 어떤 위치가 확인 / 활성화되었는지 추적합니다. 예를 들어 getCheckedItemPositions ()를 통해 액세스 할 수 있습니다. ListView.setItemChecked ()에 대한 호출은 위의 내용을 호출합니다. 즉, 동일하게 setItemActivated ()라고 할 수 있습니다.

  6. Honeycomb 이전에는 목록 항목에 state_checked를 반영하는 해결 방법을 구현해야했습니다. 이것은 ListView가 레이아웃의 최상위 뷰에서만 setChecked ()를 호출하기 때문입니다 (레이아웃은 체크 할 수있는 기능을 구현하지 않음) ... 그리고 도움없이 전파되지 않기 때문입니다. 이러한 해결 방법은 다음과 같은 형식이었습니다. 루트 레이아웃을 확장하여 Checkable을 구현합니다. 생성자에서 Checkable을 구현하는 모든 자식을 재귀 적으로 찾습니다. setChecked () 등이 호출되면 해당 뷰에 대한 호출을 전달합니다. 이러한 뷰가 state_checked에 대해 다른 드로어 블을 사용하여 상태 목록 드로어 블 (예 : CheckBox)을 구현하면 체크 된 상태가 UI에 반영됩니다.

  7. Honeycomb 이후 목록 항목에 멋진 배경을 만들려면 다음과 같이 state_activated 상태에 대한 드로어 블이있는 상태 목록 드로어 블이 있어야합니다 (물론 setItemChecked () 사용).

    <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. HoneyComb 이전에 목록 항목에 대한 멋진 배경을 만들려면 state_checked에 대해 위와 같은 작업을 수행하고 Checkable 인터페이스를 구현하기 위해 최상위 뷰를 확장해야합니다. 그런 다음 onCreateDrawableState ()를 구현하고 상태가 변경 될 때마다 refreshDrawableState ()를 호출하여 구현중인 상태가 참인지 거짓인지 Android에 알려야합니다.

    <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"/>

... RelativeLayout에서 state_checked와 결합 된 Checkable을 구현하는 코드는 다음과 같습니다.

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/

Stackoverflow : 사용자 지정 단추 상태를 추가하는 방법

Stackoverflow : 선택기에 응답하는 사용자 지정 확인 가능한보기

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
이 대답은 귀중합니다. Checkable 레이아웃 등을 구현하는 방법을 알아보기 전에 읽어보고 싶습니다. 대단히 감사합니다.
Blake Mumford 2014 년

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"
woojoo666

1
정말 감사합니다. "선택, 선택, 활성화의 차이는 무엇인가"라고 스스로에게 물어보기로 결정하기 전까지 3 일을 허비했습니다. 메뉴가 너무 복잡하고 과도하게 설계되어야하는 것처럼 간단한 일을 처리해야한다는 점이 짜증납니다. 구글의 천재들에 의해,이 회사가 다른 사람들의 속도를 늦추기 위해 의도적으로 설정 한 장애물처럼 보입니다.
Gubatron

20

문서 에 따르면 :

  • android : state_selected Boolean . " true"방향 컨트롤을 사용하여 탐색 할 때 개체가 현재 사용자 선택 일 때이 항목을 사용해야하는 경우 (예 : d- 패드로 목록을 탐색 할 때) false개체가 선택되지 않은 경우이 항목을 사용해야하는 경우 " "입니다. 선택된 상태는 포커스 (android : state_focused)가 충분하지 않을 때 사용됩니다 (예 : 목록보기에 포커스가 있고 그 안의 항목이 d-pad로 선택되는 경우).

  • android : state_checked 부울 . " true"객체를 확인할 때이 항목을 사용해야하는 경우; " false"개체가 선택 취소되었을 때 사용해야하는 경우.

  • android : state_activated 부울 . " true"객체가 영구 선택으로 활성화 될 때이 항목을 사용해야하는 경우 (예 : 영구 탐색보기에서 이전에 선택한 목록 항목을 "강조 표시") false개체가 활성화되지 않았을 때 사용해야하는 경우 " "입니다. API 레벨 11에 도입되었습니다 .

문서가 꽤 명확하다고 생각하는데 문제는 무엇입니까?


5
android : state_selected에 대해 자세히 설명해 주시겠습니까? true로 설정된 경우 어떤 상황이 발생합니까?
앤더슨

@Anderson은 사용중인 ViewGroup에 따라 달라집니다-ListView, RecyclerView (아마도 해당 LayoutManagers), GridView는 다른 구현을 가질 수 있습니다. ListView는 setFocused를 호출하고 GridView는 setSelected를 호출합니다. 다른 플랫폼 버전에서 앱을 확인하는 경우 일 수 있습니다.
ataulm

1
@Anderson : 목록이 있고 사용자에게 화살표 키가 있으면 하나가 "선택"되고 화살표가 위 / 아래로 이동하면 선택 항목이 위 / 아래로 이동합니다. "활성화"키를 누르면 컨트롤이 "활성화"되고 선택은 마우스 오버와 유사하다고 생각하고 확인 / 활성화는 클릭과 유사하다고 생각합니다.
Mooing Duck 2015

나는 목록보기에서 한 항목을 강조 표시하기 위해 활성화를 사용할 것이지만 다른 목록 항목에 대한 활성화를 false로 설정합니까 ... 이들 중 하나를 수행하지 않으면 찾을 필요가 없습니다 활성화 된 다른 하위 항목을 선택하고 활성화를 false로 설정 하시겠습니까?
Lion789

0

이 문제에 대한 다른 해결책은 다음과 같습니다. https://github.com/jiahaoliuliu/CustomizedListRow/blob/master/src/com/jiahaoliuliu/android/customizedlistview/MainActivity.java

setOnItemClickListener 메서드를 재정의하고 코드에서 다른 경우를 확인했습니다. 그러나 확실히 Marvin의 솔루션이 훨씬 낫습니다.

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.