2011-07-20 37 views
36

Tôi đã có LinearLayout tùy chỉnh với con TextView nhỏ hơn. Tôi muốn có thể nhấp vào khu vực không được bao phủ bởi TextView, vì vậy tôi đặt clickable = true và onclicklistener thành LinearLayout, nhưng onClick không được kích hoạt. Nếu tôi đặt trình nghe onclick trên TextView, nó hoạt động như mong đợi ...onClick không được kích hoạt trên LinearLayout với con

Bất kỳ ai cũng có thể trợ giúp?

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> 

tùy chỉnh của tôi 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

tôi đang gặp vấn đề chính xác cùng, bạn đã tìm thấy một giải pháp? – longhairedsi

Trả lời

46

cho mọi trẻ em

android: duplicateParentState = "true"

+1

Cảm ơn điều này, giải quyết vấn đề tương tự của tôi về việc có nhiều điều khiển mà tôi muốn thể hiện trạng thái trực quan "được nhấp", trong khi chỉ phải xử lý sự kiện trong phụ huynh. – Rollie

+0

Mặc dù tôi vẫn thấy một vấn đề rất lạ - khi tôi có clickable = true, width/height = wrap/match, nó hoạt động, nhưng nếu tôi đặt chúng vào một kiểu và sử dụng kiểu đó, nó không (không trực quan) đã nhấp vào 'trạng thái, không có trình xử lý nào được kích hoạt). Đây là trên 2,3; bất kỳ ý tưởng tại sao có thể xảy ra? – Rollie

+1

Cảm ơn vì điều này! Giải quyết một vấn đề tôi đã có ngày hôm nay với lựa chọn bố trí tuyến tính lồng nhau. –

1

chiều cao TextView của bạn bao gồm cả cha mẹ (bố trí toàn bộ), do đó bạn có thể nhấp vào không gian trống rỗng nhưng không phải trên bố trí. Hãy thử sử dụng wrap_content cho android: layout_height cho TextView của bạn. Đặt trình nghe nhấp chuột cho bố cục.

+0

Chiều rộng của TextView nhỏ hơn bố mẹ của nó, vì vậy sẽ vẫn còn một khu vực có thể nhấp ở bên phải của Linearlayout. – jul

2

Bạn hiện không sử dụng Chế độ xem tùy chỉnh; bạn đang sử dụng LinearLayout chuẩn. Thẻ XML của bạn phải là:

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

@jul Bạn đã thử cái này chưa? – cdhabecker

0

Sự cố có thể là từ chế độ xem văn bản có bố cục android:layout_height="fill_parent". Nếu điều đó không khắc phục được sự cố, sự cố có thể là sự kiện onClick(). Bố trí tuyến tính có thể không bao giờ thực sự gọi onClick() từ bố cục của nó. Thay vào đó, hãy thử ghi đè trình nghe sự kiện onTouch().

1

Một điều chắc chắn được rằng cái nhìn khác không nằm trên quan điểm bạn đang cố gắng nhấn chuột. Điều này đặc biệt phổ biến ở FrameLayouts (nơi phụ LinearLayout của bạn có thể được bảo hiểm) hoặc bằng Bố cục tương đối bạn có thể đã quên để cập nhật dòng này:

android:layout_below="@id/shouldBeTheIdOfTheViewCurrentlyBeingCovered" 

để xem không lấp đầy không gian tương tự.

56

android:duplicateParentState="true" không giúp ích gì cho tôi.

Để làm cho nhấp chuột được bố trí của bạn với con của nó bạn cần thêm tùy chọn này cho mỗi con:

android:clickable="false" 

Sau đó bấm vào xử lý sẽ đi lên để mẹ.

+1

Cảm ơn bạn đã trả lời câu trả lời này! – Athos

+1

Cảm ơn bạn @ Yurets nó hoạt động giống như ma thuật. câu trả lời này phải được chấp nhận –

+1

Phải là câu trả lời có thể chấp nhận được! – Moti

14

Đây không phải là trường hợp của bạn, nhưng tôi gặp sự cố tương tự với số lần nhấp ViewGroup.Sau một giờ tìm kiếm giải pháp một phát hiện ra rằng tôi đặt android:inputType-TextView bên tôi ViewGroup được chặn onClick() nghe (không biết tại sao)

Không sử dụng android:inputType với TextView

+0

cảm ơn bạn! Tôi không thể hiểu tại sao TextView của tôi đã chặn nhấp chuột. – MrPlow

+2

Đây cũng là vấn đề của tôi, đảm bảo bạn không có inputType hoặc đặt nó thành không có gì! Cảm ơn bạn đã đăng bài này –

+0

Ma maanan cảm ơn. – Bolling

1

Nếu số lượt xem được đề cập là TextView s, bạn có thể cần đặt chúng là focusable="false" để lần nhấp đầu tiên không được sử dụng tập trung vào chế độ xem văn bản.

0

Thêm các thuộc tính sau vào linearlayout Bất kỳ sự kiện nhấp nào không được xử lý bởi chế độ xem con sẽ được tự động chuyển sang LinearLayout.

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

<child/> 
<child/> 

</LinearLayout> 
1

Các android:duplicateParentState="true" làm tôi TextView có vẻ như nó là người khuyết tật, và không thể nhận sự kiện nhấp chuột.

Tất cả những gì bạn cần là đặt TextViewclickable="false". Vì vậy, sự kiện nhấp chuột sẽ gửi đến bố cục gốc và TextView vẫn có thể phản ứng với sự kiện chạm (với hiệu ứng gợn sóng).

0

Tôi gặp phải vấn đề tương tự và tất cả các thuộc tính XML không hoạt động. Tôi không chắc chắn nếu điều này xảy ra bởi vì tôi lập trình thổi phồng và thêm các quan điểm, nhưng đây là cách tôi làm việc xung quanh vấn đề.

Tôi có một Lớp mở rộng LinearLayout, với một TextView và một ImageView. Sau khi thổi phồng bố cục và nhận các khung nhìn, tôi đã gán cho con xem một OnClickListener, khi được nhấn, thực thi onClickListner của LineaLayout.

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

Tôi cũng đã cố gắng ghi đè OnTouchListener, nhưng sau đó chế độ xem con tôi không có hiệu ứng gợn sóng, mà tôi cần.

0

Không có giải pháp nào ở trên được phân chia cho tôi. Tôi nhận thấy rằng một số LinkMovementMethod được đặt thành TextView bên trong số LinearLayout của tôi. Lớp này chặn chạm sự kiện, nhấp vào các sự kiện và tính chất của TextView như nhấp được, có thể đặt tiêu vs ..

0

Làm cha mẹ của bạn LinearLayout của android: nhấp được = "true"

Làm cho tất cả các android của childview: có thể click = "false"

Dưới LinearLayout - Hủy bỏ android: inputType = "" từ TextView

Các vấn đề liên quan