2011-07-20 36 views
36

我有一個帶有較小TextView子級的自定義LinearLayout。我希望能夠點擊未被TextView覆蓋的區域,因此我將clickable = true和onclicklistener設置爲LinearLayout,但onClick不會被觸發。如果我在TextView上設置onclick監聽器,它按預期工作...帶觸發器的LinearLayout上的onClick沒有觸發

任何人都可以提供幫助嗎?

ar_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/ar_item" android:layout_width="202dp" 
    android:layout_height="62dp" android:background="@drawable/bg_item_ar" 
    android:clickable="true"> 

    <TextView android:id="@+id/ar_item_txt" 
     android:layout_width="164dp" android:layout_height="fill_parent" 
     android:paddingBottom="8dp" android:paddingLeft="8dp" 
     android:paddingTop="8dp" android:paddingRight="6dp" android:gravity="center" 
     android:background="#50000000" /> 

</LinearLayout> 

我定製的LinearLayout

public class ARView extends LinearLayout 
{  

    public ARView(final Context context, String name, String id) 
    {   
     super(context); 
     getLayoutInflater().inflate(R.layout.ar_item, this ,true); 
     LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     inflater.inflate(R.layout.ar_item, null); 

     TextView textView = (TextView) findViewById(R.id.ar_item_txt); 
     textView.setText(name); 

     setOnClickListener(new View.OnClickListener() 
     { 
      public void onClick(View v) 
      {     
       Toast t = Toast.makeText(context, "hey!", Toast.LENGTH_SHORT); 
       t.show(); 
      } 
     }); 
    } 
} 
+0

我有完全相同的問題,你有沒有找到解決的辦法? – longhairedsi

回答

46

爲每一個孩子

機器人:duplicateParentState =「真」

+1

感謝你的解決,我有類似的問題,有多個控件,我想表達一個「單擊」的視覺狀態,而只需要處理父項中的事件。 – Rollie

+0

雖然我仍然看到一個非常奇怪的問題 - 當我有clickable = true,width/height = wrap/match時,它可以工作,但是如果我將它們放入一個樣式並使用該樣式,則不會點擊「狀態,沒有處理程序被解僱)。這是2.3;任何想法爲什麼可能會發生? – Rollie

+1

感謝您的支持!解決了我今天使用嵌套線性佈局選擇的問題。 –

1

你的TextView高度覆蓋整個父(整體佈局),所以你可能會點擊空白空間,但不上佈局。嘗試使用適用於您的TextView的android:layout_height的wrap_content。設置佈局的點擊偵聽器。

+0

TextView的寬度比其父項的寬度小,因此在Linearlayout的右側應該保留可點擊區域。 – jul

2

您沒有使用您的自定義視圖;你正在使用一個標準的LinearLayout。你的XML標記應該是:

<com.yourcode.ARView ...> ... </com.yourcode.ARView> 
+0

@jul你試過這個嗎? – cdhabecker

0

的問題可能與在其佈局android:layout_height="fill_parent" TextView的。如果這不能解決問題,則問題可能是onClick()事件。線性佈局可能實際上並沒有實際調用onClick(),因爲它的佈局。改爲嘗試覆蓋onTouch()事件偵聽器。

1

有一件事要確保的是,另一種觀點是不是你嘗試單擊視圖的頂部。這是FrameLayouts尤爲常見(如您的子LinearLayout中可覆蓋)或相對佈局,你可能已經忘了更新這一行:

android:layout_below="@id/shouldBeTheIdOfTheViewCurrentlyBeingCovered" 

,這樣的觀點不填同一空間。

56

android:duplicateParentState="true"沒有幫助我。

爲了使您的佈局可點擊與它的孩子,你需要增加該選項爲每個孩子

android:clickable="false" 

然後點擊操作會高達

+1

謝謝你的回答! – Athos

+1

謝謝@收集它的工作就像魔術一樣。這必須是可以接受的答案 –

+1

必須是可以接受的答案! – Moti

14

這不是你的情況,但我有類似的問題,可點擊ViewGroup。尋找解決方案小時後發現,我設置android:inputTypeTextViewViewGroup這是阻止onClick()監聽器(不知道爲什麼)

不要使用android:inputType與TextView的

+0

謝謝!我無法弄清楚爲什麼我的TextView攔截了點擊。 – MrPlow

+2

這也是我的問題,請確保您沒有inputType或將它設置爲none!感謝您發佈這個 –

+0

Ma maaan謝謝。 – Bolling

1

如果內有問題的視圖是TextView s,您可能需要將它們設置爲focusable="false",以便第一次點擊不會專注於文本視圖。

0

將以下屬性添加到線性佈局 未由子視圖處理的任何單擊事件將自動傳遞到LinearLayout。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    ... 
    android:focusable="true" 
    android:clickable="true"> 

<child/> 
<child/> 

</LinearLayout> 
1

android:duplicateParentState="true"使我的TextView看起來像它的禁用,不能接收click事件。

所有你需要的是設置TextViewclickable="false"。因此,點擊事件將發送到父級佈局,並且仍然可以對觸摸事件做出反應(帶有連鎖效應)。

0

我面臨同樣的問題,所有的XML屬性都不起作用。我不確定是否發生這種情況,因爲我以編程方式膨脹並添加了視圖,但這是我如何解決該問題的方法。

我有一個類擴展LinearLayout,一個TextView和一個ImageView。 在對佈局進行膨脹並獲得視圖之後,我將子視圖分配給一個OnClickListener,按下後執行LineaLayout的onClickListner。

public class MyView extends LinearLayout { 
private OnClickListener clickListener; 
ImageView imageView; 
TextView textView; 

@Override 
public void setOnClickListener(@Nullable OnClickListener l) { 
    super.setOnClickListener(l); 
    clickListener = l; 
} 

void afterViews() { 
    imageView.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      clickListener.onClick(MyView.this); 
      return false; 
     } 
    }); 
    textView.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      clickListener.onClick(MyView.this); 
      return false; 
     } 
    }); 
} 

我也試着重寫OnTouchListener,但後來我的孩子的意見沒有足夠的連鎖反應,這是我需要的。

0

上面的解決方案都沒有爲我分出。比我注意到LinkMovementMethod設置爲TextView在我的LinearLayout裏面。這個類攔截觸摸事件,點擊事件和諸如可點擊的TextView性能,可聚焦迎戰。

0

讓你的父母的LinearLayout的機器人:可點擊=「真」

讓所有的childview的的android:點擊=「假」

下的LinearLayout - 刪除安卓的inputType =「」從TextView的