如何通过代码(动态)将children添加到GridLayout?
How to add children to GridLayout through code (dynamically)?
在 GridLayout 内部我有 32 个非常相似的 FrameView,区别在于 ids(数字)
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/myFrame1">
<ImageView
android:id="@+id/myImg1"
android:layout_width="190dp"
android:layout_height="105dp"
android:layout_margin="4dp"
android:src="@drawable/myImg"
android:contentDescription="@string/station1" />
<TextView
android:id="@+id/descTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="4dp"
android:layout_marginBottom="34dp"
android:background="@android:color/transparent"
android:text="@string/Station 1"
android:textColor="@android:color/black"
android:textSize="16sp"
android:textStyle="bold"
android:layout_marginStart="4dp" />
</FrameLayout>
稍后我可能会添加更多文本视图,它开始变得相当混乱,所以我需要大致了解如何动态插入这种布局,最好是使用 Kotlin 语言。
我创建了一个完整的项目,我正在其中动态插入 frame
。
首先你必须创建布局frame_layout.xml
。在此布局中粘贴:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/myImg"
android:layout_width="190dp"
android:layout_height="105dp"
android:layout_margin="4dp"
android:contentDescription="station1"
android:src="@drawable/ic_launcher_foreground" />
<TextView
android:id="@+id/descTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginStart="4dp"
android:layout_marginLeft="4dp"
android:layout_marginBottom="34dp"
android:background="@android:color/transparent"
android:text="Station 1"
android:textColor="@android:color/black"
android:textSize="16sp"
android:textStyle="bold" />
</FrameLayout>
在activity布局中:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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"
tools:context=".MainActivity"
>
<androidx.gridlayout.widget.GridLayout
android:id="@+id/gridRoot"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:columnCount="2"
app:rowCount="32"
>
</androidx.gridlayout.widget.GridLayout>
</ScrollView>
和MainActivity.kt:
import android.os.Bundle
import android.widget.ScrollView
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.frame_layout.view.*
class MainActivity : AppCompatActivity()
{
override fun onCreate(savedInstanceState: Bundle?)
{
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
for (i in (1..32))// numbers of frames
{
val frame = ScrollView(this) // create frame
layoutInflater.inflate(R.layout.frame_layout, frame) // add layout to frame
frame.tag = i.toString() //add tag to enable finding specific frame at runtime
frame.descTextView.text = "Section $i" // change textView on frame ( use string resources! not hardcoded string like me)
gridRoot.addView(frame) // add frame to grid
}
}
}
结果:
如果工作正常您可以对其进行编辑,使其看起来像您想要的那样。
在 GridLayout 内部我有 32 个非常相似的 FrameView,区别在于 ids(数字)
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/myFrame1">
<ImageView
android:id="@+id/myImg1"
android:layout_width="190dp"
android:layout_height="105dp"
android:layout_margin="4dp"
android:src="@drawable/myImg"
android:contentDescription="@string/station1" />
<TextView
android:id="@+id/descTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="4dp"
android:layout_marginBottom="34dp"
android:background="@android:color/transparent"
android:text="@string/Station 1"
android:textColor="@android:color/black"
android:textSize="16sp"
android:textStyle="bold"
android:layout_marginStart="4dp" />
</FrameLayout>
稍后我可能会添加更多文本视图,它开始变得相当混乱,所以我需要大致了解如何动态插入这种布局,最好是使用 Kotlin 语言。
我创建了一个完整的项目,我正在其中动态插入 frame
。
首先你必须创建布局frame_layout.xml
。在此布局中粘贴:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/myImg"
android:layout_width="190dp"
android:layout_height="105dp"
android:layout_margin="4dp"
android:contentDescription="station1"
android:src="@drawable/ic_launcher_foreground" />
<TextView
android:id="@+id/descTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginStart="4dp"
android:layout_marginLeft="4dp"
android:layout_marginBottom="34dp"
android:background="@android:color/transparent"
android:text="Station 1"
android:textColor="@android:color/black"
android:textSize="16sp"
android:textStyle="bold" />
</FrameLayout>
在activity布局中:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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"
tools:context=".MainActivity"
>
<androidx.gridlayout.widget.GridLayout
android:id="@+id/gridRoot"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:columnCount="2"
app:rowCount="32"
>
</androidx.gridlayout.widget.GridLayout>
</ScrollView>
和MainActivity.kt:
import android.os.Bundle
import android.widget.ScrollView
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.frame_layout.view.*
class MainActivity : AppCompatActivity()
{
override fun onCreate(savedInstanceState: Bundle?)
{
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
for (i in (1..32))// numbers of frames
{
val frame = ScrollView(this) // create frame
layoutInflater.inflate(R.layout.frame_layout, frame) // add layout to frame
frame.tag = i.toString() //add tag to enable finding specific frame at runtime
frame.descTextView.text = "Section $i" // change textView on frame ( use string resources! not hardcoded string like me)
gridRoot.addView(frame) // add frame to grid
}
}
}
结果:
如果工作正常您可以对其进行编辑,使其看起来像您想要的那样。