我有几个按钮,我需要一个椭圆形的边框.
所以我在capsule_border.xml中有这个
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="9999dp"/>
<stroke
android:width="1px"
android:color="@color/border_gray" />
</shape>
Run Code Online (Sandbox Code Playgroud)
我会android:background="@drawable/capsule_border.xml在需要它的地方使用它.
现在,我希望有一个按钮,以获得这个椭圆形边框,但也有一个android:background="?selectableItemBackground"视觉反馈.
我尝试使用带有selectableItembackground的父布局和带有capsule_border的按钮.但似乎突出显示的可点击区域是整个方块.而不仅仅是胶囊边界内的区域.
有没有我可以做到这一点,以便selectableItemBackground不高度视图的整个矩形,但只在我绘制的边框内?
android android-layout android-view android-selector android-drawable
我的活动中有8个按钮.我正在寻找的是,按钮具有默认背景,当单击按钮时,背景颜色应该更改为其他颜色.这部分非常简单.但是,当我点击任何其他按钮时,第一个按钮的背景颜色应该变回默认颜色.我知道这将使用"选择器状态"完成,但我不太清楚如何实现它.我读的越多,我就越困惑.
现在,我拥有的xml如下:在drawable文件夹中
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/blue" android:state_pressed="true"/>
<item android:drawable="@color/dark_grey" android:state_focused="true"/>
<item android:drawable="@drawable/image_border"/>
</selector>
Run Code Online (Sandbox Code Playgroud)
xml中的drawable/image_border用于定义按钮的形状.下面是image_border.xml
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<solid android:color="@color/dark_grey" />
<stroke
android:width="4dp"
android:color="@color/light_grey" />
<padding
android:bottom="1dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
</shape>
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我如何更改xml以按照我需要的方式运行吗?
[编辑1]
以下所有答案都指向类似的解决方案.以下是我所做的更改.但是,当我按下按钮时,它会转到指定的颜色,但会立即变回默认颜色.
button_background_blue.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/image_border_blue" android:state_pressed="true"/>
<item android:drawable="@color/dark_grey" android:state_focused="true"/>
<item android:drawable="@drawable/image_border"/>
</selector>
Run Code Online (Sandbox Code Playgroud)
image_border_blue.xml
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<solid android:color="@color/blue" />
<stroke
android:width="4dp"
android:color="@color/blue" />
<padding
android:bottom="1dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
</shape>
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?
我TabLayout在我的应用中使用了Tabbed导航.我有一个非常奇怪的问题,我使用此代码创建了4个选项卡:
private int[] tabIcons = {R.drawable.navigation_timeline_icon_selector, R.drawable.navigation_feed_icon_selector,
R.drawable.navigation_messages_icon_selector, R.drawable.navigation_notification_icon_selector};
TabLayout tabLayout = setTabLayout();
if (tabLayout != null) {
for (int i = 0; i < 4; i++) {
tabLayout.getTabAt(i).setIcon(tabIcons[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
tabIcon中的每个项目都是selector选定状态和非选定状态.所有图标选择器配置如下:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/navigation_timeline_selected_icon" android:state_selected="true"/>
<item android:drawable="@drawable/navigation_timeline_selected_icon" android:state_pressed="true"/>
<item android:drawable="@drawable/navigation_timeline_icon" />
</selector>
Run Code Online (Sandbox Code Playgroud)
问题是当应用程序启动时,第一个选定的选项卡(索引0)不使用选定的状态图标.相反,它使用非选择状态.
更详细的解释是这个问题的截图,首次启动我的选项卡如下所示:
相反,它应该是这样的:
更改页面后,所有图标都恢复为完整功能,并且正确选择了所选状态.
我尝试使用该TabLayout.Tab select()方法,但结果与使用的图标相同是未选择的图标.
有人知道我能做些什么来解决它吗?
我在我的应用程序中遵循MVP架构.我的HomeActivity包含一个带有列表图标的滑动面板,其中包含选择器,选择滑动面板项目时图标状态已更改,我没有使用任何列表选择器.
我保留了一个模型类NavItemData,用于填充导航抽屉,并使用扩展StateListDrawable 的类SlidingPanelItemSelector为滑动面板图标生成适当的选择器.
在MVP架构中,我们有一个演示者类,它与模型通信并生成视图的输入.在我的情况下,如果我使用演示者获取滑动面板的数据我正在调用使用Android上下文的演示者的类是一个很好的方法,或者我们有任何替代解决方案,严格遵循MVP架构?
目前我正在使用ViewBinderUtils类并将其直接注入活动类并获取Sliding Panel的数据列表.它是否遵循Mvp Architcture?
SlidingPanelItemSelector.class
public class SlidingPanelItemSelector extends StateListDrawable {
private Context mContext;
public SlidingPanelItemSelector(Context mContext){
this.mContext = mContext;
}
public StateListDrawable getHomeSelector(){
StateListDrawable stateListDrawable = new StateListDrawable();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
stateListDrawable.addState(new int[]{android.R.attr.state_pressed},
mContext.getDrawable(R.drawable.ic_nav_home_active));
stateListDrawable.addState(new int[]{},mContext.getDrawable(R.drawable.ic_nav_home));
}else{
stateListDrawable.addState(new int[]{android.R.attr.state_pressed},
mContext.getResources().getDrawable(R.drawable.ic_nav_home_active));
stateListDrawable.addState(new int[]{},mContext.getResources().getDrawable(R.drawable.ic_nav_home));
}
return stateListDrawable;
}
}
Run Code Online (Sandbox Code Playgroud)
ViewBinderUtils.class
public class ViewDataBinderUtils {
Context mContext;
@Inject
public ViewDataBinderUtils(@ActivityContext Context mContext) {
this.mContext = mContext;
}
public …Run Code Online (Sandbox Code Playgroud) mvp android android-layout android-selector navigation-drawer
我想创建一个CustomView显示图像的.单击视图应更改其状态.视图可以表示三个状态(off,set,notset).我想用XML中的选择器来做这件事.它不一定需要是自定义选择器.我可以重用选择器的三个状态(如果状态的名称不同则无关紧要).
有没有一个很好的方法来实现这一目标?
我有一个非常基本的选择器,我用它作为一些按钮的背景来实现关闭状态.这是xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:exitFadeDuration="@android:integer/config_mediumAnimTime">
<item android:drawable="@color/home_button_blue_down" android:state_selected="true" />
<item android:drawable="@color/home_button_blue_down" android:state_pressed="true" />
<item android:drawable="@color/home_button_blue" />
</selector>
Run Code Online (Sandbox Code Playgroud)
使用此选择器,每次按钮更改状态时都会发生淡入淡出动画.换句话说,转换将在从按下按下到按下时以及从按下按下到按下时都会生成动画.
现在,我的问题是:它是否有可能使这些状态变化只有其中一个动画?当用户按下按钮时,我希望在没有动画的情况下立即进行状态转换.当按钮被按下时,我希望当正常状态消失时,状态会淡出.这可以完成吗?
android android-animation android-button android-selector android-background
Q1)查看原始ListView状态drawable listSelector我们有这样的东西(我剥离了一些代码来简化示例):
<selector>
<item android:drawable="<TRANSPARENT>" android:state_window_focused="false"/>
<item android:drawable="<DRAWABLE_1>" android:state_focused="true" android:state_pressed="true"/>
<item android:drawable="<DRAWABLE_1>" android:state_focused="false" android:state_pressed="true"/>
<item android:drawable="<DRAWABLE_2>" android:state_focused="true"/>
</selector>
Run Code Online (Sandbox Code Playgroud)
但我一直在我的应用程序上这样做:
<selector>
<item android:drawable="<DRAWABLE_2>" android:state_pressed="false" android:state_focused="true"/>
<item android:drawable="<DRAWABLE_1>" android:state_pressed="true"/>
<item android:drawable="<TRANSPARENT>" />
</selector>
Run Code Online (Sandbox Code Playgroud)
这似乎产生了相同的结果,而且更加简单.你是否注意到第一个比我自己的版本更好的情况?我只是想确保我没有遗漏一些重要因素,因为我希望尽可能缩短我的代码...
Q2)我看到许多州的drawables <item android:drawable="<TRANSPARENT>" android:state_window_focused="false"/>作为顶级项目,但我不明白为什么需要它.该state_window_focused总是弄得我有点...是不是真的有必要吗?
我正在开发一个标签式应用程序,其中一个片段CollectionsFragment在每个插槽中包含一个带有ImageView的GridView.我希望当用户点击其中一个图像时,使用选择器向用户提供反馈.
我已经成功实现了选择器,但是,我的问题是选择器只是在图像的背景中绘制,但我希望选择器可以绘制整个图像.我已经看到其他地方引用了这个问题,但是,许多人选择的解决方案,设置GridView的drawSelectorOnTop属性,对我来说不起作用.
带有相关适配器代码的相关片段:
public class CollectionsFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_collections, container, false);
// Grid view is inside the xml view inflated above
GridView gridView = (GridView)view.findViewById(R.id.gridview);
gridView.setDrawSelectorOnTop(true);
((GridView) gridView).setAdapter(new CustomGridViewAdapter(getActivity()));
return view;
}
private class CustomGridViewAdapter extends BaseAdapter {
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
View v = view;
ImageView picture;
TextView name;
if(v == null) {
v = inflater.inflate(R.layout.collections_item, viewGroup, false);
v.setTag(R.id.picture, …Run Code Online (Sandbox Code Playgroud) 我有一个9patch设置作为我的布局的背景.但是我仍然想通过使用selectableItemBackgroundattr 提供触摸反馈.
我已经使用试图<layer-list>与9patch和selectableItemBackground作为android:drawable第二的<item>,但没有奏效.
我也可以尝试进行选择和覆盖梯度绘制Android使用了selectableItemBackground在list_selector_background_pressed.xml同一个<layer-list>.但是在4.4 KitKat中,选择的背景颜色实际上是灰色而不是JellyBeans中的蓝色,所以我不能真正硬编码:(
合适的方式,对吧?d:
我SlidingTabs用来创建两个选项卡.选项卡的UI应如下所示 -
选择第一个选项卡时

选择第二个选项卡时.

(请注意蓝色矩形的直角)
我使用以下选择器来创建上面显示的UI.
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Active tab -->
<item android:state_selected="true" android:state_focused="false"
android:state_pressed="false" android:drawable="@drawable/round_corner_rectangle" />
<!-- Inactive tab -->
<item android:state_selected="false" android:state_focused="false"
android:state_pressed="false" android:drawable="@android:color/transparent" />
<!-- Pressed tab -->
<item android:state_pressed="true" android:state_selected="true" android:drawable="@drawable/round_corner_rectangle" />
<item android:state_pressed="true" android:state_selected="false" android:drawable="@color/transparent" />
<!-- Selected tab (using d-pad) -->
<item android:state_focused="true" android:state_selected="true"
android:state_pressed="false" android:drawable="@android:color/transparent" />
</selector>
Run Code Online (Sandbox Code Playgroud)
round_corner_rectangle代码如下 -
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="5dp"/>
<solid android:color="@color/login_background" />
</shape>
Run Code Online (Sandbox Code Playgroud)
login_background是深蓝色.使用上面的代码,我得到以下 -


我可以当然从中删除corner项目round_corner_rectangle以获得深蓝色背景而不是圆形.如果我将蓝色矩形的右侧笔直,当选择另一个选项卡时,矩形会在错误的一侧倒圆.
我该怎么做才能获得第一张图片中显示的UI?
更新: - …
android android-layout android-tabs android-selector pagerslidingtabstrip
android ×10
android-selector ×10
android-tabs ×1
android-view ×1
icons ×1
java ×1
mvp ×1
nine-patch ×1
tabs ×1
xml ×1