2013-07-28 4 views
1

В моем приложении я пытаюсь имитировать вид разговора приложения 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"/> 

Любая помощь приветствуется.

Спасибо!

+1

LinearLayout с вертикальной ориентацией, завернутый в ScrollView, послужит вам лучшим для этого. – Vikram

+0

Возможно, вам лучше использовать ListView с двумя разными макетами строк (один для отправленных, один для полученных). – Karakuri

+0

Спасибо за комментарий @Karakuri, но, как отметил @vikram, я думаю, что самый простой способ (именно это я и сделал) - это «LinearLayout» с детьми «TextView», для которых свойство «gravity» установлено на «LEFT» или 'RIGHT' в зависимости от того, было ли отправлено или получено сообщение. –

ответ

1

Из чего я могу видеть, что вы не устанавливаете IDs для TextViews, который вы добавляете. Так что, когда вы звоните:

params.addRule(BELOW, getChildAt(getChildCount() - 1).getId()); 

getId() возвращается NO_ID.

От документации по View класс: getId() returns a positive integer used to identify the view or NO_ID if the view has no ID.

NO_ID is used to mark a View that has no ID.

Попробуйте установить идентификаторы в свои текстовые объекты, используя setId(yourGivenId) или setId(View.generateViewId()) и посмотрите, помогает ли это решить проблему.

+0

Спасибо! Я не понял, что идентификаторы не установлены автоматически. Я работаю над API-версией 14, которая не имеет статического метода «View.generateViewId()», но я смог добиться того же результата, просто добавив счетчик в качестве части моего класса. –

Смежные вопросы