Добавить несколько TextView для динамического просмотра
Мне нужно добавить неопределенное количество текстовых изображений в представление, и мне бы очень хотелось, чтобы его можно было автоматически настраивать под экран.
Я попытался добавить горизонтальный LinearLayouts к вертикальному родительскому LinearLayout, но таким образом я могу добавить, может быть, 2 элемента или 3 элемента на строку, но это не имеет этого неупорядоченного эффекта.
Есть ли способ добиться этого?
2 ответа
Я предлагаю не создавать динамически горизонтальный макет (если вы это делаете).
вместо этого вы можете создать ресурс горизонтального макета следующим образом:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:weightSum="2">
<TextView
android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:layout_weight="1"
android:text="ONE" />
<TextView
android:id="@+id/end"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="end"
android:text="TWO" />
</LinearLayout>
А потом в своей основной деятельности сделайте так:
for(i in 0..2) {
val view: View?
val inflater =
this.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
view = inflater.inflate(R.layout.horizontal, null)
val textOne = view.findViewById<TextView>(R.id.start)
textOne.text = "TEST $i"
val textTwo = view.findViewById<TextView>(R.id.start)
textTwo.text = "TEST $i"
(mainL as LinearLayout).addView(view)
}
Где mainL - это основной вертикальный макет, к которому вы можете добавить отступы или изменить горизонтальный, это зависит от того, чего вы хотите достичь.
В этом примере я использовал цикл for, чтобы показать вам, что создаются 3 строки, в каждом цикле, если у вас есть список текста для ввода, вы можете использовать этот синтаксис для цикла
for ((index, value) in names.withIndex()) {
println("$index: $value")
}
ссылка: https://kotlinlang.org/docs/tutorials/kotlin-for-py/loops.html
Для вашего конкретного случая я предлагаю иметь основной макет с начальным и конечным отступом, а также с горизонтальным верхним и нижним полями макета для создания пространства между элементами.
Если вы хотите использовать LinearLayouts, вы можете зайти в свой xml и добавить только Vertical LinearLayout.
После этого вы можете добавить Horizontal LinearLayouts для своих строк, в которые вы добавите ячейки, TextViews в вашем случае.
В "OnCreate" я получаю только представления и вызываю методы, используемые для добавления строк и ячеек в указанную строку.
public class MainActivity extends AppCompatActivity {
/**
* @verticalLayout
* Contains the rows of your String matrix
*/
LinearLayout verticalLayout;
/**
* @rowCellDivisor
* Contains the horizontal layout of each row
*/
LinkedList<LinearLayout> rows;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
verticalLayout = findViewById(R.id.verticalLayout);
addRow();
addRow();
addRow();
addRow();
addTextViewToRow(0);
addTextViewToRow(0);
addTextViewToRow(0);
addTextViewToRow(1);
addTextViewToRow(1);
addTextViewToRow(2);
addTextViewToRow(2);
addTextViewToRow(2);
addTextViewToRow(2);
addTextViewToRow(2);
}
Там мы создаем строку, которая представляет собой не что иное, как LinearLayout с горизонтальной ориентацией.
private void addRow(){
LinearLayout row
= new LinearLayout(
getApplicationContext()
);
row.setOrientation(LinearLayout.HORIZONTAL);
row.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
verticalLayout.addView(row);
}
Это создает TextView для добавления в указанную строку.
private void addTextViewToRow(int rowAtPosition){
TextView textView = new TextView(getApplicationContext());
textView.setText("StartLongTextaaaaaaaaaaaaaaaaaaaaaaaa" +
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" +
"ccccccccccccccccccccccccccccccLongTextEnd");
/**
* Third entry for params is for weight, so that you can
* decide how much space the cell will occupy in the row
* when there will be more than one view in the same row.
*/
LinearLayout.LayoutParams layoutParams
= new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT,
1f
);
/**
* setMargins e.g. between cells of the row and screen
* borders
*/
layoutParams.setMargins(25, 0, 25, 25);
textView.setLayoutParams(
layoutParams
);
LinearLayout view = (LinearLayout)
verticalLayout.getChildAt(rowAtPosition);
view.addView(textView);
}
}