Раздуть TableRow и ad в существующую таблицу

#android #xamarin #xamarin.android #tablerow

#Android #xamarin #xamarin.android #tablerow

Вопрос:

Я хочу добавить динамическое количество строк в a TableLayout . Мой исходный код определил таблицу в .axml файле и все 32 строки. Сами строки были довольно сложными, ImageView а затем еще один встроенный макет таблицы.

Затем меня попросили добавить в таблицу еще 10 строк, и я подумал, что должен быть лучший способ, а не 42 одинаково расположенных строки таблицы .axml , и посмотрел на то, чтобы сделать ее более управляемой данными, чтобы я мог расширить таблицу позже, если это необходимо.

Моей первоначальной мыслью было создать .axml файл только с TableRow определением, а затем в цикле кода перебирать мои данные и раздувать строку из .axml и добавлять в представление. Похоже, моя проблема связана с самим .axml файлом. Начало моего файла

     <?xml version="1.0" encoding="utf-8"?>

    <TableRow
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="5dp">
        
        <ImageView
            android:id="@ id/ivSign"
            android:src="@drawable/sign_menatwork"
            android:layout_column="0"
            android:layout_width="wrap_content"
            android:layout_height="72dp"
            android:contentDescription="Men at Work" />
 

Однако это не работает, поскольку компилятору не удается его скомпилировать (ошибка не указывает, что не удалось скомпилировать). Я добавил a LinearLayout вокруг TableRow , но это не помогло.

Могу ли я определить TableRow таким образом, или мне лучше всего преобразовать в a Grid ?

Ответ №1:

Я хочу добавить динамическое количество строк в табличное описание.

Добавляя TableRow в TableLayout динамически, вы можете взглянуть:

 <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" 
android:id="@ id/tableLayout1" 
android:stretchColumns="*">
</TableLayout>

TableLayout tablelayout1;
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.activity_main);
        tablelayout1 = FindViewById<TableLayout>(Resource.Id.tableLayout1);
        tablerow();
    }

    void  tablerow()
    {
        for(int i=0;i<10;i  )
        {
            TableLayout.LayoutParams layoutParams = new TableLayout.LayoutParams(LayoutParams.MatchParent, LayoutParams.WrapContent);
            TableRow.LayoutParams layoutParams2 = new TableRow.LayoutParams(LayoutParams.MatchParent, LayoutParams.WrapContent);

            TextView date = new TextView(this);

            //Use TableRow
            date.LayoutParameters = layoutParams2;

            date.SetBackgroundColor(Color.ParseColor("#FFFFC0"));
            date.SetTextSize(Android.Util.ComplexUnitType.Px, (float)30.0);
            date.SetTextColor(Color.Black);
            date.Text = "date";
            date.SetPadding(5, 5, 5, 5);

            TextView name = new TextView(this);

            //Use TableRow
            name.LayoutParameters = layoutParams2;

            name.SetBackgroundColor(Color.ParseColor("#FFFFC0"));
            name.SetTextColor(Color.Black);
            name.SetTextSize(Android.Util.ComplexUnitType.Px, (float)30.0);
            name.Text = "title";
            name.SetPadding(5, 5, 5, 5);
            TableRow tr = new TableRow(this);

            //Use TableLayout
            tr.LayoutParameters = layoutParams;
          
            tr.AddView(date);
            tr.AddView(name);
            tablelayout1.AddView(tr, i);
        }
    }
 

Обновить:

Сначала создайте новую layout.xml , просто только TableRow.

 <?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="match_parent">
  <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_column="1"
        android:text="Open..."
        android:padding="3dip"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Ctrl-O"
        android:gravity="right"
        android:padding="3dip"/>
</TableRow>
 

Затем раздуть TableRow.

  void  tablerow()
    {
        LayoutInflater layoutInflater = (LayoutInflater)GetSystemService(LayoutInflaterService);
       
        TableRow tableRow = (TableRow)layoutInflater.Inflate(Resource.Layout.layout1, null);
      
        tablelayout1.AddView(tableRow);
       
    }

 TableLayout tablelayout1;
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.activity_main);
        tablelayout1 = FindViewById<TableLayout>(Resource.Id.tableLayout1);
        tablerow();
    }
 

Комментарии:

1. Спасибо — у меня уже есть что-то очень похожее, но поскольку мой TableRow сам по себе имеет довольно сложную структуру, я хотел определить TableRow в файле .axml, а затем раздуть .axml для каждой строки и добавить в таблицу. Кажется, что вы не можете определить один TableRow в файле .axml, а затем раздуть его как представление — .axml выдает ошибки, как указано выше

2. @user1169502 Вы имеете в виду, что вы просто хотите добавить TableRow в XML-файл, никаких других элементов управления, а затем добавить этот XML-файл в TableLayout с помощью кода?

3. Точно — я не знаю, сколько строк таблицы мне нужно, но формат строки таблицы одинаков для всех строк, но довольно сложный. Просто имеет смысл иметь TableRow в файле .axml, а затем раздувать каждую строку перед добавлением в таблицу.

4. @user1169502 Я нахожу один способ сделать это, пожалуйста, взгляните на мое обновление.