2013-04-22 14 views
7

Chciałem wiedzieć, czy istnieje selektor dla układów, takich jak rysunki.Selektor systemu Android xml dla układów

Przykład selektora z odkształcalne:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<!-- When selected --> 
<item android:drawable="@drawable/tab_library_clicked" 
     android:state_selected="true" /> 
<!-- When not selected --> 
<item android:drawable="@drawable/tab_library_not_clicked" /> 

Ale czy to możliwe, aby coś takiego (Ten kod poniżej nie działa dla mnie, ale powinno dać wyobrażenie o tym, co ja próbuję wykonać):

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<!-- When selected --> 
<item android:layout="@layout/tab_library_clicked" 
     android:state_selected="true" /> 
<!-- When not selected --> 
<item android:layout="@layout/tab_library_not_clicked" /> 

+0

Jak dokładnie zamierzasz używać takich rzeczy? –

+0

@ Mr.Me Chciałem użyć tego dla TabSpec.setIndicator(). Wypróbowałem pierwszy kod XML, który podłączyłem, ale obrazy nie wypełniały określonej karty, aby wyglądać dobrze. Ale kiedy stworzyłem układ z ImageView i zrobiłem match_parent dla szerokości i wysokości, aby wypełnić kartę, wyglądało to o wiele lepiej, więc zastanawiałem się, czy istnieje sposób na wykonanie drugiego kodu xml, który umieściłem. – JoeyL

Odpowiedz

3

może się mylę, ale jestem prawie pewien, że to nie istnieje.

Najbardziej "wyrafinowany", który możesz zrobić z selektorem w XML prawdopodobnie używa drawable layer list, aby połączyć kilka rysunków na jednym stanie.

Alternatywnie można spróbować użyć zdarzeń touch_down i touch_up, aby programowo wywołać setVisibility() w układach, ale wyobrażam sobie, że wydajność będzie bardzo niska.

+0

lista do rysowania jest bardzo pomocna w takich przypadkach. – Braj

0

Nie ma takiego atrybutu android:layout dla w documentation. Powinno być używane z android:drawable.

+0

Znam to. Pytam, czy istnieje coś, co może wybrać układ na podstawie opcji state_selected, tak jak w przypadku rysunków. – JoeyL

+0

i na to właśnie odpowiedziałem. Mógłbym odpowiedzieć ** Przepraszam, to nie jest możliwe! ** również, ale myślę dać ci jakieś wyjaśnienie, które moim zdaniem nie poszło dobrze w twoim przypadku :) – waqaslam

+0

Nie nie odpowiedziałeś na moje pytanie. Nie pytałem, czy android: layout dla istnieje/działa, wiem o tym, ponieważ nie działało tak, jak powiedziałem w oryginalnym poście. Pytam tylko, czy istnieje coś, co może zasymulować logikę drugiego kodu xml, który napisałem z całym tym xmlem, który ma do zaoferowania. Jeśli "nie jest to możliwe", to daj mi powód, dla którego nie ma takiego atrybutu w xml z Androidem: układ nie może zrobić czegoś takiego, nie tylko dla :). – JoeyL

1

OK, to, czego szukasz, to sposób na przeniesienie stanu rodzica na jego widoki podrzędne. W ten sposób, gdy stan wskaźnika zmienia się (wybrany, nie), zmienia się stan widoku obrazu.

Android ma już atrybut xml dla tego.

android:duplicateParentState="true" 

użyj tego z widokami podrzędnymi w pliku układu i połącz go z selektorem. na przykład:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
android:background="#f00" > 

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_horizontal" 
    android:text="Large Text" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:duplicateParentState="true" 
    /> 

<ImageView 
    android:id="@+id/imageView1" 
    android:duplicateParentState="true" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center_horizontal" 
    android:src="@drawable/selector" /> 

1

Domyślnie mechanizm Selector zapewnia jedynie alternatywy dla własności (takich jak rozciągliwej do wykorzystania itp), w zależności od stanu rzutem za. To nie zastępuje widoków. Funkcjonalność, o którą prosisz, jest niedostępna.

Wybrany stan widoku jest powiązany z jedną z wartości pól *_STATE_SET w klasie View. Połączony stan widoku jest pobierany za pośrednictwem getDrawableState().

Możesz rozszerzyć klasę Widok i użyć tych stanów, aby zrobić coś niestandardowego. Lub, można opracować niestandardowy kontroler układu, który obserwuje zmiany stanu w drzewie widoku i zastępuje widoki podrzędne zgodnie z zasobem xml.

Ale wysiłek nie warto, ponieważ:

  1. Przełącznik/układ struktura widok musi pozostać taka sama podczas interakcji użytkownika z nią. Nie powinieneś zmieniać przycisku w pole wyboru, gdy użytkownik je wybierze, zastępując widoki/układy w ten sposób po prostu mylące z UX.

  2. Wystarczy zmodyfikować wygląd widoku na interakcję użytkownika, który jest już dostarczany przez selektory oparte na losowaniach i kolorach.

Powiązane problemy