В моем приложении я пытаюсь имитировать вид разговора приложения SMS-сообщений, в котором отправленные сообщения выравниваются с левым полем, а полученные сообщения выравниваются вправо. Я использую пользовательский RelativeLayout
для достижения выравнивания влево/вправо, и я динамически добавляю TextView
s во время выполнения, вызывая метод на моем обычном RelativeLayout
.Программно складывать дочерние представления в RelativeLayout
Проблема, с которой я сталкиваюсь, заключается в том, что, когда я добавляю TextView
s, которые следуют за первым, они помещаются один поверх другого (на тех же x, y) вместо того, чтобы быть уложенными в вертикальное положение (увеличение y).
Вот мой код, который добавляет TextView
:
TextView txt = new TextView(mContext);
RelativeLayout.LayoutParams params =
new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
params.addRule(sent ? ALIGN_PARENT_LEFT : ALIGN_PARENT_RIGHT);
// make sure this message is positioned below the last one
if (getChildCount() > 0) {
params.addRule(BELOW, getChildAt(getChildCount() - 1).getId());
}
txt.setLayoutParams(params);
txt.setText(msg);
addView(txt);
Мой заказ RelativeView
определяется таким образом:
<com.foo.bar.ConversationLayout
android:id="@+id/loConvo"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
Любая помощь приветствуется.
Спасибо!
LinearLayout с вертикальной ориентацией, завернутый в ScrollView, послужит вам лучшим для этого. – Vikram
Возможно, вам лучше использовать ListView с двумя разными макетами строк (один для отправленных, один для полученных). – Karakuri
Спасибо за комментарий @Karakuri, но, как отметил @vikram, я думаю, что самый простой способ (именно это я и сделал) - это «LinearLayout» с детьми «TextView», для которых свойство «gravity» установлено на «LEFT» или 'RIGHT' в зависимости от того, было ли отправлено или получено сообщение. –