我一直在使用带有图标(drawableTop)和文本的通用 Android 按钮。如果你想要一个非标准尺寸的按钮,它的效果真的很差,所以我决定用一个具有以下布局的 LinearLayout 制作一个自定义按钮:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/ButtonHoloDark"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:clickable="true"
android:focusable="true"
android:orientation="vertical" >
<ImageView
android:id="@+id/buttonIcon"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:duplicateParentState="true" />
<TextView
android:id="@+id/buttonText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:duplicateParentState="true"
android:gravity="center"
android:textColor="@color/white" />
</LinearLayout>
布局由自定义类使用:
public class CustomIconButton extends LinearLayout {
public CustomIconButton(Context context, AttributeSet attrs) {
super(context, attrs);
setAttributes(context, attrs);
LayoutInflater.from(context).inflate(R.layout.custom_icon_button, this, true);
}
...
但是,当我在其父布局中的按钮上设置 OnClickListener 时,它永远不会被调用。如果将侦听器设置为 ImageView 和/或 TextView,我只能接收点击。当单击按钮时,这会导致两种可能的效果:
- 点击在 ImageView 或 TextView 内。点击注册好,但按钮状态drawable没有改变,即它没有出现沮丧。
- 单击位于按钮的“空白区域”内。单击未注册,但状态可绘制工作正常。
这些都不可行。我在 LinearLayout 或其子项上使用了以下属性,但无论真假似乎都没有任何效果:
- 重复父状态
- 可点击
- 可聚焦
似乎没有任何合理的方法可以让 LinearLayout 父级而不是其子级接收点击。我已经看到一些可能的解决方案覆盖了自定义组件本身的 dispatchTouchEvent 或 onInterceptTouchEvent,但是如果我必须开始分析触摸事件以识别正确的点击,那看起来真的是一团糟。
那么在带有子项的 LinearLayout 上的 OnClickListener = 不行吗?
编辑:这就是我目前将按钮插入片段主布局的方式。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
...
<com.package.CustomIconButton
android:id="@+id/someButton"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
mynamespace:buttonIcon="@drawable/someIcon"
mynamespace:text="@string/str_someText" />
...
并且按钮在 Fragment 的代码中绑定如下:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.main, container, false);
View customButton = v.findViewById(R.id.goButton);
customButton.setOnClickListener(onClickListener);
...