2010-12-27 13 views
7

Nadal jestem trochę noobem Androida, wybacz mi, jeśli to proste i po prostu go nie widzę.Pytanie o układ tekstu na Androida: dwa widoki tekstu, obok siebie, z różnymi układami i ciężarkami

Istnieją dwie części tekstu w widoku, który obejmuje całą szerokość w poziomie, ale jest tylko tak wysoka, jak jedna linia tekstu. Lewa strona musi zawsze być wyświetlana w całości, ale nie powinna zajmować więcej miejsca w poziomie, niż potrzebuje. Prawa strona powinna być popchnięta przez lewą stronę i wypełnić pozostałą część szerokości ekranu. Jeśli tekst po prawej stronie jest mniejszy niż ta szerokość, tekst powinien być wyrównany do prawej strony w poziomie. Jeśli tekst jest większy niż szerokość, powinien przewijać się w poziomie.

Tekst po prawej stronie będzie często aktualizowany i powinien wysunąć się z nowym tekstem, gdy aplikacja go opisze (wyjaśniając TextSwitcher w layoucie).

Próbowałem dwóch różnych stylów układu. W obu sytuacjach mogę przesunąć lewą stronę, aby "przesunąć" układ, prawą stronę, aby przewinąć, ale nie mogę wymyślić, jak ustawić prawą stronę, aby wyrównać. Jest zawsze wyrównany do lewej. Oto obraz pokazujący, co się dzieje ...

http://img10.imageshack.us/img10/5599/androidlayout.png

Dodatkowo (ale mniej ważne), w moim kodu układu mam android: fadingEdge = „none” w TextView, ale nadal ma wyblakły brzeg po lewej i prawej stronie, gdy przewija. Dlaczego?

Oto dwa utworzone przeze mnie układy, które dają przedstawione wyniki, ale nie wyniki, które chcę.

Korzystanie poziomą LinearLayout ...

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/LinearLayoutStatusBar" 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="2px" 
    android:background="#555555" 
> 
    <TextView 
     android:id="@+id/TextViewTimer" 
     android:textSize="18px" 
     android:textColor="#FFFFFF" 
     android:layout_gravity="left" 
     android:layout_weight="0" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="0px" 
     android:layout_marginRight="3px" 
     android:text="Left Side" 
    > 
    </TextView> 
    <TextSwitcher 
     android:id="@+id/TextSwitcherDetails" 
     android:inAnimation="@anim/push_up_in" 
     android:outAnimation="@anim/push_up_out" 
     android:layout_weight="1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="right" 
     android:layout_marginLeft="3px" 
     android:layout_marginRight="0px" 
    > 
     <TextView 
      android:id="@+id/TextViewDetails1" 
      android:textSize="18px" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_gravity="right" 
      android:singleLine="true" 
      android:ellipsize="marquee" 
      android:marqueeRepeatLimit="marquee_forever" 
      android:scrollHorizontally="true" 
      android:focusable="true" 
      android:focusableInTouchMode="true" 
      android:fadingEdge="none" 
      android:text="Right Side 1" 
     > 
     </TextView> 
     <TextView 
      android:id="@+id/TextViewDetails2" 
      android:textSize="18px" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_gravity="right" 
      android:singleLine="true" 
      android:ellipsize="marquee" 
      android:marqueeRepeatLimit="marquee_forever" 
      android:scrollHorizontally="true" 
      android:focusable="true" 
      android:focusableInTouchMode="true" 
      android:fadingEdge="none" 
      android:text="Right Side 2 - This is a really long text this is long and fun and fun and long" 
     > 
     </TextView> 
    </TextSwitcher> 
</LinearLayout> 

Więc jak mogę dostać ten tekst po prawej stronie prawym wyrównać. Dzięki!


EDIT:

znalazłem problem ... Było kilka rzeczy źle. Najpierw odkryłem różnicę między grawitacją a grawitacją układu. Do wyrównania tekstu potrzebowałem użyć grawitacji.

nie mogę dodać więcej linków, więc skopiować i wkleić link poniżej

thinkandroid.wordpress.com/2010/01/14/how-to-position-views-properly-in-layouts/

Jednak to nie dało mi dokładnie takiego układu, jakiego potrzebowałem, ponieważ długie wiersze tekstu będą wyrównane do prawej strony przed przewinięciem, a przednia część wiadomości nie będzie czytana, dopóki nie zacznie się pętać. To, co musiałem zrobić, to użyć trzech "kolumn" widoków, z wagą na środkowym (pustym) widoku jako "1", podczas gdy pozostałe "0", tak aby przesunąć najbardziej prawy tekst w miarę możliwości do w prawo, jednocześnie zachowując wyrównanie do lewej.

Następnie odkryłem, że szerokość TextSwitchera jest taka sama jak największego podrzędnego TextView. Jest to problem podczas przełączania z długiej linii do krótkiej linii za pomocą metody setText(), ponieważ środkowa kolumna nie przesunie małego tekstu do krawędzi. Rozwiązaniem jest użycie dwóch setText() s. Jeden, który powoduje animację zaniku, a następnie uruchamia program po animacji, aby ustawić tekst ponownie, aby spowodować animację nowego wejścia.

Teraz moim jedynym problemem jest to, że gdy animacja znika w długim wierszu tekstu, jeśli jest w połowie zwoju, resetuje się do pozycji X = 0 przed zniknięciem, więc efekt jest taki, że przewija, przeskakuje do pozycji początkowej, a następnie zanika. Ktoś wie, jak to naprawić?

(usunąłem kod RelativeLayout powyżej ponieważ to było błędne, ponieważ ten post jest naprawdę długa.)

Oto kod układ roboczy ...

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/LinearLayoutStatusBar" 
    android:orientation="horizontal" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_margin="2px" 
    android:background="#333333" 
> 
    <TextView 
     android:id="@+id/TextViewTimer" 
     android:textSize="18px" 
     android:textColor="#FFFFFF" 
     android:layout_gravity="top" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="0" 
     android:layout_marginLeft="1px" 
     android:layout_marginRight="4px" 
     android:text="Left Side" 
    > 
    </TextView> 
    <View 
     android:id="@+id/ViewSpacer" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
    ></View> 
    <TextSwitcher 
     android:id="@+id/TextSwitcherDetails" 
     android:inAnimation="@anim/push_up_in" 
     android:outAnimation="@anim/push_up_out" 
     android:layout_gravity="top" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="0" 
     android:layout_marginRight="1px" 
    > 
     <TextView 
      android:id="@+id/TextViewDetails1" 
      android:textSize="18px" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:singleLine="true" 
      android:ellipsize="marquee" 
      android:marqueeRepeatLimit="marquee_forever" 
      android:scrollHorizontally="true" 
      android:focusable="true" 
      android:focusableInTouchMode="true" 
      android:fadingEdge="none" 
     > 
     </TextView> 
     <TextView 
      android:id="@+id/TextViewDetails2" 
      android:textSize="18px" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:singleLine="true" 
      android:ellipsize="marquee" 
      android:marqueeRepeatLimit="marquee_forever" 
      android:scrollHorizontally="true" 
      android:focusable="true" 
      android:focusableInTouchMode="true" 
      android:fadingEdge="none" 
     > 
     </TextView> 
    </TextSwitcher> 
</LinearLayout> 
+0

Miałem podobny problem dotyczący sposobu, w jaki umieszczam widok na najbardziej prawej części układu. Twoja sugestia wprowadzenia trzech "kolumn" była trafna! –

Odpowiedz

4

znalazłem problem! Było kilka błędów. Najpierw odkryłem różnicę między grawitacją a grawitacją układu. Do wyrównania tekstu potrzebowałem użyć grawitacji.

http://thinkandroid.wordpress.com/2010/01/14/how-to-position-views-properly-in-layouts/

jednak, że nie daje mi dokładnie układ chciałem, bo długie wiersze tekstu będzie wyrównany do prawej strony przed przewijanie i przednia część wiadomości nie mogą być odczytywane aż opasuje. To, co musiałem zrobić, to użyć trzech "kolumn" widoków, z wagą na środkowym (pustym) widoku jako "1", podczas gdy pozostałe "0", tak aby przesunąć najbardziej prawy tekst w miarę możliwości do w prawo, jednocześnie zachowując wyrównanie do lewej.

Następnie odkryłem, że szerokość TextSwitchera jest taka sama jak największego podrzędnego TextView. Jest to problem podczas przełączania z długiej linii do krótkiej linii za pomocą metody setText(), ponieważ środkowa kolumna nie przesunie małego tekstu do krawędzi. Rozwiązaniem jest użycie dwóch setText() s. Jeden, który powoduje animację zaniku, a następnie uruchamia program po animacji, aby ustawić tekst ponownie, aby spowodować animację nowego wejścia.

Niestety przewijanie tekstu w poziomie wygląda okropnie, gdy tekst zmienia się co pięć do dziesięciu sekund. Więc po prostu pozwalam jej uciekać z ekranu.

Powiązane problemy