Вопрос по разметке текста в Android: два вида текста, расположенные рядом, с разным выравниванием и весом - PullRequest
7 голосов
/ 27 декабря 2010

Я все еще немного новичок в Android, простите, если это просто, и я просто не вижу этого.

В представлении есть две части текста, которые занимают всю ширину по горизонтали, но достигают только одной строки текста. Левая сторона всегда должна отображаться полностью, но должна занимать не больше горизонтального пространства, чем нужно. Правую сторону следует оттолкнуть левой стороной и заполнить оставшуюся часть ширины экрана. Если текст на правой стороне меньше этой ширины, текст должен быть выровнен по горизонтали. Если текст больше ширины, он должен прокручиваться горизонтально.

Текст на правой стороне будет часто обновляться и должен появляться вместе с новым текстом, когда приложение сообщает об этом (объясняя TextSwitcher в макете).

Я пробовал два разных стиля макета. В обеих ситуациях я могу заставить левую сторону «протолкнуть» макет, правую - прокрутить, но я не могу понять, как выровнять правую сторону по правому краю. Он всегда выровнен по левому краю. Вот картинка, показывающая, что происходит ...

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

Кроме того (но менее важно), в моем коде макета у меня есть android: fadingEdge = "none" в TextViews, но он все еще имеет заштрихованный край с левой и правой стороны при прокрутке. Почему это?

Вот два макета, которые я создал, которые дают показанные результаты, но не результаты, которые я хочу.

Использование горизонтального 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>

Итак, как мне получить этот текст с правой стороны для выравнивания по правому краю? Спасибо!


РЕДАКТИРОВАТЬ:

Я нашел проблему ... Было несколько неправильных вещей. Сначала я обнаружил разницу между гравитацией и layout_gravity. Мне нужно было использовать гравитацию, чтобы выровнять текст по правому краю.

Я не могу добавить больше ссылок, поэтому скопируйте и вставьте ссылку ниже

thinkandroid.wordpress.com / 2010/01/14 / как к позиционно-видовые правильно-в-раскладок /

Однако это не дало мне того макета, который я хотел, потому что длинные строки текста будут выровнены по правому краю перед прокруткой, и передняя часть сообщения не может быть прочитана, пока оно не зациклится. Мне нужно было использовать три «столбца» представлений, с весом в среднем (пустом) представлении, равным «1», в то время как остальные «0», чтобы он выталкивал самый правый текст как можно дальше к вправо, сохраняя выравнивание по левому краю.

Затем я обнаружил, что ширина TextSwitcher такая же, как у самого большого дочернего TextView. Это проблема при переключении с длинной строки на короткую строку с помощью setText (), потому что средний столбец не будет толкать маленький текст к краю. Решением является использование двух setText (). Один из них вызывает анимацию затухания, затем нажимает runnable для запуска после анимации, чтобы снова установить текст, чтобы вызвать анимацию постепенного появления новой строки.

Теперь моя единственная проблема заключается в том, что когда анимация затухания выполняется на длинной строке текста, если она находится в середине прокрутки, она сбрасывается в положение X = 0 до исчезновения, поэтому эффект заключается в том, что он прокручивается, переходит в исходное положение, затем исчезает. Кто-нибудь знает, как это исправить?

(я удалил приведенный выше код RelativeLayout, поскольку это было неправильно, так как этот пост очень длинный.)

Вот код рабочего макета ...

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

1 Ответ

4 голосов
/ 27 декабря 2010

Я нашел проблему! Там было несколько вещей не так. Сначала я обнаружил разницу между гравитацией и layout_gravity. Мне нужно было использовать гравитацию, чтобы выровнять текст по правому краю.

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

Однако это не дало мне того макета, который я хотел, потому что длинные строки текста будут выровнены по правому краю перед прокруткой, и передняя часть сообщения не может быть прочитана, пока оно не зациклится. Мне нужно было использовать три «столбца» представлений, с весом в среднем (пустом) представлении, равным «1», в то время как остальные «0», чтобы он выталкивал самый правый текст как можно дальше к вправо, сохраняя выравнивание по левому краю.

Затем я обнаружил, что ширина TextSwitcher такая же, как у самого большого дочернего TextView. Это проблема при переключении с длинной строки на короткую строку с помощью setText (), потому что средний столбец не будет толкать маленький текст к краю. Решением является использование двух setText (). Один, чтобы вызвать анимацию постепенного исчезновения, затем нажмите runnable для запуска после анимации, чтобы снова установить текст, чтобы вызвать анимацию постепенного появления новой строки.

К сожалению, горизонтальная прокрутка текста выглядит ужасно, когда текст переключается каждые пять-десять секунд. Так что я просто позволю ему убежать с экрана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...