android - 片段为空白,但生命周期工作正常
问题描述
我正在开发应用程序,它在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>
解决方案
推荐阅读
- typescript - 与记录的交集类型
不允许财产访问 - javascript - 如何在js中以utc格式从不同时区获取日期对象
- python-3.x - 在 Pyhton 的 OOP 中,一个类的方法如何访问另一个类的方法?
- ruby-on-rails - 未找到 rakefile(msfdb 初始化)
- java - Jackson ObjectMapper - 如何在从远程响应反序列化后值为假时排除字段?
- python - Pandas/Numpy 版本问题 - ValueError: numpy.ndarray size changed,可能表示二进制不兼容
- python - 如何用pygame处理重叠文本
- php - 如何在laravel上的django中打印一些类似的打印
- r - 如何从命令行执行 R 闪亮脚本
- amazon-web-services - 使用 makefile 和 cloudformation 创建图层