我发现自己有一天会看到一个平板电脑优化的设计,左侧显示一个带有搜索结果的窗格,另一个显示右侧显示相应详细信息的窗格,这并不奇怪。左窗格中的结果具有选定状态,以指示当前显示的详细信息。在公园散步似乎最终成了一次无聊的错误之旅。但最后我设法让它工作,我删除了所有不相关的测试代码,只是发现它已经停止工作了。我重新引入了“不相关”的部分,令人惊讶的是它按计划运作。
客户满意,设计师很高兴,但不是我,因为我仍然不明白为什么它会起作用。
现在我的问题是3& 4. 已选中和已激活状态(步骤3)可确保在轻触视图时调用 setSelected(true),但不会立即调用一旦touchDown结束,使用 setSelected(false)再次调用,因此我在步骤4中设置的视图停留。
我曾预料到我不需要步骤4中的自定义视图,因为我认为它会使用drawable来执行步骤3中的激活状态。从步骤4删除自定义(因此与Android状态系统无关)视图从步骤3中绘制的状态确实显示的效果,但仅在onPress
(touchDown / Hold)期间和...在上一个选定项目上显示!
项目背景
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/light_gray">
<item android:drawable="@drawable/search_result_selector" />
</ripple>
选择器Drawable(search_result_selector)
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/white_selected" android:state_selected="true"/>
<item android:drawable="@color/white_selected" android:state_pressed="true"/>
<item android:drawable="@drawable/search_result_highlighted_state" android:state_activated="true"/>
<item android:drawable="@drawable/search_result_highlighted_state" android:state_checked="true"/>
<item android:drawable="@color/white"/>
</selector>
用于ListView
中的项目的自定义视图setSelected(已选择)
@Override
public void setSelected(boolean selected) {
super.setSelected(selected);
if (selected && selectedView == null) {
selectedView = new View(getContext());
selectedView.setBackground(Utils.getDrawable(getContext(), R.drawable.action_bar_background));
RelativeLayout.LayoutParams lp = new LayoutParams(Utils.pxFromDp(getContext(), 3), getHeight());
lp.addRule(ALIGN_PARENT_RIGHT);
addView(selectedView, lp);
} else if (!selected && selectedView != null) {
removeView(selectedView);
selectedView = null;
}
}
selectedView 是我在自定义视图类中定义的字段。我明白为什么它有效,但我想知道为什么我需要它,因为我期望正确使用状态drawable并保留选择。奇怪的是当我删除那部分时,ListView
决定使用drawable,但是在之前选择的视图上并且仅在touchDown期间。现在为什么自定义实现的存在会影响Android视图状态的工作?显然它在某种程度上被捆绑在一起,但我看不到在哪里。任何关于这一切背后原因的指示都会让我放心。提前谢谢!
修改 显然我的一个结论是错误的。即使选择器中有状态,也会调用 setSelected(false)。这也许是有意义的,如果激活是重要的状态。我将代码移动到setActivated上的覆盖方法,实际上显示了我的自定义视图。那说奇怪的是......国家的抽签不能按预期运作。