【问题标题】:Problem getting one of my fragments from SupportFragmentManager从 SupportFragmentManager 获取我的片段之一时出现问题
【发布时间】:2019-05-16 04:22:37
【问题描述】:

我的 MainActivity 中有这个方法:

private fun ObtenerFragmentos() {

 var event1:Event_1? =null
 var event2:Event_2? =null
 var event3: Event_3? =null

     for(fragment: Fragment in supportFragmentManager.fragments){

         if (fragment is Event_1) event1 = fragment
         if(fragment is Event_2) event2 = fragment
         if(fragment is Event_3) event3 = fragment

     }

    }

问题是 event3 它始终为 null 并且 supportFragmentManager.fragments.size 总是得到 2 个片段,但是当我运行 apk 时,我可以看到这三个片段并与之交互。

我的课程和 xml:

activity_main3.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:theme="@style/AppTheme1" >

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/mViewPager"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        >
    <com.google.android.material.tabs.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/toolbar_event"
        android:background="?attr/colorPrimary"
        android:elevation="6dp"
        android:minHeight="?attr/actionBarSize"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:tabIndicatorColor="@color/colorblanco"
        app:tabMode="scrollable"
        app:tabSelectedTextColor="@color/colorblanco" />
    </androidx.viewpager.widget.ViewPager>
</RelativeLayout>

MainActivity.kt

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main3)

        viewpageradapter = ViewPageAdapter(supportFragmentManager)
        mViewPager.adapter = viewpageradapter  
        tab_layout.setupWithViewPager(mViewPager)
        tab_layout.getTabAt(0)!!.setIcon(R.drawable.ic_datos_generales)
        tab_layout.getTabAt(1)!!.setIcon(R.drawable.ic_repeat)
        tab_layout.getTabAt(2)!!.setIcon(R.drawable.ic_relaciones)

}

这是 ViewPageAdapter 类:

class ViewPageAdapter(fm: androidx.fragment.app.FragmentManager) : androidx.fragment.app.FragmentPagerAdapter(fm) {

    override fun getItem(position: Int): androidx.fragment.app.Fragment {
        var fragment: androidx.fragment.app.Fragment? = null
        when (position) {
            0 -> fragment = Event_1()
            1 -> fragment = Event_2()
            2 -> fragment = Event_3()
        }
        return fragment!!
    }

    override fun getCount(): Int {
        return 3
    }

    override fun getPageTitle(position: Int): CharSequence? {
        var title: String? = null
        if (position == 0) {
            title = "Datos Generales"
        } else if (position == 1) {
            title = "Repeticiones"
        } else if (position == 2) {
            title = "Relaciones"
        }
        return title
    }
}

而三个片段的代码分别是:

事件_1:

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

        val viewo: View? = inflater.inflate(R.layout.fragment_datos_generales, container, false)


        return viewo
    }

事件_2:

 override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view: View? = inflater.inflate(R.layout.fragment_repeticiones, container, false)
        return view
    }

Event_3:

 override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view: View? = inflater.inflate(R.layout.fragment_relaciones, container, false)
        return view
    }

请大家帮帮我!!对不起我的英语

【问题讨论】:

  • 你确定你在任何地方都使用了正确的androidx.fragment.app.Fragment吗?
  • @sanjeev 是的,无处不在
  • 也许尝试从片段管理器中检索片段并不是最好的方法。请注意,您在调用 getItem() 时创建了每个片段的新实例 - 您可能会存储每个片段的实例,然后从此处返回预先创建的实例。这样您就可以从活动中访问每个片段(通过适配器)。顺便说一句,您从哪里调用 ObtenerFragmentos() 函数 - 例如,在查看选项卡 3 时调用的结果是否相同?
  • @ChrisShaw 谢谢,你能告诉我一个方法吗?

标签: android android-fragments kotlin fragmentmanager


【解决方案1】:

您可以在适配器中将片段设为静态,然后直接从主 Activity 访问它们,而无需尝试从片段管理器中提取它们。

例如,如下改变适配器的顶部。

class ViewPageAdapter(fm: androidx.fragment.app.FragmentManager) : androidx.fragment.app.FragmentPagerAdapter(fm) {

  public var event1 = Event_1()
  public var event2 = Event_2()
  public var event3 = Event_3()

  override fun getItem(position: Int): androidx.fragment.app.Fragment? {
      return when (position) {
          0 -> event1
          1 -> event2
          2 -> event3
          else -> null
      }
  }
...

然后您可以从主要活动中使用(例如)

viewpageradapter.event1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多