2013-05-28 29 views
8

XML düzeninden şişirilen özel bir düğme oluşturdum. Her şey iyi çalışır, ancak tıklama dinleyicisi tetiklenmez.
android:clickable="true" özniteliğiyle ilgili sorun olduğundan şüphelendiğimde, tıklatma dinleyicisi tetiklenir. Ancak bu özniteliğin benim özel görünümümün arka plan olarak bir seçici kullanması durumunda ayarlamam gerekiyor, eğer kaldırırsam, seçici artık çalışmayacak.OnClickListener Özel Görünüm için tetiklenmedi

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 düzeni özel görünüm seviyesine yükselir: Burada

sınıf tanımı var

<?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> 

Ve burada XML düzenleri kullanmak nasıl:

<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"/> 

ve etkinliğin tıklama dinleyicisini nasıl ayarladığı:

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(); 

Bu sorunu ele alan birkaç iş parçacığı gördüm, ancak bunlardan hiçbiri bana yardım etmedi. Herhangi bir yardım için minnettarım.

+0

CustomButton'unuz LinearLayout'u genişletir. Ve bunun için bir onClickListener ayarlamaya çalışıyorsunuz. istediğin bir şey mi? – SKK

+0

Evet, böyle bir şey. Ama bu arada CustomButton bir arka plan seçiciye sahip. –

+0

Düğmeyi her yerde göremiyorum (true), normal mi? – wazaminator

cevap

11

Ben android:clickable="true" seçici arka plan tetiklemez ayarı, ancak View sınıftan setOnClickListener() yöntemi bir göz aldıktan sonra, ben setClickable(true) denir gördük değil endişeliydi: kaldırarak,

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

Yani Düzen beyanından android:clickable="true" ve özel düğmem için yalnızca tıklama dinleyicisini ayarlama sorunu çözdü.

+0

İyi yakalama. Ama neden böyle olduğu belli değil. 'View.setOnClickListener()', true için tıklanabilir ayarlar ve dinleyici her durumda ayarlanır. – Levor

İlgili konular