如何动态更改每个片段的 TextView 和 ImageView 元素
How to change dynamically TextView and ImageView Elements for each Fragment
背景
我正在尝试通过一个函数填充片段的内容。片段列表根据所选的导航项而变化。
IE:我有 2 个导航项 ("Fruits,Animals"),我有 3 个类别,其中改变的是图像和描述,有点像这样:
NavButton>Fruits NavButton>Animals
Apple -> Image and description Alligator -> Image and description
Banana -> Image and description Bat -> Image and description
Cherry -> Image and description Cat -> Image and description
我没有创建 6 个片段布局和活动,而是创建了 3 个,想法是根据需要清除和设置 text/images。这样我就可以节省时间和内存,而不是为每个 activity 创建一个片段,因为唯一改变的是 textView 中的文本(已经在值中声明)和 imageView 中的图像(在可绘制部分)。
问题
我还没有找到更改 textView 或 ImageView 的 Imagesrc 的实现。我已经尝试了每个片段(这会导致 FC)。我还没有找到一种方法来为 drawable 做这件事
代码
填充选项卡的适配器代码
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
import android.support.v4.app.FragmentPagerAdapter
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import com.company.app.R.id.TextViewFragmentFirst
import com.company.app.R.layout.fragment_fragment_first
import com.company.app.fragments.FragmentFirst
import com.company.app.fragments.FragmentSecond
import kotlinx.android.synthetic.main.fragment_fragment_first.*
class CustomPageAdapter(FragManager:FragmentManager): FragmentPagerAdapter(FragManager) {
//var obj_FragManager = FragManager
var fragManagerItems:ArrayList<Fragment> = ArrayList()
var fragManagerTitles:ArrayList<String> = ArrayList()
var fragmentTxtContents:ArrayList<String> = ArrayList()
var fragmentImgObjs:ArrayList<Int> = ArrayList()
lateinit var textViewToChange:TextView
lateinit var imageViewToChange:ImageView
//findViewById(R.id.TextViewFragmentFirst) as TextView
fun removeFragments()
{
fragManagerItems.clear()
}
fun addFragments(fragmentItem:Fragment,fragmentTitle:String,fragmentTxtContent:String,fragmentImgObj:Int)
{
fragManagerItems.add(fragmentItem)
fragManagerTitles.add(fragmentTitle)
when (fragmentItem){
FragmentFirst()-> print("x == 1") //Here I would like to set textViewToChange & imageViewToChange
FragmentSecond()-> print("x == 2")//Here I would like to set textViewToChange & imageViewToChange
FragmentThird()-> print("x == 3")//Here I would like to set textViewToChange & imageViewToChange
else -> {
print("no valid fragment casted!")
}
}
textViewToChange!!.setText(fragmentTxtContent)
imageViewToChange!!.setImageResource(R.drawable.ic_iconapp) // Here it would need to be based on the fragmentImgObj
}
override fun getItem(position: Int): Fragment {
return fragManagerItems[position]
}
override fun getCount(): Int {
return fragManagerItems.size
}
override fun getPageTitle(position: Int): CharSequence {
return fragManagerTitles[position]
}
}
碎片是标准的,没有任何变化
class FragmentFirst : Fragment() {
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
// Inflate the layout for this fragment "
return inflater!!.inflate(R.layout.fragment_fragment_first, container, false)
}
使用的方法
1. 我尝试在 'return' 之前的片段 OnCreateView 中使用 import kotlinx.android.synthetic.main.fragment_fragment_first.*
以及 textviewID 和 setText 属性,但只会导致 FC。我想在适配器上执行此操作,但是,我什至没有找到一种方法来根据需要设置变量。
两件事。
- 考虑为每个片段使用一个公共接口,因为每个片段都有一个
image
和一个 description
,那么不会检测和选择 textViewToChange
或 imageViewToChange
有必要。
- 如果您要交换片段(删除一个片段并向视图添加另一个片段),则必须动态创建
Fragment
。删除和添加已在 XML 资源中定义的片段无法正常工作。
我找到了在主 activity 而不是适配器
上实施的解决方案
import kotlinx.android.synthetic.main.fragment_fragment_first.*
import kotlinx.android.synthetic.main.fragment_fragment_second.*
import kotlinx.android.synthetic.main.fragment_fragment_third.*
...
override fun onNavigationItemSelected(item: MenuItem): Boolean {
// Handle navigation view item clicks here.
objPageAdapter = CustomPageAdapter(supportFragmentManager)
when (item.itemId) {
R.id.nav_fruits -> {
objPageAdapter!!.removeFragments()
objPageAdapter!!.addFragments(FragmentFirst(),getString(R.string.txt_tab_fruits_Element_1))
objPageAdapter!!.addFragments(FragmentSecond(),getString(R.string.txt_tab_fruits_Element_2))
objPageAdapter!!.addFragments(FragmentThird(),getString(R.string.txt_tab_fruits_Element_3))
ViewPagerMain.adapter = objPageAdapter
TabLayoutMain.setupWithViewPager(ViewPagerMain)
this.textViewFragment_1.text = getString(R.string.txt_txtView_fruits_Element_1)
this.textViewFragment_2.text = getString(R.string.txt_txtView_fruits_Element_2)
this.textViewFragment_3.text = getString(R.string.txt_txtView_fruits_Element_3)
...
我假设您必须等到 tablayout 中的所有元素都已填充,并且由于尚未创建 XML,您不能在选项卡填充中间执行此操作。
背景
我正在尝试通过一个函数填充片段的内容。片段列表根据所选的导航项而变化。
IE:我有 2 个导航项 ("Fruits,Animals"),我有 3 个类别,其中改变的是图像和描述,有点像这样:
NavButton>Fruits NavButton>Animals
Apple -> Image and description Alligator -> Image and description
Banana -> Image and description Bat -> Image and description
Cherry -> Image and description Cat -> Image and description
我没有创建 6 个片段布局和活动,而是创建了 3 个,想法是根据需要清除和设置 text/images。这样我就可以节省时间和内存,而不是为每个 activity 创建一个片段,因为唯一改变的是 textView 中的文本(已经在值中声明)和 imageView 中的图像(在可绘制部分)。
问题
我还没有找到更改 textView 或 ImageView 的 Imagesrc 的实现。我已经尝试了每个片段(这会导致 FC)。我还没有找到一种方法来为 drawable 做这件事
代码
填充选项卡的适配器代码
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
import android.support.v4.app.FragmentPagerAdapter
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import com.company.app.R.id.TextViewFragmentFirst
import com.company.app.R.layout.fragment_fragment_first
import com.company.app.fragments.FragmentFirst
import com.company.app.fragments.FragmentSecond
import kotlinx.android.synthetic.main.fragment_fragment_first.*
class CustomPageAdapter(FragManager:FragmentManager): FragmentPagerAdapter(FragManager) {
//var obj_FragManager = FragManager
var fragManagerItems:ArrayList<Fragment> = ArrayList()
var fragManagerTitles:ArrayList<String> = ArrayList()
var fragmentTxtContents:ArrayList<String> = ArrayList()
var fragmentImgObjs:ArrayList<Int> = ArrayList()
lateinit var textViewToChange:TextView
lateinit var imageViewToChange:ImageView
//findViewById(R.id.TextViewFragmentFirst) as TextView
fun removeFragments()
{
fragManagerItems.clear()
}
fun addFragments(fragmentItem:Fragment,fragmentTitle:String,fragmentTxtContent:String,fragmentImgObj:Int)
{
fragManagerItems.add(fragmentItem)
fragManagerTitles.add(fragmentTitle)
when (fragmentItem){
FragmentFirst()-> print("x == 1") //Here I would like to set textViewToChange & imageViewToChange
FragmentSecond()-> print("x == 2")//Here I would like to set textViewToChange & imageViewToChange
FragmentThird()-> print("x == 3")//Here I would like to set textViewToChange & imageViewToChange
else -> {
print("no valid fragment casted!")
}
}
textViewToChange!!.setText(fragmentTxtContent)
imageViewToChange!!.setImageResource(R.drawable.ic_iconapp) // Here it would need to be based on the fragmentImgObj
}
override fun getItem(position: Int): Fragment {
return fragManagerItems[position]
}
override fun getCount(): Int {
return fragManagerItems.size
}
override fun getPageTitle(position: Int): CharSequence {
return fragManagerTitles[position]
}
}
碎片是标准的,没有任何变化
class FragmentFirst : Fragment() {
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
// Inflate the layout for this fragment "
return inflater!!.inflate(R.layout.fragment_fragment_first, container, false)
}
使用的方法
1. 我尝试在 'return' 之前的片段 OnCreateView 中使用 import kotlinx.android.synthetic.main.fragment_fragment_first.*
以及 textviewID 和 setText 属性,但只会导致 FC。我想在适配器上执行此操作,但是,我什至没有找到一种方法来根据需要设置变量。
两件事。
- 考虑为每个片段使用一个公共接口,因为每个片段都有一个
image
和一个description
,那么不会检测和选择textViewToChange
或imageViewToChange
有必要。 - 如果您要交换片段(删除一个片段并向视图添加另一个片段),则必须动态创建
Fragment
。删除和添加已在 XML 资源中定义的片段无法正常工作。
我找到了在主 activity 而不是适配器
上实施的解决方案import kotlinx.android.synthetic.main.fragment_fragment_first.*
import kotlinx.android.synthetic.main.fragment_fragment_second.*
import kotlinx.android.synthetic.main.fragment_fragment_third.*
...
override fun onNavigationItemSelected(item: MenuItem): Boolean {
// Handle navigation view item clicks here.
objPageAdapter = CustomPageAdapter(supportFragmentManager)
when (item.itemId) {
R.id.nav_fruits -> {
objPageAdapter!!.removeFragments()
objPageAdapter!!.addFragments(FragmentFirst(),getString(R.string.txt_tab_fruits_Element_1))
objPageAdapter!!.addFragments(FragmentSecond(),getString(R.string.txt_tab_fruits_Element_2))
objPageAdapter!!.addFragments(FragmentThird(),getString(R.string.txt_tab_fruits_Element_3))
ViewPagerMain.adapter = objPageAdapter
TabLayoutMain.setupWithViewPager(ViewPagerMain)
this.textViewFragment_1.text = getString(R.string.txt_txtView_fruits_Element_1)
this.textViewFragment_2.text = getString(R.string.txt_txtView_fruits_Element_2)
this.textViewFragment_3.text = getString(R.string.txt_txtView_fruits_Element_3)
...
我假设您必须等到 tablayout 中的所有元素都已填充,并且由于尚未创建 XML,您不能在选项卡填充中间执行此操作。