2017-02-14 2 views
7

У меня есть простой вид:андроид поля не работает, когда динамически вставляя просмотры

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@drawable/contact_selected" 
    android:layout_marginTop="10dp" 
    android:layout_marginEnd="5dp" 
    android:orientation="horizontal" 
    android:padding="3dp"> 
    <TextView 
     android:id="@+id/txt_title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Billy Bob" 
     /> 
</LinearLayout> 

Когда я статический скопировать код LinearLayout в мой основной макет деятельности, поля, как ожидалось. Однако, когда я добавляю представление в основной макет активности динамически, поля игнорируются. Вот как я ввожу вид

LayoutInflater inflater = (LayoutInflater) 
     getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View view = inflater.inflate(R.layout.test, null); 
TextView txt_title = (TextView)view.findViewById(R.id.txt_title); 
txt_title.setText("DynamiC#1"); 
llayout.addView(view, llayout.getChildCount()-1); 

View view2 = inflater.inflate(R.layout.test, null); 
txt_title = (TextView)view2.findViewById(R.id.txt_title); 
txt_title.setText("DynamiC#2"); 
llayout.addView(view2, llayout.getChildCount()-1); 

Вот как это выглядит:

enter image description here

Контейнер в основной раскладке является LinearLayout, который является дочерним по отношению к HorizontalScrollView. Любое понимание очень ценится.

ответ

14

При динамическом добавлении просмотров вы не должны надувать View с родительским домом . Итак, другими словами, вы должны использовать inflater.inflate(R.layout.test, linearLayout, false);. Родитель используется для определения того, какие типы параметров макета должны генерироваться. Передайте свой родительский контейнер (в данном случае ваш линейный макет), чтобы он правильно создавал ViewGroup.MarginLayoutParams из вашего XML.

+0

Спасибо, это чистое решение, и это мой предпочтительный способ сделать это. Обратите внимание, что если кто-то еще изучает этот материал, то, поскольку inflate (view, parent) раздувает представление INTO родителя (добавляется как последний ребенок), строка в моем тестовом коде, где я добавляю представление (т.е. llayout.addView()), вызывает ошибка, потому что представление уже вставлено. В моем случае мне нужно сохранить фиксированный вид в качестве последнего ребенка и вставить новых детей перед ним. Поэтому я удаляю свой последний вид перед инфляцией() и добавляю его обратно после раздувания(). Работает как шарм. –

+0

@JohnWard на самом деле вам по-прежнему нужен addView, если вы используете «inflater.inflate (R.layout.test, linearLayout, false)» с этим последним булевым параметром. – Flyview

2

Это происходит потому, что вам нужно дать «Margin» в макеты динамически. Вы можете сделать это путем создания объекта "LayoutPrams", как это: -

LinearLayout ll = new LinearLayout(this); 
ll.setOrientation(LinearLayout.VERTICAL); 

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
layoutParams.setMargins(30, 20, 30, 0); 

Здесь вы можете установить LayoutParams к LinearLayout:

ll.addView(okButton, layoutParams); 

Надеется, что это помогает.

+0

Спасибо. Еще одна загадка Android решена! –

+0

Извините, но я меняю одобренный ответ на предложение, предлагаемое Submersed. Ваш ответ был полезен и научил меня чему-то, чего я не знал, но его ответ чище и не заставляет меня скучать по полям. Еще раз спасибо. –

+0

Благодарим за отзыв John. –

0

Во-первых, вы должны получить плотность отображения. Связанные документы: https://developer.android.com/reference/android/util/DisplayMetrics.html

и получить идентификатор, который вы хотите задать с учетом поля. для моего случая,

layout_login_box = (ConstraintLayout)findViewById(R.id.login_layout_box); 

float density = getResources().getDisplayMetrics().density; 

ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams)layout_login_box.getLayoutParams(); 
params.setMargins((int) (24 * density),0,(int) (24 * density),(int) (16 * density)); 
layout_login_box.setLayoutParams(params); 

Кроме того, вы можете изменить ConstraintLayout на ваш взгляд.

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