首页 > 解决方案 > 片段为空白,但生命周期工作正常

问题描述

我正在开发应用程序,它在socket listener上扩展了一个复杂的 UI 元素。同样的 UI 元素也会在不同的网络回调中被夸大。这个 UI 元素包括 tabLayout 和 viewPager(带有 3 个不同的片段),我为这两个用例重用了布局。这在触发网络回调时完美运行,但是当它通过套接字侦听器触发时,UI 元素被膨胀,tabLayout 工作正常,但 viewPager 中的片段是空白的。我记录了所有片段生命周期函数并且它运行正常。但片段是空白的。

由于 UI 元素是在回调中触发的,但 UI 的膨胀需要 UI 线程,因此我使用了 runOnUiThread 块,它在触发网络回调时完美运行,但它不适用于套接字侦听器。

我还尝试了 requestLayout() 并在触发所需的 UI 元素后断开套接字,以便在 UI 线程上推送更改,但它没有用。

主要片段

// Views
var view1: View? = null
var v: View? = null
var inflater2: LayoutInflater? = null
lateinit val llvar: LinearLayout
lateinit val scroll: LinearLayout

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

// Inflating the fragment
inflater2 = inflater
v = inflater.inflate(R.layout.fragment_first, container, false)

// Initiating the views
llvar = v!!.findViewById(R.id.lllllayout)
scroll = v!!.findViewById(R.id.scrollview123)

// Fetching previous data
getPreviousData()

// Setting up the token string to the chatRoom
val topic = "ghostroom:$token"
val socketroom = socket.channel(topic)

socketroom.join()

// Listener of Socket on channel "Rivi Reply"
chatroom.on("mydataroom") {

     // Handling payload and converting into usable data
     val payload = it.payload
     val obj = JSONObject(payload)
     val suc = obj.getJSONArray("data")
     if(suc("type").equals(REQUIRED_DATA) {

           activity!!.runOnUiThread {

              inflateData()

          }

     }

}

// Returning the whole view "v"
return v

}


fun getPreviousData() {

    // Preparing the data for accessing the History API
    val data = JSONObject("""{"page_no":1""".trimMargin())

    // API base url
    val URL_ROOT = "https:SOME_URL"

    // API end ponit
    val login = "$URL_ROOT/END_POINT"

    // Volley request in action
    val stringRequest = object : JsonObjectRequest(login, data,

        Response.Listener<JSONObject> { response ->

            try {

                // Fetching response from the listner
                val obj = response

                // Required data
                val suc = obj.getJSONArray("data")


                // Fetching JSONObject from the response data
                var e: JSONObject

                var messages = arrayListOf<JSONObject>()

                // Adding data to the chat screen
                for (i in 0 until suc.length()) {

                    // Fetching JSON Object from each response
                    e = suc.getJSONObject(i)

                    // Adding the messages to arrayList
                    messages.add(e)

                }

                activity!!.runOnUiThread {

                    page++

                    for(data in messages) {
                        if(data.getString("type").equals(REQUIRED_DATA) {

                            inflateData()

                       }

                    }

                }


            } catch (e: JSONException) {

                e.printStackTrace()

            }

        },

        Response.ErrorListener { volleyError ->

            try {

                val error = VolleyError(String(volleyError.networkResponse.data))

                Log.d("History API error", error)

                eof = 1

            } catch (e: Exception) {

            }
        }

    ) {


        @Throws(AuthFailureError::class)
        override fun getHeaders(): Map<String, String> {


            val headers = HashMap<String, String>()
            val token = "Bearer $headertoken"


            Log.d("Bearer", token)


            headers["Authorization"] = token
            headers["Content-Type"] = "application/json"


            return headers


        }

    }

    //adding request to queue
    stringRequest.setShouldCache(false)
    VolleySingleton.instance?.addToRequestQueue(stringRequest)

}


// Function to inflate and manage the getFlights of layout
private fun inflateData() {

    try {

        // Inflating flight card
        try {

            // Inflating flight card
            val dataCard = inflater2!!.inflate(R.layout.flight_card, llvar, false)
            val tabs = dataCard <TabLayout>(R.id.tabs_main2)
            val DataViewPager = dataCard.findViewById<ViewPager>(R.id.viewpager_main2)
            val DataAdapter = GetDataAdapter(childFragmentManager)

            // Initiating the Adapter and viewPager
            DataViewPager.adapter = DataAdapter
            DataViewPager.offscreenPageLimit = 3
            tabs.setupWithViewPager(DataViewPager)


            // Adding tabSelectListener
            tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {

                override fun onTabReselected(p0: TabLayout.Tab?) {
                }

                override fun onTabUnselected(p0: TabLayout.Tab?) {
                }

                override fun onTabSelected(tab: TabLayout.Tab) {
                    DataViewPager.currentItem = tab.position
                }

            })

            // Adding the UI to layout
            llvar.addView(dataCard,0)

        } catch (e: java.lang.Exception) {

            // Logging error
            Log.e("Data Card error?", e.message)

        }

    } catch (e: Exception) {

        Log.e("Data block error", e.message)

    }

}

获取数据适配器

class GetDataAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) {

override fun getItem(position: Int): Fragment {
    return when (position) {

        0 -> {
            GetDataFragment1()
        }

        1 -> {
            GetDataFragment2()
        }

        else->{
            GetDataFragment3()
        }
    }
}

override fun getCount(): Int {
    return 3
}

override fun getPageTitle(position: Int): CharSequence {
    return when (position) {
        0 -> "Chat"
        1 -> "Test"
        else -> {
            return "Trip"
        }
    }
}

}

flight_card 布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical">

<com.google.android.material.tabs.TabLayout
    android:id="@+id/tabs_main2"
    android:layout_width="match_parent"
    android:layout_height="30dp"
    app:tabGravity="fill"
    android:background="#F4F4F4"
    android:layout_gravity="center_horizontal"
    app:tabMode="fixed"/>

<androidx.viewpager.widget.ViewPager
    android:background="@color/white"
    android:id="@+id/viewpager_main2"
    android:layout_width="match_parent"
    android:layout_height="310dp"/>

<LinearLayout
    android:background="@color/GreyForm"
    android:layout_width="match_parent"
    android:layout_height="1dp"/>
</LinearLayout>

标签: androidsocketsandroid-fragmentskotlinandroid-viewpager

解决方案


推荐阅读