2012-01-17 2 views
2

Я сделал простое приложение, чтобы проиллюстрировать мою проблему. Краткое описание: Приложение содержит только одно действие. Это корневой вид TableLayout. Последний заполнен элементами TableRow, которые, в свою очередь, завышены от «row.xml». Вот код:RelativeLayout -> match_parent не такой же размер с родительским представлением

TestActivity.java

public class TestActivity extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    LayoutInflater inflater=getLayoutInflater(); 
    TableLayout table=new TableLayout(this); 
    setContentView(table); 
    TableRow row; 
    for(int i=0;i<3;i++){ 
     row=(TableRow)inflater.inflate(R.layout.row, null, true); 
     table.addView(row); 
    } 

    } 
} 

В row.xml TableRow является корневым элементом, то есть ребенок - RelativeLayout. Обратите внимание на свойство RelativeLayout android: layout_width = "match_parent". row.xml:

<?xml version="1.0" encoding="utf-8"?> 
<TableRow xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:background="@drawable/background" 
> 

<RelativeLayout 
    android:id="@+id/announcement_row_relative_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    > 
</RelativeLayout> 

Затем я запустить проект, открытый инструмент hierarchyViewer и осмотрите ширину строк таблицы и соответствующие относительные макеты - я вижу 320 и 0, соответственно. Почему они не одинаковы (320 и 320), если я объявляю «match_parent» в относительной компоновке? Я прикладываю 2 изображения, где вы можете наблюдать ширину элементов самостоятельно.

TableRow width RelativeLayout width

ответ

1

Ваша проблема здесь: row=(TableRow)inflater.inflate(R.layout.row, null, true);

Вы должны надуть строку, как это:

row=(TableRow)inflater.inflate(R.layout.row, table, false); 

Таким образом LayoutParams будет загружаться из файла XML.

+0

Я попытался изменить эту строку на "row = (TableRow) inflater.inflate (R.layout.row, table, false); ", но hierarchyviewer все еще показывал width = 0. Затем я попробовал строку «row = (TableRow) inflater.inflate (R.layout.row, table, true);» и получил ошибку "java.lang.ClassCastException: android.widget.TableLayout не может быть добавлен в android.widget.TableRow " –

+0

Но каковы ваши TableLayout LauoutParams? Я не вижу, где вы их устанавливаете в своем коде. – Cata

+0

Я сделал это по-другому: я удалил тег TableRow из файла XML и подключил RelativeLayout к строке в коде. Когда я это сделал, ширина строки была 320, относительная ширина макета была 317. Это почти нормально, но все еще странно. –

1

Это происходит потому, что ваш RelativeLayout не содержит детей и его метод onMeasure(..) не предоставил требуемую ширину.

+0

Если я добавляю детей, моя относительная ширина макета станет равной самому большому ребенку. Тем не менее, это еще не ширина TableRow. Зачем? Я хочу, чтобы относительный макет соответствовал параметру_parent. –

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