2013-01-31 2 views
0

У меня возникают некоторые проблемы с интервалом при создании части пользовательского интерфейса программным способом в Android 4.0. Я пытаюсь добавить стилизованные кнопки в стилизованный LinearLayout. Чтобы расставить кнопки одинаково, каждый из которых обернут в LinearLayout с весом 1. Я начал с макетом, определенным в XML (несколько из доказательства концепции,), который делает, как я ожидал:Программно добавлен LinearLayouts, неравномерно распределенный

<LinearLayout android:id="@+id/dialog_footer" 
     android:layout_width="500dp" 
     android:layout_height="wrap_content" 
     android:background="@drawable/dialog_footer"> 

    <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:orientation="horizontal" 
      android:gravity="center"> 
     <Button android:id="@+id/cancel" 
      style="@style/Button" 
      android:layout_width="130dp" 
      android:layout_height="38dp" 
      android:text="Cancel" /> 
    </LinearLayout> 

    <!-- Another LinearLayout with a nested Button like the one above --> 

</LinearLayout> 

К добавьте кнопки программно, я удалил внутренние LinearLayouts и поместил их в свой собственный файл макета, который я могу раздуть и добавить к внешнему LinearLayout в Java. Он почти идентичен.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:orientation="horizontal" 
     android:gravity="center" > 
    <Button android:id="@+id/button" 
      style="@style/Button" 
      android:layout_width="130dp" 
      android:layout_height="38dp" /> 
</LinearLayout> 

И это примерно, как я добавляю кнопки в коде:

LinearLayout dialogFooter = (LinearLayout)dialogView.findViewById(R.id.dialog_footer); 
LinearLayout wrappedButton = (LinearLayout)getLayoutInflater().inflate(R.layout.dialog_button_wrapped, null); 

Button button = (Button)wrappedButton.findViewById(R.id.button); 
button.setText(R.string.button_one_text); 

// button.setOnClickListener(...); 

dialogFooter.addView(wrappedButton); 

кнопки появляются, но теперь они сгруппированы вместе и сдвинута влево. Есть ли что-то, что делает Android, когда он анализирует макет, который мне нужно будет делать сам, если я добавлю в dialog_footer? Поскольку весы вступают в игру здесь, я думал, что вызов setWeightSum() в контейнере, который я добавляю (dialog_footer), может оказаться необходимым, но это не помогло. Есть ли у кого-нибудь идеи, что может вызвать разницу между подходами XML и Java?

+0

попробуйте распечатать координаты и посмотреть, совпадают ли они с фактическим размещением – Jeeter

ответ

-2

Я считаю, что это ваша проблема:

LinearLayout wrappedButton = (LinearLayout)getLayoutInflater().inflate(R.layout.dialog_button_wrapped, null); 

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

Другое дело в отношении веса, который вы задали - вы должны установить ширину/высоту в 0px, чтобы вес не приводил к тому, что процесс компоновки работал в странном/неэффективном режиме.

BTW, вы можете удалить внутренний макет (который имеет кнопку) и использовать только одну кнопку. просто установите layout_gravity там center_horizontal.

+0

Хороший улов. Предоставление родителя при раздувании (и не добавлении его к родительскому лицу позже) было именно тем, что я хотел. Сейчас у меня есть некоторые другие макеты, но это сработало. Однако я не уверен в последней рекомендации. Если я удалю внутренний LinearLayout, center_horizontal будет центрировать их горизонтально (оставив их по вертикали), но кнопки все равно будут сдвинуты вместе в центре их родителя (что было внешним LinearLayout.) Идея внутреннего LinearLayouts состоит в том, что они делят всю ширину родителя, а затем кнопки в центре. Я не понимаю? – spaaarky21

+0

все в порядке, только вы знаете, что хотите. я только догадываюсь, что можно сделать. возможно, я ошибаюсь. это было всего лишь предложение. в общем, вы должны стараться избегать добавления макетов, в которых есть один элемент. чем больше макетов, тем больше времени требуется для раздувания и измерения. возможно, Lint может помочь вам с хорошими подсказками вашего кода (вы запустите его, нажав кнопку «V» на верхней панели инструментов eclipse, рядом с кнопкой менеджера sdk). –

+0

Я не соглашался с вашей рекомендацией относительно внутреннего LinearLayout - просто пытаясь понять это. К моим (по общему признанию, небольшому) знанию, удалению внутренних макетов и настройке силы тяжести внешнего макета на центральную горизонтальную область не будет выделяться вложенные кнопки - она ​​будет просто центрировать их по горизонтали, не так ли? Я не был уверен, что я что-то упустил. – spaaarky21

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