2013-05-28 1 views
8

XMLレイアウトから膨らんだカスタムボタンを作成しました。クリックリスナーがトリガーされない限り、すべて正常に動作します。
android:clickable="true"属性のために問題が発生していると思われます。削除すると、クリックリスナーがトリガーされます。しかし、カスタムビューでセレクタをバックグラウンドとして使用するため、この属性を設定する必要があります。セレクタを削除すると、セレクタはもう使用できなくなります。カスタムビューでOnClickListenerがトリガーされていません

public class CustomButton extends LinearLayout{ 

    public CustomButton(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     inflater.inflate(R.layout.custom_button, this, true); 

     TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomButton, 0, 0); 
     String titleStr = a.getString(R.styleable.CustomButton_title); 
     String subTitleStr = a.getString(R.styleable.CustomButton_subTitle); 
     int iconResId = a.getResourceId(R.styleable.CustomButton_icon, R.drawable.ic_launcher); 
     a.recycle(); 

     TextView title = (TextView)findViewById(R.id.title); 
     title.setText(titleStr); 

     TextView subTitle = (TextView)findViewById(R.id.subTitle); 
     subTitle.setText(subTitleStr); 

     ImageView icon = (ImageView)findViewById(R.id.icon); 
     icon.setImageResource(iconResId); 
    } 
} 

XMLレイアウトカスタムビューから膨張される:ここで

は、クラス定義の

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:background="@drawable/white_box" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 


    <LinearLayout 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:background="@drawable/main_button_selector" 
      android:clickable="true" 
      android:gravity="center" 
      android:orientation="horizontal"> 

     <ImageView 
       android:id="@+id/icon" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:contentDescription="icon" 
       android:layout_marginLeft="5dip" 
       /> 

     <LinearLayout 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginRight="5dip" 
       android:orientation="vertical"> 

      <TextView 
        android:id="@+id/title" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:textColor="@color/grey_text" 
        android:textSize="@dimen/mainTextSize" 
        android:textStyle="bold"/> 

      <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:id="@+id/subTitle" 
        android:ellipsize="end" 
        android:maxLines="2" 
        android:textColor="@color/grey" 
        android:textSize="@dimen/mainSubTextSize"/> 
     </LinearLayout> 
    </LinearLayout> 
</FrameLayout> 

そして、ここで私は、XMLレイアウトでそれを使用する方法は次のとおりです。

<com.customviews.CustomButton 
       android:id="@+id/pay" 
       android:layout_weight="1" 
       android:layout_width="0dip" 
       android:layout_height="fill_parent" 
       custom:title="Hello World" 
       custom:subTitle="Subtitle" 
       custom:icon="@drawable/ic_launcher"/> 

と、アクティビティがクリックリスナーを設定する仕組み:

CustomButton button = (CustomButton) findViewById(R.id.pay); 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(MyActivity.this, "Hello World!", Toast.LENGTH_LONG).show(); 

私は既にこの問題に取り組んでいるいくつかのスレッドを見てきましたが、それらは私を助けませんでした。助けていただければ幸いです。

+0

CustomButtonはLinearLayoutを継承しています。あなたはそのためにonClickListenerを設定しようとしています。あなたが欲しいものですか? – SKK

+0

はい、そのようなものです。一方、CustomButtonには背景セレクタがあります。 –

+0

私はボタンを見ることができません.setclickable(true)どこに、それは正常ですか? – wazaminator

答えて

11

私はandroid:clickable="true"を設定しないことは、セレクタの背景をトリガしないことを心配していたが、ViewクラスからsetOnClickListener()方法を見て取った後、私はsetClickable(true)が呼び出されたことを見た:

public void setOnClickListener(OnClickListener l) { 
     if (!isClickable()) { 
      setClickable(true); 
     } 
     getListenerInfo().mOnClickListener = l; 
} 

ので、削除レイアウトの宣言からandroid:clickable="true"を削除し、カスタムボタンのクリックリスナーだけを設定して問題を解決しました。

+0

と設定されています。 しかし、それがなぜそうであるかはっきりしていません。 'View.setOnClickListener()'はclickableをtrueに設定し、listenerはいずれの場合でも設定します。 – Levor

関連する問題