2011-07-20 10 views
36

Mam niestandardowy LinearLayout z mniejszym dzieckiem TextView. Chciałbym móc kliknąć obszar nieobjęty przez TextView, więc ustawiłem clickable = true i onclicklistener na LinearLayout, ale onClick nie jest uruchamiany. Jeśli ustawię detektor onclick na TextView działa zgodnie z oczekiwaniami ...onClick nie został wyzwolony w LinearLayout z dzieckiem

Ktoś może pomóc?

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> 

Mam zwyczaj 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

mam dokładnie ten sam problem, znaleźliście rozwiązanie? – longhairedsi

Odpowiedz

46

dla każdego dziecka

android: duplicateParentState = „true”

+1

Dzięki za rozwiązanie tego problemu rozwiązałem podobny problem polegający na tym, że mam wiele kontrolek, które chcę wyrazić "klikniętym" stanem wizualnym, a jednocześnie muszę obsługiwać wydarzenie w rodzicu. – Rollie

+0

Chociaż nadal widzę jeden bardzo dziwny problem - gdy klikam = true, width/height = wrap/match, to działa, ale jeśli umieściłem je w stylu i użyłem tego stylu, to nie ma (nie wizualne) "kliknięty" stan, nie uruchomiono obsługi). To jest na 2.3; Jakiś pomysł, dlaczego tak się dzieje? – Rollie

+1

Dzięki za to! Rozwiązałem problem, który miałem dzisiaj z zagnieżdżonym wyborem układu liniowego. –

1

Twój wysokość TextView obejmuje cały rodzica (cały układ), więc można klikając na pustej przestrzeni, ale nie na układ. Spróbuj użyć wrap_content dla Androida: layout_height dla twojego TextView. Ustaw także detektor kliknięć dla układu.

+0

Szerokość TextView jest mniejsza niż jego rodziców, więc powinien pozostać klikalny obszar po prawej stronie Linearlayout. – jul

2

Nie używasz niestandardowego widoku; używasz standardowego LinearLayout. Tag XML powinny być:

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

@jul Czy próbowałeś już tego? – cdhabecker

0

Problem może być z TextView który ma android:layout_height="fill_parent" w swoim układzie. Jeśli to nie rozwiąże problemu, przyczyną może być zdarzenie onClick(). Układ liniowy może nigdy nie wywoływać metody onClick(), ponieważ jest to układ. Spróbuj zastąpić detektor zdarzeń onTouch().

1

Jedną rzeczą, aby upewnić się, że inny pogląd nie znajduje się na górze widoku próbujesz kliknij. Jest to szczególnie powszechne w FrameLayouts (gdzie sub LinearLayout mogą być pokryte) lub z układów Relative mogłeś zapomniał zaktualizować ten wiersz:

android:layout_below="@id/shouldBeTheIdOfTheViewCurrentlyBeingCovered" 

tak że poglądy nie wypełni tej samej przestrzeni.

56

android:duplicateParentState="true" mi nie pomogło.

Aby dokonać klikalne układu z jego dzieci trzeba dodać tę opcję dla każdego dziecka:

android:clickable="false" 

Następnie kliknij obsługa pójdzie się do rodzica.

+1

Dziękuję za tę odpowiedź! – Athos

+1

Dziękuję @ Yurets działa jak magia. to musi być akceptowalna odpowiedź. –

+1

Musi być akceptowalną odpowiedzią! – Moti

14

To nie jest twój przypadek, ale miałem podobny problem z klikalnym ViewGroup.Po godzinie szuka rozwiązania znaleziony, że mogę ustawić android:inputType do TextView wewnątrz mojego ViewGroup który blokował onClick() słuchacza (nie wiem dlaczego)

Nie używaj android:inputType z TextView

+0

dziękuję! Nie mogłem zrozumieć, dlaczego mój tekst przechwytuje kliknięcia. – MrPlow

+2

To był również mój problem, upewnij się, że nie masz inputType lub ustaw go na none! Dzięki za zamieszczenie tego –

+0

Ma mahaan dzięki. – Bolling

1

Jeśli są to: TextView s, może być konieczne ustawienie ich jako focusable="false", tak aby pierwsze kliknięcie nie było używane, koncentrując się na widoku tekstowym.

0

Dodaj następujące atrybuty do Linelayout Zdarzenia Any Click nie obsługiwane przez widoki podrzędne zostaną automatycznie przekazane do LinearLayout.

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

<child/> 
<child/> 

</LinearLayout> 
1

android:duplicateParentState="true" made my TextView wygląda to wyłączone i nie może odbierać zdarzenie click.

Wszystko czego potrzebujesz to zestaw TextViewclickable="false". Tak więc zdarzenie click będzie wysyłane do układu nadrzędnego, a TextView nadal może reagować na zdarzenie dotykowe (z efektem marszczenia).

0

Napotkałem ten sam problem, a wszystkie atrybuty XML nie działały. Nie jestem pewien, czy tak się dzieje, ponieważ programowo nadmuchuję i dodaje widoki, ale tak właśnie pracowałem nad problemem.

Mam klasę, która rozszerza LinearLayout, z TextView i ImageView. Po zawyżeniu układu i uzyskaniu widoków, przypisałem widoki podrzędne OnClickListener, po naciśnięciu uruchamia onClickListner 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; 
     } 
    }); 
} 

Próbowałem też nadrzędnymi OnTouchListener, ale potem moje poglądy dziecka nie mają odzew, co potrzebne.

0

Żadne z powyższych rozwiązań nie rozwidlało się dla mnie. Następnie zauważyłem, że LinkMovementMethod ustawiono na TextView w moim LinearLayout. Podklasa ta przechwytuje dotknąć wydarzenia, kliknij zdarzeń i właściwości TextView takie jak klikalne, aktywowana vs ..

0

Nakręć rodzic LinearLayout za android: klikalne = "true"

aby wszystkie The childview za android: klikalny = "false"

Pod Linearlayout - Usunąć android: InputType = "" z TextView

Powiązane problemy