在Android中select,检查和激活的状态有什么区别?

我想知道这些国家有什么不同。 我没有find任何网页澄清这一点。

Checked和Activated之间的区别实际上非常有趣。 即使是Google的文档也很抱歉(下面重点加了):

…例如,在启用单个或多个select的列表视图中,激活当前select集中的视图。 (嗯,是的,我们对这里的术语深表遗憾。)激活的状态传播到它所设置的视图的子节点。

所以这里是区别:

  1. 在Honeycomb中引入了被激活的function,所以在这之前你不能使用它
  2. 激活现在是每个视图的属性。 它有方法setActivated()和isActivated()
  3. 激活传播给设置它的View的子项
  4. 检查围绕一个View实现Checkable接口。 方法setChecked(),isChecked(),toggle()
  5. ListView(在蜂窝之后)根据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)); } } 

    注意mCheckStatesvariables。 它跟踪列表中哪些位置被检查/激活。 这些可以通过getCheckedItemPositions()来访问。 还要注意对ListView.setItemChecked()的调用会调用上述。 换句话说,它可以同样被称为setItemActivated()。

  6. 在Honeycomb之前,我们必须实施解决方法才能在我们的列表项中反映state_checked。 这是因为ListView仅在布局中最顶层的View上调用了setChecked()(并且布局不实现可检查的),并且它不会在没有帮助的情况下传播。 这些变通办法是以下forms:扩展根布局实现可检查。 在它的构造函数中recursion地find所有实现Checkable的子项。 当setChecked()等被调用时,传递给这些视图。 如果这些视图实现state_checked状态列表drawable(例如CheckBox)和一个不同的drawable,那么选中的状态将反映在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()来告诉Android你正在实现的状态是true还是false,并且每当状态改变的时候调用refreshDrawableState()。

     <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: 如何添加自定义button状态

Stackoverflow: 对Selector做出响应的自定义Checkable视图

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/

根据文件 :

  • android:state_selected 布尔值 。 如果使用方向控制进行导航时(例如在使用d-pad浏览列表时),当对象是当前用户select时应该使用此项目时为“ true ”; 如果在未选中对象时应使用此项,则为“ false ”。 当focus(android:state_focused)不够用时(例如列表视图具有焦点并且其中的某个项目用d-pad选中)时,将使用所选状态。

  • android:state_checked 布尔值 。 如果在检查对象时应该使用这个项目,则为“ true ”; 如果在取消对象时应该使用“ false ”。

  • android:state_activated 布尔值 。 如果在激活对象作为持久性select(例如,在持久导航视图中“突出显示”之前select的列表项目)时应该使用该项目,则为“ true ”。 如果对象没有被激活时应该使用“ false ”。 在API级别11中引入。

我认为这个文件很清楚,那么问题是什么?

下面是这个问题的其他解决scheme: https : //github.com/jiahaoliuliu/CustomizedListRow/blob/master/src/com/jiahaoliuliu/android/customizedlistview/MainActivity.java

我已经重写了setOnItemClickListener方法,并检查代码中的不同情况。 但是Marvin的解决scheme明确得多。

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