【问题标题】:How to change dynamically TextView and ImageView Elements for each Fragment如何动态更改每个 Fragment 的 TextView 和 ImageView 元素
【发布时间】:2018-04-01 02:15:30
【问题描述】:

背景
我正在尝试通过一个函数填充片段的内容。片段列表根据选定的导航项而变化。
IE:我有两个导航项(“水果,动物”),我有 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 个,其想法是根据需要清除和设置文本/图像。这样,当唯一更改的是 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. 我尝试在“返回”之前使用import kotlinx.android.synthetic.main.fragment_fragment_first.* 以及片段 OnCreateView 中的 textviewID 和 setText 属性,但只会导致 FC。我想在适配器上执行此操作,但是,我还没有找到一种方法来根据需要设置变量。

【问题讨论】:

    标签: android android-fragments kotlin android-tablayout


    【解决方案1】:

    两件事。

    1. 考虑为每个片段使用一个通用接口,因为每个片段都有一个image 和一个description,那么就不需要检测和选择textViewToChangeimageViewToChange
    2. 如果要换出片段(删除一个片段并将另一个片段添加到视图),则必须动态创建Fragment。删除和添加已在 XML 资源中定义的片段无法正常工作。

    【讨论】:

      【解决方案2】:

      我发现解决方案是在主要活动而不是适配器上实现它

      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)
                  ...
      

      我假设您必须等到选项卡布局中的所有元素都已填充,并且您不能在选项卡填充中间执行此操作,因为尚未创建 XML。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-12
        相关资源
        最近更新 更多