例如,默认按钮在其状态和背景图像之间具有以下依赖关系:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_window_focused="false" android:state_enabled="true"
android:drawable="@drawable/btn_default_normal" />
<item android:state_window_focused="false" android:state_enabled="false"
android:drawable="@drawable/btn_default_normal_disable" />
<item android:state_pressed="true"
android:drawable="@drawable/btn_default_pressed" />
<item android:state_focused="true" android:state_enabled="true"
android:drawable="@drawable/btn_default_selected" />
<item android:state_enabled="true"
android:drawable="@drawable/btn_default_normal" />
<item android:state_focused="true"
android:drawable="@drawable/btn_default_normal_disable_focused" />
<item
android:drawable="@drawable/btn_default_normal_disable" />
</selector>
Run Code Online (Sandbox Code Playgroud)
如何定义自己的自定义状态(类似于smth android:state_custom),那么我可以使用它来动态更改我的按钮视觉外观?
任何人都可以解释(或指向一个解释的链接)ListView项目的state_activated,state_selected,state_pressed和state_focused之间的区别?它们都是ListView的有效状态吗?是否使用触摸或键盘是否重要?此链接似乎不再有效.
非常感谢!
我有一组FrameLayout我想要检查/选择,
也就是说,点击后我希望FrameLayout显示为checked- 当再次按下时,我希望它成为联合国checked.更重要的是,我希望通过使用a来像往常一样描述这个视觉阙<selector>.
我似乎无法让这个工作 - 我不确定我缺少什么:
public class CheckableFrameLayout extends FrameLayout implements Checkable {
private boolean mChecked = false;
public CheckableFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void setChecked(boolean checked) {
mChecked = checked;
refreshDrawableState();
}
public boolean isChecked() {
return mChecked;
}
public void toggle() {
setChecked(!mChecked);
}
}
Run Code Online (Sandbox Code Playgroud)
布局CheckableFrameLayout:
<com.test.view.CheckableFrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/selector_horizontal"
android:clickable="true" >
Run Code Online (Sandbox Code Playgroud)
支持它的选择器(selector_horizontal.xml):
<item android:drawable="@drawable/selector_vertical_selected" android:state_pressed="false" android:state_checked="true"/>
<item android:drawable="@drawable/selector_vertical_pressed" android:state_pressed="true" …Run Code Online (Sandbox Code Playgroud) 我想在用户点击它时更改listview项的背景.有点像Honeycomb设置页面(虽然我没有处理只是设置所以我没有使用PreferenceActivity)我有这个功能通过资源状态选择器状态选择器工作,除了单击列表视图菜单更改线性的情况列表视图右侧的布局(一种分屏视图).我猜测listview失去焦点所以state_pressed不再是真的.
<item android:state_pressed="true">
<shape >
<solid android:color="@color/blue1" />
</shape>
</item>
Run Code Online (Sandbox Code Playgroud)
在选择另一个列表视图项目之前,是否保持列表视图项目着色的任何提示?谢谢!
编辑:
我能够在setOnItemClickListener中更改背景
view.setBackgroundResource(R.color.red);
Run Code Online (Sandbox Code Playgroud)
我只需要一次一个选择,从而被点击其他列表项目时,我试图lv.invalidate()和lv.getChildAt(0).invalidate(),但既不工作和第二导致空指针异常.有什么想法让颜色回来?
哇,文档在列表项选择方面很可怕.我只需要能够选择并突出显示列表中的多个项目.我已经浏览了网页并看到了引用android:choiceMode="multipleChoice",我猜这可以让你选择多个项目.但是我在哪里可以获取我的活动中的所选项目?为什么当我尝试使用选择多个项目时setSelection(position),之前突出显示的项目会消失?
谷歌也在View.setActivated(boolean)那里描述
请注意,激活与选择不同.选择是一个瞬态属性,表示用户当前正在与之交互的视图(层次结构).激活是一种较长期的状态,用户可以将视图移入和移出.例如,在启用了单个或多个选择的列表视图中,将激活当前选择集中的视图.(嗯,是的,我们对这里的术语深感抱歉.)
所以我应该使用激活而不是选择?这个SO答案谈到"激活"只是"已检查"的后HoneyComb版本.但是,如果您应该使用"激活"进行多项选择,android:choiceMode="multipleChoice"那么首先是什么意思呢?
我尝试为旧的Android 2.3自定义导航抽屉菜单.
为此,我使用developer.android.com的官方SampleNavigationDrawer
和本教程实现ActionBarCompat.
在android.support.v4.widget.DrawerLayout中使用下一个ListView:
<ListView
android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#111"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:drawSelectorOnTop="false"
android:fadingEdge="none"
android:focusable="false"
android:saveEnabled="true" />
Run Code Online (Sandbox Code Playgroud)
with drawer_list_item.xml:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_selector"
android:drawableLeft="@drawable/selector"
android:drawablePadding="16dp"
android:gravity="center_vertical"
android:minHeight="48dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:textColor="@drawable/text_color_selector" />
Run Code Online (Sandbox Code Playgroud)
bg_selector.xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:drawable="@color/yellow" />
<item android:state_pressed="true" android:drawable="@color/red" />
<item android:state_checked="true" android:drawable="@color/lemon" />
<item android:state_activated="true" android:drawable="@color/orange" />
<item android:state_selected="true" android:drawable="@color/green_pastel" />
<item android:state_active="true" android:drawable="@color/gold" />
<item android:state_accelerated="true" android:drawable="@color/blue" />
<item android:state_enabled="true" android:drawable="@color/pink_dark" />
<item android:drawable="@color/black" />
</selector> …Run Code Online (Sandbox Code Playgroud) android listviewitem android-2.3-gingerbread navigation-drawer
我最近遇到了这个View.isActivated()方法,但不确定它的作用。文档说:
公共布尔 isActivated ()
指示该视图的激活状态。
如果视图被激活则返回 true,否则返回 false
视图的状态是什么意思?视图什么时候被激活,什么时候不激活?
我正在尝试单击ListView的单击项来更改背景.但在我看来,实际上并不可能.有很多帖子都有这样做的例子,但没有一个可靠地运作.据我所知 - 它与"回收"有某种关系.
我在适配器的OnItemClickListener中调用view.setSelected(),它根据我的设置很好地将另一个背景应用于所选项目.但是当我选择导致ListView缺少空间的项目(不确切的重要程度)并且在ListView内部出现(或消失)scollbar时 - android会忘记我的选择并应用默认样式.旋转屏幕时会发生同样的错误 - 该项目取消选择.所以我认为在调用适配器的getView()时会发生"取消选择".
有趣的是,我的onClick事件导致向后台服务发送json请求并接收和解码json响应,因此项目点击和活动内容更改之间需要一些时间.这是它的样子:
单击不会导致滚动条显示的项目可以很好地工作 - 在处理服务的响应后,所选项目不会被取消选中.
试图在适配器的getView()中调用setSelected()不会影响bug.物品仍然被取消选择.我尝试在getView()中手动设置项目的背景 - 它变得更有趣:导致滚动条外观的项目开始正常工作,但是不会导致滚动条出现的项目(实际上这意味着它们不会导致getView()调用)停止工作!
所有代码都非常复杂,所以我只发布一些重要的片段.这是我的OnItemClickListener:
private AdapterView.OnItemClickListener onCategoryClickListener =
new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, final View view, final int position,
long id) {
categoriesAdapter.setSelectedPosition(position);
view.setSelected(true);
// More code here
}
};
Run Code Online (Sandbox Code Playgroud)
这是我的适配器代码的一个片段:
private int selectedPosition;
private boolean selectable = true;
public void setSelectedPosition(int position) {
this.selectedPosition = position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView label = (TextView) …Run Code Online (Sandbox Code Playgroud) android ×8
listview ×2
view ×2
button ×1
custom-view ×1
java ×1
listviewitem ×1
recycle ×1
resources ×1
state ×1