2

我一直在使用带有图标(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,我只能接收点击。当单击按钮时,这会导致两种可能的效果:

  1. 点击在 ImageView 或 TextView 内。点击注册好,但按钮状态drawable没有改变,即它没有出现沮丧。
  2. 单击位于按钮的“空白区域”内。单击未注册,但状态可绘制工作正常。

这些都不可行。我在 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);

    ...
4

2 回答 2

2

你确定你设置了正确的监听器LinearLayout(因为你有两个,父级和膨胀布局中的一个)。前段时间我做了一个类似的组件,监听器工作没有问题(我不知道你在这些风格中有什么)。唯一的区别是我没有添加 (不需要) LinearLayout,而是使用了merge标签:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" >

   <ImageView
       android:id="@+id/buttonIcon"  
       android:layout_width="fill_parent"
       android:layout_height="wrap_content" />

   <TextView
       android:id="@+id/buttonText"  
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"              
       android:textColor="@color/white" />

</merge>

并在 parent 上设置样式LinearLayout

于 2012-09-02T09:36:11.617 回答
1

您可以transparent child为您的线性布局设置一个并设置它的尺寸fill_parent然后注册onClickListener它,所以当用户点击它时,它会响应。例如:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:src="@null" />

</LinearLayout>

创建():

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ImageView iv = (ImageView) findViewById(R.id.imageView1);
        iv.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                System.out.println("CLICKED!");
            }
        });
    }
于 2012-09-02T08:47:13.890 回答