2015-10-10 4 views
1

На странице моего приложения есть страница макета таблицы, и одна строка, похоже, не работает. Моя цель - равномерно разделить страницу между левой ячейкой и правой ячейкой. Левая ячейка содержит строку, правую ячейку - изображение и строку. Я попытался сделать это, используя weightSum. Левая ячейка получила вес 4/8, а правая ячейка была помещена в линейную компоновку, в которой изображение получило вес 1/8, а строка получила вес 3/8. Однако в макете левая ячейка занимает большую часть строки, около 75%, и я не уверен, почему.Размер макета Android не суммируется должным образом

Мои ряды ниже этой попытки почти то же самое, но не имеют такой же проблемы.

Мой XML (сократить для релевантности):

<TableRow 
    android:layout_width="match_parent"> 
    <TextView 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="Class" 
     android:id="@+id/classTextView" 
     android:layout_marginTop="14dp" 
     android:layout_weight="1" 
     android:gravity="center"/> 

    <LinearLayout> 
     <View 
      android:layout_width="4dp" 
      android:gravity="left" 
      android:layout_height="match_parent" 
      android:background="#663300"/> 

     <ImageView 
      tools:ignore="ContentDescription" 
      android:id="@+id/classicon" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:adjustViewBounds="true" 
      android:src="@drawable/barbarianicon50" 
      android:layout_gravity="end" 
      android:layout_weight="1"/> 
     <TextView 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:textAppearance="?android:attr/textAppearanceLarge" 
      android:text="Class Value" 
      android:id="@+id/classValueView" 
      android:layout_marginTop="14dp" 
      android:layout_weight="3" 
      android:gravity="left"/> 
    </LinearLayout> 
</TableRow> 

<View 
    android:layout_width="match_parent" 
    android:layout_height="4dp" 
    android:background="#663300"/> 




<TableRow android:layout_width="match_parent"> 
    <TextView 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:text="Strength" 
     android:id="@+id/strengthTextView" 
     android:layout_marginTop="20dp" 
     android:layout_weight="4" 
     android:gravity="center" /> 

    <LinearLayout> 
     <View 
      android:layout_width="4dp" 
      android:gravity="left" 
      android:layout_weight="0" 
      android:layout_height="match_parent" 
      android:background="#663300"/> 
     <TextView 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:textAppearance="?android:attr/textAppearanceMedium" 
      android:text="Strength Value" 
      android:id="@+id/strengthValView" 
      android:layout_marginTop="20dp" 
      android:layout_weight="4" 
      android:gravity="center" /> 
    </LinearLayout> 

    <TextView 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:text="Intelligence" 
     android:id="@+id/intelligenceTextView" 
     android:layout_marginTop="20dp" 
     android:layout_weight="4" 
     android:gravity="center" /> 

    <LinearLayout> 
     <View 
      android:layout_width="4dp" 
      android:gravity="left" 
      android:layout_weight="0" 
      android:layout_height="match_parent" 
      android:background="#663300"/> 
     <TextView 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:textAppearance="?android:attr/textAppearanceMedium" 
      android:text="Intelligence Value" 
      android:id="@+id/intelligenceValView" 
      android:layout_marginTop="20dp" 
      android:layout_weight="4" 
      android:gravity="center" /> 
    </LinearLayout> 
</TableRow> 

Первая строка таблицы является проблематичным один - она ​​должна быть равномерно распределена между левой и правой клеток, но в основном в направлении вправо.

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

Я не могу понять, почему первое не работает. Я ценю любую помощь!

+0

'Я попытался сделать это с помощью weightSum' Я не вижу weightSum в предоставленном xml? – Xiao

+0

WeightSum превысил этот код. Мое плохое, я должен был опубликовать это также. Я определил его как android: weightSum = "8" EDIT: для ясности это использует weightSum. – WarSame

ответ

0

У меня наконец-то удалось установить макет!

Используемый метод был <include /> другой макет как элемент строки внутри этого. Все эти элементы строки имели одинаковые данные, поэтому я программно заполнял элементы строки необходимыми данными всякий раз, когда вид менялся. Вы также можете сделать это как ListView, причем каждая строка в ListView является другой парой элементов, но я не уверен, насколько хорошо это работает для 4-х элементов широких рядов.

XML-каждой строки:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="horizontal" android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:weightSum="2"> 


<TextView 
    android:layout_width="0dp" 
    android:layout_weight="1" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:text="@string/statNameString" 
    android:id="@+id/statName" 
    android:layout_marginTop="30dp" 
    android:gravity="center" /> 

<View 
    android:layout_width="4dp" 
    android:gravity="left" 
    android:layout_height="match_parent" 
    android:background="#663300"/> 
<TextView 
    android:layout_width="0dp" 
    android:layout_weight="1" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:text="@string/statValString" 
    android:id="@+id/statVal" 
    android:layout_marginTop="30dp" 
    android:gravity="center" /> 

</LinearLayout> 

В верхнем ряду (который представлял класс персонажа в мое приложение), необходимый, чтобы включать ImageView, поэтому он был немного измененный макет. ImageView был помещен после просмотра панели и до последнего TextView.

XML, в том числе каждой строки в окончательный макет, для макета Land:

<TableRow 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <include 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     layout="@layout/horizontal_class_row_layout" 
     android:id="@+id/strValues" 
     android:layout_column="0" /> 

    <include 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     layout="@layout/horizontal_class_row_layout" 
     android:id="@+id/intValues" 
     android:layout_column="0" /> 
</TableRow> 

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

Наконец, вы программно заполнить элементы с их данными в Java, так что они не просто говорят «класс» и «класс Значение» или какие-либо данные по умолчанию:

private void fillViewValues() { 
    //Gather views 
    LinearLayout llClass = (LinearLayout)findViewById(R.id.classValues); 
    LinearLayout llStr = (LinearLayout)findViewById(R.id.strValues); 
    LinearLayout llDex = (LinearLayout)findViewById(R.id.dexValues); 
    LinearLayout llCon = (LinearLayout)findViewById(R.id.conValues); 
    LinearLayout llInt = (LinearLayout)findViewById(R.id.intValues); 
    LinearLayout llWis = (LinearLayout)findViewById(R.id.wisValues); 
    LinearLayout llCha = (LinearLayout)findViewById(R.id.chaValues); 

    //Get the layout's locations 
    TextView classNameView = (TextView) llClass.findViewById(R.id.statName); 
    TextView classValView = (TextView) llClass.findViewById(R.id.statVal); 
    ImageView classImage = (ImageView) llClass.findViewById(R.id.classicon); 

    TextView strNameView = (TextView) llStr.findViewById(R.id.statName); 
    TextView strValView = (TextView) llStr.findViewById(R.id.statVal); 

    TextView dexNameView = (TextView) llDex.findViewById(R.id.statName); 
    TextView dexValView = (TextView) llDex.findViewById(R.id.statVal); 

    TextView conNameView = (TextView) llCon.findViewById(R.id.statName); 
    TextView conValView = (TextView) llCon.findViewById(R.id.statVal); 

    TextView intNameView = (TextView) llInt.findViewById(R.id.statName); 
    TextView intValView = (TextView) llInt.findViewById(R.id.statVal); 

    TextView wisNameView = (TextView) llWis.findViewById(R.id.statName); 
    TextView wisValView = (TextView) llWis.findViewById(R.id.statVal); 

    TextView chaNameView = (TextView) llCha.findViewById(R.id.statName); 
    TextView chaValView = (TextView) llCha.findViewById(R.id.statVal); 

    //Fill those values 
    //Names of sections 
    classNameView.setText(getResources().getString(R.string.classString)); 
    strNameView.setText(getResources().getString(R.string.strString)); 
    dexNameView.setText(getResources().getString(R.string.dexString)); 
    conNameView.setText(getResources().getString(R.string.conString)); 
    intNameView.setText(getResources().getString(R.string.intString)); 
    wisNameView.setText(getResources().getString(R.string.wisString)); 
    chaNameView.setText(getResources().getString(R.string.chaString)); 

    //Values 
    classValView.setText(classString); 
    setImage(classImage, classString); 
    strValView.setText(String.format("%d", finalStats[0])); 
    dexValView.setText(String.format("%d", finalStats[1])); 
    conValView.setText(String.format("%d", finalStats[2])); 
    intValView.setText(String.format("%d", finalStats[3])); 
    wisValView.setText(String.format("%d", finalStats[4])); 
    chaValView.setText(String.format("%d", finalStats[5])); 
} 

Это следует за советом в at this StackOverflow post.

Одна вещь, которую я хотел бы отметить, заключается в том, что при изменении макета вам необходимо сбросить вид содержимого до вашего текущего макета. В моем случае функция выглядела так:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) 
    { 
     setContentView(R.layout.activity_see_character); 
     fillViewValues(); 
    }else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) 
    { 
     setContentView(R.layout.activity_see_character); 
     fillViewValues(); 
    } 
} 

где fillViewValues ​​() является предыдущей функцией.Я считаю, что это устанавливает макет либо в портретную, либо в альбомную версию макета, который затем может иметь доступ к своим элементам. Если вы не делаете этого, когда пытаетесь получить доступ к элементам, они не могут найти их и выдают исключение NullPointerException.