2014-09-03 139 views
0

我有一個定製的小部件,它擴展了線性佈局。 它只是利用litle的文本塊。在自定義小部件中自定義onClickListner - 如何?

這裏是小工具的XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:background="@drawable/actionbar_background" 
     android:layout_height="35dp" 
     android:paddingLeft="15dp" 
     android:gravity="center_vertical"> 

     <TextView 
      android:id="@+id/title" 
      android:layout_height="35dp" 
      android:textColor="@color/white" 
      android:layout_width="match_parent" 
      android:textSize="18dp" 
      android:clickable="true" 
      android:gravity="center_vertical" /> 
    </LinearLayout> 

    <TextView 
     android:id="@+id/ingreds" 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     android:text="Some text" 
     android:paddingLeft="15dp" /> 
</LinearLayout> 

如果我創造onClickListener爲自定義部件在Activity的地方 - 它只有當我在佈局點擊最後TextView反應。但我需要設置onClickListener水平LinearLayout其中包含「title」textView,或直接在標題TextView上。 重要提示:我想要設置這些聽衆OUTSIDE自定義控件類。

我認爲我需要覆蓋setOnclickListener方法在我的自定義類或類似的東西,但我不知道它是如何做到的。

這裏是類自定義部件的:

public class MyTextBlock extends LinearLayout { 
    private TextView title; 
    private TextView ingreds; 

    public MyTextBlock(Context context) { 
     this(context, null); 
    } 

    public MyTextBlock(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     inflater.inflate(R.layout.my_text_block, this, true); 

     title = (TextView) findViewById(R.id.title); 
     ingreds = (TextView) findViewById(R.id.ingreds); 
    } 

    public void setText(String text) { 
     ingreds.setText(text); 
    } 

    public void setTitle(String titleText) { 
     title.setText(titleText); 
    } 
} 

謝謝回答。

+0

所以我通過創建自定義事件偵聽器來解決這個問題。 http://stackoverflow.com/questions/8292712/android-custom-event-listener/8293106#8293106 – udenfox 2014-09-04 13:24:05

回答

0

只需實現OnClickListener這個視圖類,並設置textview.setOnClickLister(this);

現在處理下onClick(View v)方法click事件。

+0

你能提供我示例代碼嗎?我以前從未創建過自定義小部件,所以我不完全瞭解您。謝謝。 – udenfox 2014-09-03 16:37:25

+0

好的,我做到了。但這不是我想要做的。 我可以處理點擊textview裏面的視圖類,但我需要處理它在外面。例如:我在MainActivity中創建新的MyTextBlock對象。所以我需要處理來自MainActivity的textView(它是在自定義View類中)的點擊。 – udenfox 2014-09-04 13:06:17

+0

好吧,不僅僅是在初始化自定義視圖並將其設置爲textview時從主活動類傳遞onClickListener,現在,對textview的點擊將捕獲到主活動類的onClick(View v)方法下。 – 2014-09-04 15:40:14

0
MyTextBlock textviewCustom = .... 
textviewCustom.setonclickListner(MainClass.this); 


public class MyTextBlock extends LinearLayout { 
private TextView title; 
private TextView ingreds; 

public MyTextBlock(Context context) { 
    this(context, null); 
} 


public MyTextBlock(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    LayoutInflater inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    inflater.inflate(R.layout.my_text_block, this, true); 

    title = (TextView) findViewById(R.id.title); 
    ingreds = (TextView) findViewById(R.id.ingreds); 
} 


public void setonclickListner(OnclickListner listner) 
{ 
title.setonclicklistner(listner); 
ingreds.setonclicklistner(listner); 
} 

public void setText(String text) { 
    ingreds.setText(text); 
} 

public void setTitle(String titleText) { 
    title.setText(titleText); 
} 
} 
+0

這似乎沒有工作。 OnClick仍然處理點擊成分TextView,而不是標題(在SetOnclickListener方法中,我刪除了「ingreds.setonclicklistner(listner);」一行) – udenfox 2014-09-03 16:38:57